C# 在C中使用互操作读取大型excel工作表

C# 在C中使用互操作读取大型excel工作表,c#,excel,excel-interop,C#,Excel,Excel Interop,我知道我的问题似乎很普通。在这个论坛上有很多知识可以分享。但我无法为我的特殊需求找到解决方案 在我的例子中,我有一个excel workbookver 2016包含10张图纸,每张图纸上有1500行。每页中的列数可能从15到20不等。我想读取所有工作表中的所有数据,验证它们的数据类型,并将其插入sql server数据库表中 但我试过用两张每张100行的纸 Excel.Worksheet ofWs; Excel.Range range; ofWs = (Excel.Worksheet)ofShe

我知道我的问题似乎很普通。在这个论坛上有很多知识可以分享。但我无法为我的特殊需求找到解决方案

在我的例子中,我有一个excel workbookver 2016包含10张图纸,每张图纸上有1500行。每页中的列数可能从15到20不等。我想读取所有工作表中的所有数据,验证它们的数据类型,并将其插入sql server数据库表中

但我试过用两张每张100行的纸

Excel.Worksheet ofWs;
Excel.Range range;
ofWs = (Excel.Worksheet)ofShe.get_Item("Sales");
range = ofWs.UsedRange;
for (int i = 2; i <= range.Rows.Count; i++)
{
    string var1 = "";
    double var2 = 0;

    //validation for column1
    if ((ofWs.Cells[i, 1] as Excel.Range).Value2 != null)
    {
        if ((ofWs.Cells[i, 1] as Excel.Range).Value2.GetType().ToString() == "System.String")
            var1 = (string)(ofWs.Cells[i, 1] as Excel.Range).Value2;
        else
        {
            sale_comm_column += "COLUMN A, ";
            sale_errFlag = false;
        }
    }
    else
    {
        sale_comm_column += "COLUMN A, ";
        sale_errFlag = false;
    }

    //validation for column2
    if ((ofWs.Cells[i, 2] as Excel.Range).Value2 != null)
    {
        if ((ofWs.Cells[i, 2] as Excel.Range).Value2.GetType().ToString() == "System.Double")
            var2 = (double)(ofWs.Cells[i, 2] as Excel.Range).Value2;
        else
        {
            sale_comm_column += "COLUMN B, ";
            sale_errFlag = false;
        }
    }
    else
    {
        sale_comm_column += "COLUMN B, ";
        sale_errFlag = false;
    }

}

这个for循环将遍历所有行,我正在验证if语句中的每一列。这里我只展示了第1页2列的验证部分。对于100行本身来说,这花费了太多的时间。然而,如果我删除所有这些if,它所花费的时间就更少了。如果我想在我实际需要的10张纸上试一下,每张纸1500行,最好的方法是什么???

这主要是一个速度问题,因此值得一读。你可以跳过第一部分

在数据库中保留数据库操作

当您将这些东西插入数据库时,您应该在数据库中这样做。每一个值得拥有磁盘空间的DBMS都可以选择进行批量插入。在客户机中这样做是不可能打败它的。这只会增加通过网络传输数据的需要

CSV支持是有保证的,Excel格式非常常见。如果不需要格式化和键入提示,您可以将Excel文件另存为CSV。然而,您可能需要进行一些解析

OpenXML与Office互操作

在.NET中使用Office格式有3个选项:

如果您只需要新的.xlsx格式,请使用。或者人们在它周围做的任何包装。甚至只是ZipArchive和XMLReader类——它是开放格式的,基于在.zip容器中有一堆XML文件。 如果还需要支持旧格式.xls,则必须使用可靠的Office互操作。除了需要安装程序和需要一个交互式会话外,它具有COM互操作的所有常见问题。这意味着它不能从服务运行,包括大多数Web服务器。 对于任何给定的问题、任何给定的语言和任何给定的格式,都可能有第三种方法。但这些都是极为罕见的。如果DBMS可用,我甚至会用这种方式来计算。
虽然我没有做过任何测量,但我愿意打赌OpenXML在速度上胜过OfficeInterop。一种是通过XML解析和Zip文件解压缩来执行基本的文件操作。另一个是COM互操作和远程处理工作的不可见Office实例的开销。谁能在速度上获胜甚至都不是问题。唯一的问题是它是否足够快。

您的方法会花费很多时间,因为每次更新单元格时,都会对excel实例进行RPC调用

考虑到您的excel文件格式是.xlsx

我向你推荐如下: 如果使用Hex editor打开excel文件,您会注意到文件签名是PKzip文件格式,这意味着它基本上是压缩的XML文件。 解压缩excel文件,然后在“\xl\worksheets”文件夹中,您将看到“sheet[1~10].xml”文件 编写读取/验证XML文件并将其插入数据库的代码。
上述过程很容易实现自动化,并且应该比使用excel interop快得多。

文件格式是:.xls还是.xlsx?后者可以在不使用可靠的Office COM互操作的情况下进行处理,这一点要好得多。Value2是文本比较,应使用字符串。Empty@Christopher,版本是.xlsxExcel 2016..@jdweng,你的意思是,无论哪里有Value2,只要用Value替换它就行了???而我无法得到应该使用的字符串。Empty@jdweng,我尝试用Value替换Value2。这会花费太多时间来读取和验证100行22列的每个单元格。