快速将大型Excel工作表转换为数据表

时间:2019-04-12 15:40:25

标签: c# excel

我必须处理非常大的Excel文件。该文件包含历史客户数据,我需要将Excel工作表数据转换为数据表对象。数据表对象将传递到另一个进程进行解析。

我需要一种将工作表数据转换为数据表的非常快速的方法。有任何想法吗?

我当前正在使用Aspose,但是转换大约需要23分钟。我尝试OleDb的速度非常快,但它只适用于物理文件和所需的文件path.my文件数据(以字节数组形式提供)。我不想将它们写在磁盘上并在OleDB连接中使用物理路径。

我尝试过OpenXml,但是速度非常慢(花了更多时间才花了一个小时)

使用Aspose:

Workbook workbook = null;
loadOptions.MemorySetting = MemorySetting.MemoryPreference;
using (Stream stream = new MemoryStream(file))
{
   workbook = new Workbook(stream, loadOptions);
}

var worksheet = workbook.Worksheets[0];

DataTable dataTable = worksheet.Cells.ExportDataTableAsString(
                        0,
                        0,
                        worksheet.Cells.MaxDataRow + 1,
                        worksheet.Cells.MaxDataColumn + 1,
                        true);

花了大约23分钟

使用OleDB:

var fileName = "e:\\test1.xlsx";
var query = "SELECT * FROM [Data$]";
using (OleDbConnection cn = new OleDbConnection { ConnectionString = this.ConnectionString(fileName, "No") })
{
    using (OleDbCommand cmd = new OleDbCommand { CommandText = query, Connection = cn })
    {
         cn.Open();

         OleDbDataReader dr = cmd.ExecuteReader();
                dt.Load(dr);
     }
}

花了大约2.5分钟

我需要一种将Excel工作表转换为小于2.5分钟的大型Excel文件(250 MB)的数据表的快速方法。流对象中可用的Excel文件数据。

2 个答案:

答案 0 :(得分:0)

您可以尝试使用Aspose.Cells的LightCells功能,可以在短时间内读取大文件,然后使用设备自己的逻辑来填充DataTable。关于ExportDataTableAsString()的性能下降,Aspose.Cells团队已经在考虑这一点。

https://docs.aspose.com/display/cellsnet/Using+LightCells+API#UsingLightCellsAPI-ReadingLargeExcelFiles:Example

注意:我是Aspose的支持开发人员/传播者。

答案 1 :(得分:0)

请使用LightCells API读取数据并将其导出到数据表。删除所有与Aspose.Cells有关的代码,以将数据导出到数据表,因为导出需要很长时间。

DateTime startTime = DateTime.Now;
DateTime finishTime = DateTime.Now;
int columns = 442;
int rows = 181872;
DataTable dt = new DataTable();
string[] values = new string[columns];
for (int i = 0; i < columns; i++)
{
    values[i] = "test" + i;
    dt.Columns.Add(values[i]);
}
for (int row = 0; row < rows; row++)
{
    DataRow dataRow = dt.NewRow();
    dt.Rows.Add(dataRow);
    for (int col = 0; col < columns; col++)
    {
        dataRow[col] = values[col];
    }
}
finishTime = DateTime.Now;
Console.WriteLine("load Excel worksheet data into Data table: (Aspose) " + (finishTime - startTime));