Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
0 / 0 / 1
Регистрация: 11.03.2014
Сообщений: 86
1

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

11.09.2016, 15:39. Показов 3067. Ответов 2
Метки нет (Все метки)

пытаюсь считать данные с XLSX файла (500 000 строк). на MSDN наткнутся на статью каким образом это можно сделать. https://msdn.microsoft.com/ru-... 75571.aspx
Есть 2 проблемы:
1) при чтении с помощью DOM или SAX огромное количество оперативной памяти тратится (у SAX поменьше, но всё равно около 1,5 гб ). можно ли как то ограничить количество употребляемой памяти?
2) при DOM или SAX при проходе по строкам и столбцам значения ячеек равны 1,2,3,4,5 и т.д. В чем же причина?
__________________
Помощь в написании контрольных, курсовых и дипломных работ здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.09.2016, 15:39
Ответы с готовыми решениями:

Многопоточное чтение больших файлов
Доброго времени суток! Нужен совет. Имеется, скажем, 10 текстовых файлов 1.txt;2.txt и т.д. и...

Чтение файлов больших размеров >1Гб
Товарищи, подскажите как прочитать файл размером больше 1Гб.. у меня при чтении оперативка...

Чтение и редактирование файлов Excel
Добрый вечер. Никогда не работал с внешними файлами формата Excel и в голове трудно усваивается,...

Эффективное чтение из Excel файлов
using System; using System.Collections.Generic; using System.IO; using System.Linq; using...

2
970 / 352 / 135
Регистрация: 27.10.2006
Сообщений: 764
11.09.2016, 20:22 2
Лучший ответ Сообщение было отмечено Verzilinma как решение

Решение

А что вы пытаетесь сделать с этой большой таблицей? Вам нужно что-то сделать с данными на этом листе с таблице? или вам нужно эти данные вывести, например, в dataGridview ?

как вариант,

using System;
using System.Data;
using System.Windows.Forms;


C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
     private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog ofd = new OpenFileDialog();
            ofd.DefaultExt = "*.xls;*.xlsx";
            ofd.Filter = "Microsoft Excel (*.xls*)|*.xls*";
            ofd.Title = "Выберите документ для загрузки данных";
            if (ofd.ShowDialog() != DialogResult.OK)
            {
                MessageBox.Show("Вы не выбрали файл для открытия", "Загрузка данных...", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
             
            String constr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" +
                                ofd.FileName + ";Extended Properties='Excel 12.0 XML;HDR=YES;IMEX=1';";
 
                System.Data.OleDb.OleDbConnection con =  new System.Data.OleDb.OleDbConnection(constr);
                con.Open();
                DataSet ds = new DataSet();
                DataTable schemaTable = con.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
                string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];
                string select = String.Format("SELECT * FROM [{0}]", sheet1);
                System.Data.OleDb.OleDbDataAdapter ad = new System.Data.OleDb.OleDbDataAdapter(select, con);
                ad.Fill(ds);
                DataTable dt = ds.Tables[0];
                con.Close();
                con.Dispose();
                dataGridView1.DataSource = dt;
        }
1
605 / 580 / 157
Регистрация: 29.06.2010
Сообщений: 1,620
13.09.2016, 11:02 3
не знаю как по количеству памяти, но по времени мне этот алгоритм понравился больше всего:
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
        /// <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 и есть эллемент ячейки. правда какого он у вас будет типа мне не ведомо. 
//и может быть индексы не с нуля, а с единицы, но не уверен)
 
        }
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.09.2016, 11:02

Многопоточное чтение больших файлов
Привет всем! Подскажите пожалуйста как реализовать многопоточное чтение файла рамером 1gb и больше...

Чтение и обработка больших файлов
Нужно прочитать большой файл (несколько гигабайт), поделить содержимое файла на int'ы и посчитать...

Чтение больших файлов (несколько гигабайт)
Доброго времени! Нужно прочесть и пропарсить крупный файл весом в несколько гигабайт. Подскажите...

Чтение запись файлов *.csv больших размеров
Доброго времени суток, форумчане! Нужно сделать: • прочитать данные таймсерий из файла...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru