Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
25 / 24 / 13
Регистрация: 04.07.2012
Сообщений: 463
.NET 4.x

Импорт Excel в dataGridView с progressBar

15.09.2012, 19:30. Показов 3685. Ответов 7
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!!!! Подскажите пожалуйста, как реализовать задуманное. Импортирую большой файл Excel в dataGridView. Это занимает минуты 2. Как подключить progressBar к импорту?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.09.2012, 19:30
Ответы с готовыми решениями:

Импорт из Excel в datagridview
Не получается вывести все строки с данными. Выводится только первая строка. OpenFileDialog opf = new OpenFileDialog(); ...

Импорт из Excel в dataGridView
Ребят помогите: Нужно, чтоб при нажатие на кнопку в грид копировались данные, но только таблицы с данными , а весь остальной текст он...

Импорт из Excel в datagridview
Здравствуйте! У меня возникла проблема импорта данных excel в datagridview. В документе содержится один лист, и ячейки нужно брать, начиная...

7
0 / 0 / 2
Регистрация: 18.09.2016
Сообщений: 110
24.01.2018, 04:18
тоже интересует
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
24.01.2018, 11:55
методов много, попробуйте такой
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private void GetData()
        {
            //Выполняем выгрузку в ДГВ данных из выбранного файла эксель
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Excel (*.XLS)|*.XLS";
            opf.ShowDialog();
            DataTable tb = new DataTable();
            string filename = opf.FileName;
            string ConStr = String.Format("Provider=Microsoft.ACE.OLEDB.12.0; Data Source={0}; Extended Properties=Excel 12.0;", filename);
            System.Data.DataSet ds = new System.Data.DataSet("EXCEL");
            OleDbConnection cn = new OleDbConnection(ConStr);
            cn.Open();
            DataTable schemaTable = cn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            string sheet1 = (string)schemaTable.Rows[0].ItemArray[2];
            string select = String.Format("SELECT * FROM [{0}]", sheet1);
            OleDbDataAdapter ad = new OleDbDataAdapter(select, cn);
            ad.Fill(ds);
            tb = ds.Tables[0];
            cn.Close();
            dataGridView1.DataSource = tb;   
        }
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
24.01.2018, 15:42
Pavel55, Есть подозрение, что проблема не в загрузке файла в таблицу, а определении оставшегося времени для отображения прогресса выполнения.
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
24.01.2018, 18:49
hoolygan, есть подозрение, что ТС что-то делает не так. Если ТС забирает данными из Excel в цикле по ячейкам, типа

C#
1
2
for...
  dataGridView1.Cells[1, i].Value =  Worksheet[1].Cells[i, 1].Value
то конечно будет долго и хочется прикрутить ProgressBar

А вот если вы

Вариант 1 - забираете данные с листа Excel одной строкой в двумерный массив и потом его загружаете в DGV, как пример
C#
1
2
int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А
var arrData = (object[,])xlSht.Range["A1:M" + iLastRow].Value; //берём данные с листа Excel

и уже этот массив arrData выгружаете в DGV


Вариант 2 - забираете данные с листа Excel через Provider=Microsoft.ACE.OLEDB.12.0 и запрос SELECT * FROM

то будет достаточно быстро и не нужен будет ProgressBar. Зачем вам ProgressBar, если данные загружаются в DGV, например, 3 секунды?

Просто хотелось бы узнать, каким способом данные забираются с листа Excel и какое количество строк и столбцов у ТС.


А если касаться ProgressBar, то посчитайте общее кол-во строк в Excel, это будет 100% и при вставке данных в DGV высчитывайте процент и инкриминируйте ProgressBar


Вот код. Он затрачивает на моём слабом компьютере 4,3 секунды для загрузки из Excel 10 столбцов и 100.000 строк в DGV.
А для загрузки 1 млн строк уже нужно 45 секунд. Но если у вас 1 млн строк и более, то вам нужно переходить на базы данных
ТС пишет, что у него загружаются данные около 2-х минут. Если использовать мой код, то у вас в Excel файле должно быть 2,7 млн строк.


using System;
using System.Diagnostics;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data;


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
 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;
            }
            Stopwatch sw = new Stopwatch();
            sw.Start();
            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();
            string sheet1 = "Лист1$"; //название листа в Excel
            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;
            sw.Stop();
            MessageBox.Show ("Затрачено времени: " + sw.Elapsed.TotalSeconds.ToString());
0
360 / 287 / 76
Регистрация: 21.06.2016
Сообщений: 1,115
25.01.2018, 09:40
Pavel55, не совсем согласен )
1. при использовании DataSource на гриде - с довольно большим объемом данных - UI всё равно заглохнет, у меня глохло на почти 10 сек при > 500 000 строк с 6 полями (ssd + core i5 + 8 гиг оперативки).
2. Даже при получении общего количества строк через OleDB - мы никак не сможем узнать время выполнения запроса select из excel - поэтому не выведем прогресс-бар правильно.
Я к чему - для себя решил это дело использованием обыкновенной крутилки - т.е. прогресс-бар крутится сам по себе, дошел до 100 -> сброс в 0 и опять до 100. Пользователю понятно, что что-то происходит, а я не заморачивался с вычислением времени ожидания.
0
999 / 358 / 135
Регистрация: 27.10.2006
Сообщений: 764
25.01.2018, 12:22
hoolygan, это легко сделать через массив по первому моему предложенному варианту через массив. Тут мы знаем границы массива и в цикле вставлять данные в DGV и можно прикрутить ProgressBar.

Вот кому надо с ProgressBar. Как видно из замеров времени он значительно увеличивает время загрузки данных в DGV.
Я тестировал на 100.000 строк. С ProgressBar - 38 секунд, без ProgressBar - 7 секунд


using System;
using System.Diagnostics;
using System.Windows.Forms;
using Excel = Microsoft.Office.Interop.Excel;
using System.Data;



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
Excel.Application xlApp = new Excel.Application(); //Excel
            Excel.Workbook xlWB; //рабочая книга              
            Excel.Worksheet xlSht; //лист Excel        
 
            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;
            }
 
            xlWB = xlApp.Workbooks.Open(ofd.FileName); //название файла Excel                                             
            xlSht = xlWB.Worksheets["Лист1"]; //название листа или 1-й лист в книге xlSht = xlWB.Worksheets[1];
            int iLastRow = xlSht.Cells[xlSht.Rows.Count, "A"].End[Excel.XlDirection.xlUp].Row;  //последняя заполненная строка в столбце А            
            var arrData = (object[,])xlSht.Range["A1:J" + iLastRow].Value; //берём данные с листа Excel
            //xlApp.Visible = true; //отображаем Excel     
            xlWB.Close(false); //закрываем книгу, изменения не сохраняем
            xlApp.Quit(); //закрываем Excel
 
            //настройка DataGridView
            this.dataGridView1.Rows.Clear();
            int RowsCount = arrData.GetUpperBound(0);
            int ColumnsCount = arrData.GetUpperBound(1);
            dataGridView1.RowCount = RowsCount; //кол-во строк в DGV
            dataGridView1.ColumnCount = ColumnsCount; //кол-во столбцов в DGV
 
            //настройка ProgressBar
            this.progressBar1.Minimum = 1;
            this.progressBar1.Maximum = RowsCount;
            this.progressBar1.Value = 1;
            this.progressBar1.Step = 1;
 
            int i, j;
 
            //включаем таймер
            Stopwatch sw = new Stopwatch();
            sw.Start();
 
            //заполняем DataGridView данными из массива
            for (i = 1; i <= RowsCount; i++)
            {
                this.progressBar1.PerformStep();
                for (j = 1; j <= ColumnsCount; j++)
                { 
                    dataGridView1.Rows[i - 1].Cells[j - 1].Value = arrData[i, j];
                }
            }
 
            //сброс ProgressBar после загрузки данных
            this.progressBar1.Value = 1;
 
            sw.Stop();
            MessageBox.Show("Затрачено времени: " + sw.Elapsed.TotalSeconds.ToString());
0
25.01.2018, 12:31

Не по теме:

Pavel55, ну всё, подписал приговор. Следующим шагом будет реализовать это всё в отдельном потоке, чтобы "ну это же быстрее" :D

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.01.2018, 12:31
Помогаю со студенческими работами здесь

ProgressBar при экспорте данных из DataGridView в таблицу Excel
Добрый день! В приложении по нажатию кнопки данные из DataGridView экспортируются в таблицу excel. При большом объеме данных в...

Импорт данных из excel в DataGridView
Здравствуйте, нужна Ваша помощь. Необходимо организовать импорт данных их Excel в datagridview c#. Возможно что-то не так с первой строкой,...

Импорт данных из Excel в DataGridView
Всем доброго дня! После обновления Windows 7, при импорте данных из Excel в DGV столкнулся с такой проблемой, не происходит выгрузка...

Импорт из таблицы Excel в DataGridView
Ругается на строке dataGridView3.Rows.Add(1); словами: Дополнительные сведения: Невозможно добавить строки в элемент управления...

Импорт данных из Excel в DataGridView
Здравствуйте, дорогие форумчане. Столкнулся с проблемой по импорту данных в VB 2010. На самом деле статей очень много и все они полезные,...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Новые блоги и статьи
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru