Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按范围阅读Excel表格_C#_Excel_Npoi - Fatal编程技术网

C# 按范围阅读Excel表格

C# 按范围阅读Excel表格,c#,excel,npoi,C#,Excel,Npoi,我们需要根据一定的范围读取excel表格数据,并将其存储到数据库中。 我们的excel工作表包含1807列541行,所以我们不能使用Datatable将数据存储到其中。 此外,我们还需要检查每个单元格的excel工作表,以便将其存储到数据表中 目前,我们已经使用Microsoft.Office.Interop.Excel组件来读取Excel工作表数据。但在使用该组件时,从excel工作表读取数据需要很长时间,我们希望使其快速处理。 我们也用NPOI进行了尝试,但我们没有获得任何获取范围数据的选项

我们需要根据一定的范围读取excel表格数据,并将其存储到数据库中。 我们的excel工作表包含1807列541行,所以我们不能使用Datatable将数据存储到其中。 此外,我们还需要检查每个单元格的excel工作表,以便将其存储到数据表中

目前,我们已经使用Microsoft.Office.Interop.Excel组件来读取Excel工作表数据。但在使用该组件时,从excel工作表读取数据需要很长时间,我们希望使其快速处理。 我们也用NPOI进行了尝试,但我们没有获得任何获取范围数据的选项

,

所以,我们只想知道有没有其他的组件可以做这个

下面是我们尝试过的代码:

 public System.Data.DataTable getCellRangeValueAsDataTable(string filename, string startCell, string endCell)
    {
        System.Data.DataTable newTable = new System.Data.DataTable();
        Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
        string result = "";

        Workbook wb = xlApp.Workbooks.Open(filename,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing, Type.Missing, Type.Missing,
                Type.Missing, Type.Missing);

        Worksheet ws = (Worksheet)wb.Worksheets[2];
        Range aRange = ws.get_Range(startCell, endCell);

        for (int cCnt = 1; cCnt <= aRange.Columns.Count; cCnt++)
        {
            newTable.Columns.Add("String" + cCnt, typeof(string));
        }

        for (int rCnt = 1; rCnt <= aRange.Rows.Count; rCnt++)
        {
            object[] objArr = new object[aRange.Columns.Count];

            for (int cCnt = 1; cCnt <= aRange.Columns.Count; cCnt++)
            {
                objArr[cCnt - 1] = (aRange.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Value;
            }
            newTable.Rows.Add(objArr);
        }

       return newTable;
    }
public System.Data.DataTable getCellRangeValueAsDataTable(字符串文件名、字符串startCell、字符串endCell)
{
System.Data.DataTable newTable=新的System.Data.DataTable();
Microsoft.Office.Interop.Excel.Application xlApp=新的Microsoft.Office.Interop.Excel.Application();
字符串结果=”;
工作簿wb=xlApp.Workbooks.Open(文件名,
类型。缺失,类型。缺失,类型。缺失,类型。缺失,类型。缺失,
类型。缺失,类型。缺失,类型。缺失,类型。缺失,类型。缺失,
类型。缺失,类型。缺失,类型。缺失,类型。缺失,类型。缺失,
类型。缺失,类型。缺失);
工作表ws=(工作表)wb.工作表[2];
Range aRange=ws.get_Range(起始单元格、结束单元格);

对于(int-cCnt=1;cCnt这里最好的解决方案是使用,这将比Interop程序集快得多。正如我们所知,Interop通过COM工作,它不能太快,因为您必须调用代码中的每个操作(例如从单元格读取数据)。OpenXML SDK在这里是一个很好的解决方案,因为它可以直接从excel文件读取数据,而无需调用Microsoft Office API,而且是免费的。
您可以看到使用OpenXML SDK读取数据的示例。

为什么不使用ePlus或电子表格库:

这两个都可以通过NuGet获得

在整个过程中,有大量资源可以帮助您:

可能的副本也值得一读。