我必须处理非常大的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文件数据。
答案 0 :(得分:0)
您可以尝试使用Aspose.Cells的LightCells功能,可以在短时间内读取大文件,然后使用设备自己的逻辑来填充DataTable。关于ExportDataTableAsString()的性能下降,Aspose.Cells团队已经在考虑这一点。
注意:我是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));