C# 如何加快Excel工作表的写入速度

C# 如何加快Excel工作表的写入速度,c#,excel,interop,C#,Excel,Interop,我目前正在使用Interop对象写入Excel电子表格。使用秒表,我发现下面的实现非常及时。foreach循环中的进程通常需要大约50秒来写入大约2000行,每行有9列 有没有办法加快速度 List<string[]> allEntries = fillStringArrayList(); // Set-up for running Excel xls = new Excel.Application(); workBooks = xls.Workbooks; workBook =

我目前正在使用Interop对象写入Excel电子表格。使用秒表,我发现下面的实现非常及时。
foreach
循环中的进程通常需要大约50秒来写入大约2000行,每行有9列

有没有办法加快速度

List<string[]> allEntries = fillStringArrayList();

// Set-up for running Excel
xls = new Excel.Application();
workBooks = xls.Workbooks;
workBook = workBooks.Open(workbookPath);
var workSheet = workBook.Sheets["Sheet1"];

// Insert new entries
foreach (string[] entry in allEntries)
{
    // Get the final row in the sheet that is being used
    Excel.Range usedRange = workSheet.UsedRange;
    int rowCount = usedRange.Rows.Count;

    // Format Column A to be type "text"
    workSheet.Cells[rowCount + 1, 1].NumberFormat = "@";

    workSheet.Cells[rowCount + 1, 1] = entry[0];
    workSheet.Cells[rowCount + 1, 2] = entry[1];
    workSheet.Cells[rowCount + 1, 3] = entry[2];
    workSheet.Cells[rowCount + 1, 4] = entry[3];
    workSheet.Cells[rowCount + 1, 5] = entry[4];
    workSheet.Cells[rowCount + 1, 6] = entry[5];
    workSheet.Cells[rowCount + 1, 7] = entry[6];
    workSheet.Cells[rowCount + 1, 8] = entry[7];
    workSheet.Cells[rowCount + 1, 9] = entry[8];
}
List allEntries=fillStringArrayList();
//设置以运行Excel
xls=新的Excel.Application();
工作簿=xls.工作簿;
工作簿=工作簿。打开(工作簿路径);
var工作表=工作簿.工作表[“Sheet1”];
//插入新条目
foreach(allEntries中的字符串[]条目)
{
//获取正在使用的工作表中的最后一行
Excel.Range usedRange=workSheet.usedRange;
int rowCount=usedRange.Rows.Count;
//将列A的格式设置为“文本”类型
工作表.Cells[rowCount+1,1].NumberFormat=“@”;
工作表.单元格[rowCount+1,1]=条目[0];
工作表.单元格[rowCount+1,2]=条目[1];
工作表.单元格[rowCount+1,3]=条目[2];
工作表.单元格[rowCount+1,4]=条目[3];
工作表.单元格[rowCount+1,5]=条目[4];
工作表.单元格[rowCount+1,6]=条目[5];
工作表.单元格[rowCount+1,7]=条目[6];
工作表.单元格[rowCount+1,8]=条目[7];
工作表.单元格[rowCount+1,9]=条目[8];
}

尝试将数组分配给一个范围,而不是逐个单元格进行打断和分配:

Excel.Range c1 = (Excel.Range)workSheet.Cells[rowCount + 1, 1];
Excel.Range c2 = (Excel.Range)workSheet.Cells[rowCount + 1, 9];
Excel.Range range = workSheet.get_Range(c1, c2);
range.Value = entry;
编辑: 如果希望加快速度,可以将二维数组(字符串[,],其中第一个维度是行,第二个维度是列)指定给相同大小的范围

int firstLine = rowCount + 1;
Excel.Range c1 = (Excel.Range)workSheet.Cells[firstLine, 1];

//Gets the size of the first dimension of the array
int arrayXSize = allEntries.GetLength(0); 

Excel.Range c2 = (Excel.Range)workSheet.Cells[firstLine + arrayXSize -1, 9];
Excel.Range range = workSheet.get_Range(c1, c2);

//allEntries is a string[,]
range.Value = allEntries;

检查记录集的副本。注意
使用秒表和启用优化的释放模式?@ThomasAyoub是&是。谢谢。这快了50%。@如果您可以修改fillStringArrayList()以返回字符串[,]而不是列表,则可以加快速度。然后你可以把所有的入口都分配到一个相同大小的区域。太棒了!我试试看。你能编辑你的答案来显示这个实现吗?@Queue补充道。希望有帮助。