Чтение больших файлов Excel - C#

Узнай цену своей работы

Формулировка задачи:

пытаюсь считать данные с XLSX файла (500 000 строк). на MSDN наткнутся на статью каким образом это можно сделать. https://msdn.microsoft.com/ru-ru/library/office/gg575571.aspx Есть 2 проблемы: 1) при чтении с помощью DOM или SAX огромное количество оперативной памяти тратится (у SAX поменьше, но всё равно около 1,5 гб ). можно ли как то ограничить количество употребляемой памяти? 2) при DOM или SAX при проходе по строкам и столбцам значения ячеек равны 1,2,3,4,5 и т.д. В чем же причина?

Решение задачи: «Чтение больших файлов Excel»

textual
Листинг программы
        /// <summary>
        /// Метод получения строки, для подключения к Excel файлу
        /// </summary>
        /// <param name="_file">файл, к которому необходимо подключиться</param>
        string GetExcelConnectionString(FileInfo _file)
        {
            Dictionary<string, string> props = new Dictionary<string, string>();                                //инициализация словаря параметров
            
            if (_file.Extension == ".xlsx") {                                                                   //если файл нового excel..
                props["Provider"] = "Microsoft.ACE.OLEDB.12.0;";                                                //.. -- заполнение параметров
                props["Extended Properties"] = "Excel 12.0 XML";                                                //.. -- для нового формата
                props["Data Source"] = _file.FullName;                                                          //.. -- файлов excel
            }
            else if (_file.Extension == ".xls") {                                                               //если файл старого excel..
                props["Provider"] = "Microsoft.Jet.OLEDB.4.0";                                                  //.. -- заполнение параметров
                props["Extended Properties"] = "Excel 8.0";                                                     //.. -- для старого формата
                props["Data Source"] = _file.FullName;                                                       //.. -- файлов excel
            }
            else throw new Exception("Неизвестное расширение файла!");                                          //если файл неизвестного формата - ошибка
 
            StringBuilder sb = new StringBuilder();                                                             //инициализация результирующей строки..
            foreach (KeyValuePair<string, string> prop in props) {                                              //пробежка по сформированным параметрам..
                sb.Append(prop.Key);                                                                            //.. -- 
                sb.Append('=');                                                                                 //.. -- заполнение происходит в формате
                sb.Append(prop.Value);                                                                          //.. -- <key1>=<value1>;<key2>=<value2>;...
                sb.Append(';');                                                                                 //.. --
            }
            return sb.ToString();                                                                               //возврат того что получилось
        }
 
        private void loadExcelFile(FileInfo _file)
        {
            DataSet ds = new DataSet();                                                                                     //инициализация данных excel-я
            string connectionString = GetExcelConnectionString(_file);                                                      //получение строки для подключения к файлу
 
            using (OleDbConnection conn = new OleDbConnection(connectionString)) {                                          //подключение к файлу..
 
                conn.Open();                                                                                                //открытие канала чтения
                OleDbCommand cmd = new OleDbCommand();                                                                      //инициализация комманды получения данных
                cmd.Connection = conn;                                                                                      //ссылка команде на подключение
 
                DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null);                                 //получение всех страниц файла
 
                // Loop through all Sheets to get data
                foreach (DataRow dr in dtSheet.Rows) {   
                    string sheetName = dr["TABLE_NAME"].ToString();
 
                    // Get all rows from the Sheet                              
                    cmd.CommandText = "SELECT * FROM [" + sheetName + "]"; 
 
                    DataTable dt = new DataTable(); 
                    dt.TableName = sheetName; 
 
                    OleDbDataAdapter da = new OleDbDataAdapter(cmd);
                    da.Fill(dt);
 
                    ds.Tables.Add(dt); 
                }
            }
            for (int j = 0; j < ds.Tables[0].Columns.Count; j++)                                                           //пробежка по всем столбцам, начиная от первого с данными..
                for (int i = 0; i < ds.Tables[0].Rows.Count; i++)                                                          //..пробежка по всем строкам, начиная с первой (нулевая- заголовки)..
                    double value = Convert.ToDouble(ds.Tables[0].Rows[i].ItemArray[j]);                                    //....получение значения точки
 
//вот этот value и есть эллемент ячейки. правда какого он у вас будет типа мне не ведомо. 
//и может быть индексы не с нуля, а с единицы, но не уверен)
 
        }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5