Прочитать большой документ Excel

Я хочу знать, что является самым быстрым способом чтения ячеек в Excel. У меня есть файл Excel, содержащий 50000 строк, и я хочу знать, как быстро его читать. Мне просто нужно прочитать первый столбец, и с подключением oledb мне понадобится 15 секунд. Есть ли более быстрый способ?

Спасибо

Ответ 1

Вот метод, который основан на использовании Microsoft.Office.Interop.Excel.

Обратите внимание: файл Excel, который я использовал, имел только один столбец с данными с 50 000 записей.

1) Откройте файл с помощью Excel, сохраните его как csv и закройте Excel.

2) Используйте StreamReader для быстрого считывания данных.

3) Разделите данные на канале возврата линии возврата и добавьте ее в список строк.

4) Удалите созданный файл csv.

Я использовал System.Diagnostics.StopWatch, чтобы выполнить время, и потребовалось 1.5568 секунд для запуска функции.

public static List<string> ExcelReader( string fileLocation )
{                       
    Microsoft.Office.Interop.Excel.Application excel = new Application();
    Microsoft.Office.Interop.Excel.Workbook workBook =
        excel.Workbooks.Open(fileLocation);
    workBook.SaveAs(
        fileLocation + ".csv",
        Microsoft.Office.Interop.Excel.XlFileFormat.xlCSVWindows
    );
    workBook.Close(true);
    excel.Quit();
    List<string> valueList = null;
    using (StreamReader sr = new StreamReader(fileLocation + ".csv")) {
        string content = sr.ReadToEnd();
        valueList = new List<string>(
            content.Split(
                new string[] {"\r\n"},
                StringSplitOptions.RemoveEmptyEntries
            )
        );
    }
    new FileInfo(fileLocation + ".csv").Delete();
    return valueList;
}

Ресурсы

http://www.codeproject.com/Articles/5123/Opening-and-Navigating-Excel-with-C

Как разбить строки на возврат каретки с помощью С#?

Ответ 2

Можете ли вы поместить свой код для чтения 50000 записей с помощью поставщика OLEDb. Я попытался это сделать, потребовалось 4-5 секунд, чтобы прочитать 50000 записей с тремя столбцами. Я сделал это следующим образом, просто взгляните, это может помочь вам.:)

       // txtPath.Text is the path to the excel file
        string conString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + txtPath.Text + ";" + "Extended Properties=" + "\"" + "Excel 12.0;HDR=YES;" + "\"";

        OleDbConnection oleCon = new OleDbConnection(conString);

        OleDbCommand oleCmd = new OleDbCommand("SELECT field1, field2, field3 FROM [Sheet1$]", oleCon);

        DataTable dt = new DataTable();

        oleCon.Open(); 
        dt.Load(oleCmd.ExecuteReader());
        oleCon.Close();

Если вы можете поместить свой код здесь, чтобы я мог попытаться исправить ситуацию.:)

Ответ 3

OLEDB всегда будет занимать больше времени.

SQL Server 2005/2008 сделает это быстрее.

Для соединений OLEDB требуется 7 записей в секунду, а

Для SQLServer требуется 70 записей в секунду.

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

Я буквально испытал это.

Ответ 4

Вы просто хотите прочитать список чисел из файла? Это должно быть в Excel? Кто-то не технический человек, обновляющий список? Если вы хотите прочитать 50 000 номеров из одного столбца в список в памяти, просто скопируйте ячейки в текстовый файл и прочитайте с помощью TextReader. Это будет мгновенно.

List<string> ReadFile(string path)
{
   TextReader tr = new StreamReader(path);
   string line;
   List<string> lines = new List<string>();
   while((line=tr.ReadLine())!=null)
   {
       //if this was a CSV, you could string.split(',') here
       lines.add(line);
   }

   return lines;
}

Ответ 5

Я столкнулся с одним и тем же, и я прочитал в офисе dev center:

http://social.msdn.microsoft.com/Forums/office/en-US/418ada31-8748-48d2-858b-d177326daa76/export-to-excel-open-xml-sdk-vs-microsoftofficeinteropexcel?forum=oxmlsdk

У вас есть два варианта управления файлами Excel:

  • Microsoft.Office.Interop.Excel, который использует Excel.Application как добавленный уровень для выполнения кода.
  • Open XML SDK, который позволяет разработчику напрямую работать с закрытым файлом

между ними нет большой разницы, но в вашем случае, когда производительность является проблемой, вы должны использовать Open XML SDK, который может быть немного быстрее и не нужно столько времени, открывая большой файл перед обработкой. как вы можете прочитать также в ссылке выше, и я цитирую:

Office для целей автоматизации не поддерживается. Приложения Office не предназначались для работы без контроля над людьми и имеют неприятную тенденцию "висеть"

хороший старт для изучения открытого xml sdk предоставляется по этой ссылке: http://msdn.microsoft.com/en-us/library/office/gg575571.aspx