c# - 在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;
解决方案
如前所述,使用 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();
}
推荐阅读
- android - 在片段上覆盖视图的最佳方法?
- amazon-dynamodb - DynamoDB,无法保存加密数据,“无权执行:kms:GenerateDataKey on resource”
- java - JavaDoc 覆盖
- javascript - 使用 sequelize.js 和 mysql 的性能很差
- java - 我对 bitbucket 有冲突合并问题
- python - 如何使用 Gensim 应用句子级 LDA 模型?
- multithreading - 在 Parallel.Foreach 循环(线程)中创建组件时保持组合根
- c# - 如何使用来自 C# API JSON 的数据在 C# MVC 视图模型中填充我的模型?
- sql-server - 使用 ALTER TABLE ADD 函数添加列时遇到问题
- azure-ad-b2c - 如何验证输入的值与预定义的值相同?