Преобразование большого листа Excel в таблицу данных очень быстрым способом - PullRequest
0 голосов
/ 12 апреля 2019

Мне приходится иметь дело с очень большим файлом 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 в таблицу данных для большого файла Excel (250 МБ) менее чем за 2,5 минуты.Данные из файла Excel доступны в объекте Stream.

Ответы [ 2 ]

0 голосов
/ 04 мая 2019

Пожалуйста, используйте LightCells API для чтения данных и их экспорта в таблицу данных. Удалите весь код Aspose.Cells, чтобы экспортировать данные в datatable, так как экспорт занимает много времени.

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));
0 голосов
/ 15 апреля 2019

Вы можете попробовать использовать функцию LightCells в Aspose.Cells, где большие файлы могут быть прочитаны в короткие сроки, а затем собственная логика устройства для заполнения DataTable.Что касается низкой производительности ExportDataTableAsString (), команда Aspose.Cells уже рассматривает это.

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

Примечание: я работаю разработчиком / евангелистом поддержки в Aspose.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...