我有一个从功能区运行的excel互操作项目。我的问题是,当加载具有30列的64k数据时,它非常慢。所以我创建了另一组项目,一个项目通过按钮点击从winforms窗口创建和启动excel表,并且加载100k行就好了,另一个项目是从visual studio创建的项目中的excel add。在加载中加载数据非常慢。在加载行时检查它,这是通过在工作表上创建一个范围来完成的,并将2维数组设置为该范围需要几分钟,因为在此过程中似乎有线程退出。任何人都可以帮助我获得清晰度或加快流程的方法。谢谢 我为表单设置值的代码:
public static Interop.Range AddData(DataTable dataTable, Interop.Worksheet sheetToAddTo, int rowOffset) {
Interop.Range tableRange = sheetToAddTo.Range[sheetToAddTo.Cells[1 + rowOffset, 1], sheetToAddTo.Cells[1 + rowOffset, 1]];
if (dataTable != null && dataTable.Columns.Count > 0)
{
//create the object to store the column names
object[,] columnNames;
columnNames = new object[1, dataTable.Columns.Count];
//add the columns names from the datatable
for (int i = 0; i < dataTable.Columns.Count; i++)
columnNames[0, i] = dataTable.Columns[i].ColumnName;
//get a range object that the columns will be added to
Interop.Range columnsNamesRange = (Interop.Range)sheetToAddTo.Range[sheetToAddTo.Cells[1 + rowOffset, 1], sheetToAddTo.Cells[1 + rowOffset, dataTable.Columns.Count]];
//a simple assignement allows the data to be transferred quickly
columnsNamesRange.Value2 = columnNames;
//release the columsn range object now it is finished with
columnsNamesRange = null;
if (dataTable.Rows.Count > 0)
{
//create the object to store the dataTable data
object[,] rowData;
rowData = new object[dataTable.Rows.Count, dataTable.Columns.Count];
//insert the data into the object[,]
for (int iRow = 0; iRow < dataTable.Rows.Count; iRow++)
for (int iCol = 0; iCol < dataTable.Columns.Count; iCol++)
rowData[iRow, iCol] = dataTable.Rows[iRow][iCol];
//get a range to add the table data into
//it is one row down to avoid the previously added columns
Interop.Range dataCells = (Interop.Range)sheetToAddTo.Range[sheetToAddTo.Cells[2 + rowOffset, 1], sheetToAddTo.Cells[dataTable.Rows.Count + rowOffset + 1, dataTable.Columns.Count]];
//assign data to worksheet
dataCells.Value2 = rowData;
//release range
dataCells = null;
}
//return the range to the new data
if (dataTable.Rows.Count > 0)
tableRange = sheetToAddTo.Range[sheetToAddTo.Cells[1 + rowOffset, 1], sheetToAddTo.Cells[dataTable.Rows.Count + rowOffset + 1, dataTable.Columns.Count]];
else
tableRange = sheetToAddTo.Range[sheetToAddTo.Cells[1 + rowOffset, 1], sheetToAddTo.Cells[1 + rowOffset + 1, dataTable.Columns.Count]];
}
return tableRange;
}
答案 0 :(得分:1)
大多数情况下,这是互操作电话的问题。
你不应该这样做:
for (int col = 0; col < 30 ; col++)
{
for (int row = 0; row < 30 ; row++)
{
object theValue = range.Cells[row,col].Value;
}
}
但:
object[,] allValues = range.Value;
这大大提高了性能。