为什么代码在创建 excel 文件时包含错误并想要使用它

Why the code contains error when creating excel file and want to work with it

提问人:user22728505 提问时间:10/12/2023 最后编辑:user22728505 更新时间:10/13/2023 访问量:99

问:

条目是:

创建具有以下要求的 C# 代码:

我们有 3 张具有以下名称的表:(记录、consumption_kardex、tool_lists)。代码在启动时会要求提供两个值,第一个值用于“部件号”,第二个值用于“操作”。用户输入这两个值后,代码会根据第一个值过滤记录表中的“I”列。然后它将根据第二个值过滤列“E”。接下来,它将计算记录表中 F 列和 G 列中所有值的总和(该总和将在应用 I 和 E 列过滤器后计算)。此值将写入第四张工作表 A 列,该列将创建名为“比较.xlsx”。

然后,代码将根据用户输入的第一个值(部件号)筛选tool_lists表中的 A 列。在tool_lists工作表中,代码将把列 D 和 E (D * E) 相乘,并将此乘法的所有结果相加为一个结果。此结果将写入名为 comparison 的第四张工作表中的 B 列。

接下来,在tool_lists工作表中,我们将在 A 列中再次使用筛选,我们将从第 2 行中获取 B 列中的值,并在consumption_kardex工作表中使用它们过滤 B 列。然后,在过滤后的consumption_kardex表中,我们将计算 C 列中值的总和,并将它们写入 C 列中的第四张比较表。

错误在第 17 行,代码如下:

using System.IO;
using Microsoft.Office.Interop.Excel;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Získáme vstupní hodnoty od uživatele
            Console.WriteLine("Zadejte číslo dílce:");
            string cisloDilc = Console.ReadLine();
            Console.WriteLine("Zadejte operaci:");
            string operace = Console.ReadLine();

            // Vytvoříme nový sešit s názvem "srovnani.xlsx"
            Workbook workbook = new Workbook();
            workbook.SaveAs("srovnani.xlsx");

            // Vytvoříme instanci třídy Worksheet pro každý sešit
            Worksheet worksheet1 = workbook.Worksheets["zaznamy"];
            Worksheet worksheet2 = workbook.Worksheets["nastrojove_listy"];
            Worksheet worksheet3 = workbook.Worksheets["spotreba_kardex"];

            // Vyfiltrujeme sloupec "I" v tabulce "zaznamy" podle hodnoty "cisloDilc"
            worksheet1.Range["I1:I"].AutoFilter(cisloDilc);

            // Vyfiltrujeme sloupec "E" v tabulce "zaznamy" podle hodnoty "operace"
            worksheet1.Range["E1:E"].AutoFilter(operace);

            // Vypočítáme součet hodnot ze sloupců "F" a "G" v tabulce "zaznamy"
            int soucet = 0;
            for (int i = 1; i <= worksheet1.UsedRange.Rows.Count; i++)
            {
                soucet += Convert.ToInt32(worksheet1.Cells[i, 6].Value) + Convert.ToInt32(worksheet1.Cells[i, 7].Value);
            }

            // Zapíšeme součet do sloupce "A" v tabulce "srovnani"
            worksheet2.Cells[1, 1].Value = soucet;

            // Vyfiltrujeme sloupec "A" v tabulce "nastrojove_listy" podle hodnoty "cisloDilc"
            worksheet2.Range["A1:A"].AutoFilter(cisloDilc);

            // Vypočítáme součet hodnot ze sloupců "D" a "E" v tabulce "nastrojove_listy"
            soucet = 0;
            for (int i = 1; i <= worksheet2.UsedRange.Rows.Count; i++)
            {
                soucet += Convert.ToInt32(worksheet2.Cells[i, 4].Value) * Convert.ToInt32(worksheet2.Cells[i, 5].Value);
            }

            // Zapíšeme součet do sloupce "B" v tabulce "srovnani"
            worksheet3.Cells[1, 2].Value = soucet;

            // Vyfiltrujeme sloupec "B" v tabulce "nastrojove_listy" od řádku 2
            worksheet2.Range["B2:B"].AutoFilter(cisloDilc);

            // Vyfiltrujeme sloupec "B" v tabulce "spotreba_kardex" podle hodnot ze sloupce "B" v tabulce "nastrojove_listy"
            worksheet3.Range["B1:B"].AutoFilter(worksheet2.Range["B2:B"]);

            // Vypočítáme součet hodnot ze sloupce "C" v tabulce "spotreba_kardex"
            soucet = 0;
            for (int i = 1; i <= worksheet3.UsedRange.Rows.Count; i++)
            {
                soucet += Convert.ToInt32(worksheet3.Cells[i, 2].Value);
            }

            // Zapíšeme součet do sloupce "C" v tabulce "srovnani"
            worksheet3.Cells[1, 3].Value = soucet;

            // Uložíme sešit "srovnani.xlsx"
            workbook.Save();

            Console.WriteLine("Srovnání dokončeno.");
        }
    }
}

非常感谢您的帮助。

我试图创建 excel 文件,但我发现它会毫无问题地创建。

错误:

System.Runtime.InteropServices.COMException: Retrieving the COM class factory for component with CLSID {00020819-0000-0000-C000-000000000046} failed due to the following error: 80040154 Třída není zaregistrována (0x80040154 (REGDB_E_CLASSNOTREG)).

在以下行:

Workbook workbook = new Workbook();

也许我的 VS2022 设置错误。

编辑 13.10.2023

这是我现在的代码:

using System.IO;
using Microsoft.Office.Interop.Excel;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main(string[] args)
        {

            // Získáme vstupní hodnoty od uživatele
            Console.WriteLine("Zadejte číslo dílce:");
            string cisloDilc = Console.ReadLine();
            Console.WriteLine("Zadejte operaci:");
            string operace = Console.ReadLine();

            // Vytvoříme nový sešit s názvem "srovnani.xlsx"
            var oXL = new Microsoft.Office.Interop.Excel.Application();
            if (File.Exists("C:\\Users\\11uadber\\Desktop\\appvs\\srovnani.xlsx"))
            {
                File.Delete("C:\\Users\\11uadber\\Desktop\\appvs\\srovnani.xlsx");
            }
            var workbook = oXL.Workbooks.Add();
            workbook.SaveAs("C:\\Users\\11uadber\\Desktop\\appvs\\srovnani.xlsx");

            // Vytvoříme instanci třídy Worksheet pro každý sešit
            Worksheet worksheet1 = workbook.Worksheets["C:\\Users\\11uadber\\Desktop\\appvs\\zaznamy.xls"];
            Worksheet worksheet2 = workbook.Worksheets["C:\\Users\\11uadber\\Desktop\\appvs\\nastrojove_listy.xlsx"];
            Worksheet worksheet3 = workbook.Worksheets["C:\\Users\\11uadber\\Desktop\\appvs\\spotreba_kardex.xlsx"];

            // Vyfiltrujeme sloupec "I" v tabulce "zaznamy" podle hodnoty "cisloDilc"
            worksheet1.Range["I1:I"].AutoFilter(cisloDilc);

            // Vyfiltrujeme sloupec "E" v tabulce "zaznamy" podle hodnoty "operace"
            worksheet1.Range["E1:E"].AutoFilter(operace);

            // Vypočítáme součet hodnot ze sloupců "F" a "G" v tabulce "zaznamy"
            int soucet = 0;
            for (int i = 1; i <= worksheet1.UsedRange.Rows.Count; i++)
            {
                soucet += Convert.ToInt32(worksheet1.Cells[i, 6].Value) + Convert.ToInt32(worksheet1.Cells[i, 7].Value);
            }

            // Zapíšeme součet do sloupce "A" v tabulce "srovnani"
            worksheet2.Cells[1, 1].Value = soucet;

            // Vyfiltrujeme sloupec "A" v tabulce "nastrojove_listy" podle hodnoty "cisloDilc"
            worksheet2.Range["A1:A"].AutoFilter(cisloDilc);

            // Vypočítáme součet hodnot ze sloupců "D" a "E" v tabulce "nastrojove_listy"
            soucet = 0;
            for (int i = 1; i <= worksheet2.UsedRange.Rows.Count; i++)
            {
                soucet += Convert.ToInt32(worksheet2.Cells[i, 4].Value) * Convert.ToInt32(worksheet2.Cells[i, 5].Value);
            }

            // Zapíšeme součet do sloupce "B" v tabulce "srovnani"
            worksheet3.Cells[1, 2].Value = soucet;

            // Vyfiltrujeme sloupec "B" v tabulce "nastrojove_listy" od řádku 2
            worksheet2.Range["B2:B"].AutoFilter(cisloDilc);

            // Vyfiltrujeme sloupec "B" v tabulce "spotreba_kardex" podle hodnot ze sloupce "B" v tabulce "nastrojove_listy"
            worksheet3.Range["B1:B"].AutoFilter(worksheet2.Range["B2:B"]);

            // Vypočítáme součet hodnot ze sloupce "C" v tabulce "spotreba_kardex"
            soucet = 0;
            for (int i = 1; i <= worksheet3.UsedRange.Rows.Count; i++)
            {
                soucet += Convert.ToInt32(worksheet3.Cells[i, 2].Value);
            }

            // Zapíšeme součet do sloupce "C" v tabulce "srovnani"
            worksheet3.Cells[1, 3].Value = soucet;

            // Uložíme sešit "srovnani.xlsx"
            workbook.Save();

            Console.WriteLine("Srovnání dokončeno.");
        }
    }
}

现在问题出在这条线上:

Worksheet worksheet1 = workbook.Worksheets["C:\\Users\\11uadber\\Desktop\\appvs\\zaznamy.xls"];

错误代码:

System.Runtime.InteropServices.COMException: Neplatný index. (0x8002000B (DISP_E_BADINDEX))

编辑 13.10.2023 14:55

现在我在这一行上出现错误:

worksheet1.Range["I1:I"].AutoFilter(cisloDilce);

System.Runtime.InteropServices.COMException: 0x800A03EC
C# Excel 比较 筛选 变量赋值

评论

0赞 Crowcoder 10/12/2023
请编辑您的问题以包含错误详细信息。
0赞 rotabor 10/12/2023
你安装了 Excel 库吗?或者你安装了 Excel?
0赞 user22728505 10/12/2023
我已经excel了。

答:

1赞 rotabor 10/12/2023 #1

首先,您需要获取Excel应用程序:

using System.IO;
using Microsoft.Office.Interop.Excel;

namespace ConsoleApp1
{
    class Program
    {
        public static void Main(string[] args)
        {
            // Získáme vstupní hodnoty od uživatele
            Console.WriteLine("Zadejte číslo dílce:");
            string cisloDilc = Console.ReadLine();
            Console.WriteLine("Zadejte operaci:");
            string operace = Console.ReadLine();

            // Vytvoříme nový sešit s názvem "srovnani.xlsx"
            var oXL = new Microsoft.Office.Interop.Excel.Application();
            var workbook = oXL.Workbooks.Add();
            workbook.SaveAs("srovnani.xlsx");
            ...

增编一

            var wb1 = oXL.Workbooks.Open("C:\\Users\\11uadber\\Desktop\\appvs\\zaznamy.xls")
            var worksheet1 = wb1.Worksheets["Prostěradlo1"];

使用所需的工作表名称或索引,而不是“Prostěradlo1”虚拟人。

评论

0赞 user22728505 10/12/2023
我不明白这一点。
0赞 DS_London 10/12/2023
@user22728505 基本上,你不能只创建一个对象。您首先需要创建一个 Excel Application 对象,然后使用该对象创建新工作簿,如答案所示。您得到的错误是因为,虽然对象具有 COM 接口,但您不能直接创建一个(从技术上讲,它没有自己的类工厂)。WorkbookWorkbook
0赞 user22728505 10/12/2023
你能编辑我的代码吗?我不可能做到......
0赞 rotabor 10/12/2023
为您修改。
0赞 user22728505 10/13/2023
谢谢你,它的工作,我会继续告诉你。