【发布时间】:2016-07-13 08:35:26
【问题描述】:
我在 c# wpf 应用程序中有以下代码。我正在读取 Excel 文件,删除隐藏字符并尝试保留单元格格式,然后将数据写入管道分隔的文本文件。这段代码看起来很简单,但速度很慢。关于我为什么以及如何改进流程的任何想法?
private void ReadWriteExcelData(string strFileName)
{
Excel.Application xlApp;
Excel.Workbook xlWorkBook;
Excel.Worksheet xlWorkSheet;
Excel.Range range, colrange, rowrange;
xlApp = new Excel.Application();
xlWorkBook = xlApp.Workbooks.Open(strFileName, 0, true, 5, "", "", true,
Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
Excel.Sheets excelSheets = xlWorkBook.Worksheets;
if (blnLetExcelDecide)
{
range = xlWorkSheet.UsedRange;
}
else
{
Excel.Range c1 = xlWorkSheet.Cells[lngExcelStartRow, strExcelStartCol];
Excel.Range c2 = xlWorkSheet.Cells[lngExcelEndRow, strExcelEndCol];
range = (Excel.Range)xlWorkSheet.get_Range(c1, c2);
}
colrange = range.Columns;
lngNumCols = colrange.Count;
rowrange = range.Rows;
lngNumRows = rowrange.Count;
object[,] values = (object[,])range.Value;
string[] Fields = new string[lngNumCols];
int NumRow = 1;
while (NumRow <= values.GetLength(0))
{
strDataRow = "";
for (lngColCnt = 1; lngColCnt <= lngNumCols; lngColCnt++)
{
strCellData = range[NumRow, lngColCnt].Text;
strCellData = strCellData.TrimStart(' ');
if (strCellData == null)
{
strCellData = string.Empty;
}
else
{
strCellData = strCellData.Replace("\r\n", " ").Replace("\n", " ").Replace("\r", " ");
}
if (lngColCnt == lngNumCols)
{
strDataRow += strCellData;
}
else
{
strDataRow += strCellData + "|";
}
}
WriteDataRow(strDataRow, strFullOutputFileName);
if (NumRow % intModNumber == 0)
{
dblProgressPct = ((double)NumRow / (double)lngNumRows);
dblProgress = Math.Round((dblProgressPct * 100), 0);
prgIndicator.Width = dblProgress * 4;
lblPrctPrgrs.Content = dblProgress + "%";
grdProgressIndicator.InvalidateVisual();
System.Windows.Forms.Application.DoEvents();
}
NumRow++;
}
}
这是 WriteDataRow 例程:
public void WriteDataRow(string strDataRow, string strFullFileName)
{
using (StreamWriter file = new StreamWriter(@strFullFileName, true, Encoding.GetEncoding("iso-8859-1")))
{
file.WriteLine(strDataRow);
}
}
【问题讨论】:
-
多少数据?有多慢?如果你把“写”注释掉,它仍然很慢吗?
-
您将范围内容拉入
values,但循环范围以获取单元格内容 - 为什么不为此使用values?编辑:没关系 - 你想要文本而不是值...... C# 和 Excel 之间的任何行程都需要跨两个进程之间的边界编组调用:这有很多开销。 -
抱歉没有给出文件大小。我正在使用的 Excel 文件是 68 列 x 3652 行。执行大约需要 5 1/2 分钟。
-
你当然可以在其中使用一些StringBuilders,替换 strCellData 和 strDataRow 连接
-
作为一个测试 - 如果你使用
values数组代替单个 Text 值,性能如何?