首页 > 解决方案 > 在excel中更快地读取数据行的问题

问题描述

我想读取数据并绘制 XY 图。我有 2000 行数据,只有 2 列。我现在正在从 Row1Column1 阅读到 Row1Column2,但它的阅读速度很慢。有没有更快的阅读方式?

我尝试使用全局变量来替换int rowCount = xlRange.Rows.Count;并设置int colCount = 2,因为我的列号固定为两个。但后来我收到一个错误,说无法对空引用执行运行时绑定,但它不是空引用

Excel.Range xlRange = xlWorksheet1.UsedRange;

            int rowCount = xlRange.Rows.Count;
            int colCount = xlRange.Columns.Count;

            for (int i = 1; i <= rowCount; i++)
            {
                for (int j = 1; j <= colCount; j++)
                {
                    //Console.WriteLine(xlRange.Cells[i, j].Value2.ToString());
                    xlWorkSheet.Cells[i, j] = xlRange.Cells[i, j].Value2.ToString(); //This line throws the error
                }
            }
            Console.ReadLine();

            Excel.Range chartRange;
            Excel.ChartObjects xlCharts = (Excel.ChartObjects)xlWorkSheet.ChartObjects(Type.Missing);
            Excel.ChartObject myChart = (Excel.ChartObject)xlCharts.Add(200, 80, 300, 250);
            Excel.Chart chartPage = myChart.Chart;

            chartPage.ChartType = Excel.XlChartType.xlXYScatter;

标签: c#excel

解决方案


如前所述,使用 Excel 互操作是出了名的慢。经常有办法解决这个问题,比如现在。但是,使用第三方库还有其他优点。也就是说,在使用 Interop 时,目标计算机必须具有与代码使用的 Excel 库相同的 Excel 库。

另外,我知道你可能别无选择。公司不允许使用任何第三方库并不罕见。所以,你的手可能会被束缚。

如果您必须使用互操作,那么正如已经评论过的那样,逐个单元进行复制会很慢。更好的方法是使用 Excel 的Range.Copy命令。在我的测试中,这大大减少了时间。

如果我没记错的话,您说它只是您需要复制的前两列,如果还有更多列,那么将代码更改为您需要的应​​该不难。

因此,下面的代码会将前两列从源工作表复制到目标工作表。一张 2200 多行的表格只用了不到两 (2) 秒。

string cell1 = "A1";
string cell2 = "B" + rowCount.ToString();
Microsoft.Office.Interop.Excel.Range sourceRange = xlWorkSheet.Range[cell1, cell2];
Microsoft.Office.Interop.Excel.Range destinationRange = xlWorkSheet2.Range[cell1, cell2];
sourceRange.Copy(destinationRange);

最后,我相信您遇到null异常的原因是源工作表中的一个或多个单元格是null,并且当代码尝试ToString使用空值调用该方法时……您知道会发生什么。

在调用它的方法null之前添加对这个值的检查。ToString像……</p>

if (xlRange.Cells[i, j].Value2 != null) {
  xlWorkSheet2.Cells[i, j] = xlRange.Cells[i, j].Value2.ToString();
}

推荐阅读