c#excel互操作性能加载数据

时间:2014-01-14 15:35:51

标签: c# excel-interop excel-addins

我有一个从功能区运行的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;
    }

1 个答案:

答案 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;

这大大提高了性能。

相关问题