Форум программистов, компьютерный форум, киберфорум
C# Windows Forms
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51

Открывать excel файл в другом потоке

16.09.2015, 08:43. Показов 3130. Ответов 20
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый всем день! Подскажите пожалуйста, как открывать большие excel файлы в другом потоке, чтобы программа не зависала при добавлении строк в datagridview?
Вот код открытия файла excel.
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
      {
            string str;
            int rCnt;
            int cCnt;
 
            OpenFileDialog opf = new OpenFileDialog();
            opf.Filter = "Excel (*.XLS;*.XLSX)|*.XLS;**.XLSX";
            opf.ShowDialog();
            System.Data.DataTable tb = new System.Data.DataTable();
            string filename = opf.FileName;
 
            Microsoft.Office.Interop.Excel.Application ExcelApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel._Workbook ExcelWorkBook;
            Microsoft.Office.Interop.Excel.Worksheet ExcelWorkSheet;
            Microsoft.Office.Interop.Excel.Range ExcelRange;
 
            ExcelWorkBook = ExcelApp.Workbooks.Open(filename, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false,
                false, 0, true, 1, 0);
            ExcelWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ExcelWorkBook.Worksheets.get_Item(1);
 
            ExcelRange = ExcelWorkSheet.UsedRange;
            dataGridViewOpenExcel.Columns.Add("tn_ob", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob1", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob2", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob3", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob4", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob5", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob6", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob7", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob8", "tn_ob2");
 
            for (rCnt = 19; rCnt <= ExcelRange.Rows.Count-1; rCnt++)
            {
                dataGridViewOpenExcel.Rows.Add();
                for (cCnt = 1; cCnt <= ExcelRange.Columns.Count; cCnt++)
                {
                        str = (string)(ExcelRange.Cells[rCnt, cCnt] as Microsoft.Office.Interop.Excel.Range).Value.ToString();
                        dataGridViewOpenExcel[cCnt - 1, rCnt - 19].Value = str;
                }
            }
 
            ExcelWorkBook.Close(true, null, null);
            ExcelApp.Quit();
 
            releaseObject(ExcelWorkSheet);
            releaseObject(ExcelWorkBook);
            releaseObject(ExcelApp);
        }
 
        private void releaseObject(object obj)
        {
            try
            {
                System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
                obj = null;
            }
            catch (Exception ex)
            {
                obj = null;
                MessageBox.Show("Unable to release the object " + ex.ToString());
            }
            finally
            {
                GC.Collect();
            }
        }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.09.2015, 08:43
Ответы с готовыми решениями:

Прикрутить многопоточность, чтобы загрузка Excel в массив происходила в другом потоке
Решил написать небольшую программку парсер Excel, все сделал, работает, но решил прикрутить многопоточность, чтобы загрузка Excel в массив...

Элементы управления, созданные в одном потоке, не могут быть родительскими для элемента управления в другом потоке
Привет :) Есть задача - нужно динамически добавлять компоненты. Все работает хорошо. Но если добавлять через цикл то начинает зависать...

ProgressBar в другом потоке
Есть приложение, которое заносит в БД тысячи строк, соответственно форма подтормаживала, процедуру занесения вынес в отдельный поток. Хотел...

20
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 09:16
Получай данные в System.Data.DataTable tb в отдельном потоке, при его завершении или в процессе,
периодически делай.
C#
1
2
3
4
dataGridViewOpenExcel.DataSource = null;
dataGridViewOpenExcel.DataSource = tb;
 
dataGridViewOpenExcel.AutoGenerateColumns = true;// поставь где нибудь заранее
0
6 / 6 / 5
Регистрация: 23.12.2012
Сообщений: 112
16.09.2015, 09:18
если метод без параметров
C#
1
2
3
Thread thr = new Thread(Method);
thr.Priority = ThreadPriority.Normal; // приоритет твоего потока
thr.Start();
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
16.09.2015, 09:26  [ТС]
Woldemar89, можешь подсказать пожалуйста, как получать данные в datatable в потоке????
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 09:30
Ну как запустить поток тебе уже подсказали.
в Method запихай, твой код, который читает с файла,
только читай в Datatable. По завершении потока используй
мой код, но не в потоке.
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
16.09.2015, 09:44  [ТС]
Woldemar89, вот я переделал код под datatable
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
//Открываем  окно openFileDialog
            //Создали фильтр форматов, которые можно открыть в нашей таблице
            openFileDialog1.Filter = "Excel (*.XLS;*.XLSX)|*.XLS;**.XLSX";
            //Условие, когда пользователь нада "Отмена", возвращение в программу
            if (openFileDialog1.ShowDialog() != DialogResult.OK)
                return;
            //Создаем таблицу с данными для памяти
            System.Data.DataTable tb = new System.Data.DataTable();
            //Возвращаем наш выбранный файл
            string filename = openFileDialog1.FileName;
            //Направляем наш формат в нужну программу, в нашем случае Excel
            string ConStr = String.Format(
                            "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=\"excel 8.0;hdr=no;IMEX=1\";data source={0}",
                            filename);
            //Создаем кэш память, для временого хранения таблицы
            System.Data.DataSet ds = new System.Data.DataSet("EXCEL");
            //Подключаемя к нашему выбранному файлу
            OleDbConnection cn = new OleDbConnection(ConStr);
            //Открываем нашу таблицу
            cn.Open();
            //Возвращаем таблицу в нашу программу
            System.Data.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();
            //Таблица отображается внутри программы
            dataGridViewOpenExcel.DataSource = tb;
правда теперь вопрос, как можно брать данные с определенный строки excek файла?
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 09:51
Цитата Сообщение от blackaleks Посмотреть сообщение
правда теперь вопрос, как можно брать данные с определенный строки excek файла?
Щас тебе четкий подгон сделаю. Поискать только надо.

Добавлено через 1 минуту
А нет рядом валялось, искать не пришлось.
Думаю поймешь, работает в том числе и на строках AB AAB итд.
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 string GetExcelColumnName(int number)
        {
            int dividend = number;
            string columnName = String.Empty;
            int modulo;
 
            while (dividend > 0)
            {
                modulo = (dividend - 1) % 26;
                columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
                dividend = (int)((dividend - modulo) / 26);
            }
 
            return columnName;
        }
 
        private int GetExcelColumnNumber(string name)
        {
            int number = 0;
            int pow = 1;
            for (int i = name.Length - 1; i >= 0; i--)
            {
                number += (name[i] - 'A' + 1) * pow;
                pow *= 26;
            }
 
            return number;
        }
А к строке xlWorkSheet.Range("A1", "A1").EntireRow.
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
16.09.2015, 10:17  [ТС]
Woldemar89, а как этот метод привязать к datatable, чтобы начать вытаскивать данные с определенный строчки (например с 19 по .....)
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 private string GetExcelColumnName(int number)
        {
            int dividend = number;
            string columnName = String.Empty;
            int modulo;
 
            while (dividend > 0)
            {
                modulo = (dividend - 1) % 26;
                columnName = Convert.ToChar(65 + modulo).ToString() + columnName;
                dividend = (int)((dividend - modulo) / 26);
            }
 
            return columnName;
        }
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 10:24
Цитата Сообщение от blackaleks Посмотреть сообщение
а как этот метод привязать к datatable
Он не для datatable, а для преобразования адресации в ексель.

Цитата Сообщение от blackaleks Посмотреть сообщение
начать вытаскивать данные с определенный строчки (например с 19 по .....)
C#
1
dt.Rows[18].ItemArray;
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
16.09.2015, 10:40  [ТС]
Woldemar89, а что присваивать надо к
C#
1
dt.Rows[18].ItemArray;
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 10:54
Цитата Сообщение от blackaleks Посмотреть сообщение
а что присваивать надо к
Получать надо, - например массив значений в строке.
C#
1
string []values = dt.Rows[18].ItemArray.Select(x => x.ToString()).ToArray();
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
16.09.2015, 11:23  [ТС]
Woldemar89, он так выбирает одну строку...
C#
1
string []values = dt.Rows[18].ItemArray.Select(x => x.ToString()).ToArray();
а как сделать чтобы данные брались с нескольких строк, а не только с одной? ну например с 18 по 30 строки...
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 11:26
Цитата Сообщение от blackaleks Посмотреть сообщение
ну например с 18 по 30 строки...
ты смеешься? знаешь что такое цикл?
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
16.09.2015, 11:37  [ТС]
Woldemar89, извини разобрался. сглупил что-то. но почему дату в массив заносит как число какое-то, из-за чего это может быть?
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 11:58
Цитата Сообщение от blackaleks Посмотреть сообщение
но почему дату в массив заносит как число какое-то, из-за чего это может быть?
Не понял, покажи код, в каком месте, и результат выполнения желательно.
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
16.09.2015, 12:12  [ТС]
вот смотри код:
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
            //Открываем  окно openFileDialog
            //Создали фильтр форматов, которые можно открыть в нашей таблице
            openFileDialog1.Filter = "Excel (*.XLS;*.XLSX)|*.XLS;**.XLSX";
            //Условие, когда пользователь нада "Отмена", возвращение в программу
            if (openFileDialog1.ShowDialog() != DialogResult.OK)
                return;
            //Создаем таблицу с данными для памяти
            System.Data.DataTable tb = new System.Data.DataTable();
            //Возврощаем наш выбранный файл
            string filename = openFileDialog1.FileName;
            //Направляем наш формат в нужну программу, в нашем случае Excel
            string ConStr = String.Format(
                            "Provider=Microsoft.ACE.OLEDB.12.0;extended properties=\"excel 8.0;hdr=no;IMEX=1\";data source={0}",
                            filename);
            //Создаем кэш память, для временого хранения таблицы
            System.Data.DataSet ds = new System.Data.DataSet("EXCEL");
            //Подключаемя к нашему выбранному файлу
            OleDbConnection cn = new OleDbConnection(ConStr);
            //Открываем нашу таблицу
            cn.Open();
            //Возвращаем таблицу в нашу программу
            System.Data.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();
            //Таблица отображается внутри программы
            dataGridViewOpenExcel.Columns.Add("tn_ob", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob1", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob2", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob3", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob4", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob5", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob6", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob7", "tn_ob2");
            dataGridViewOpenExcel.Columns.Add("tn_ob8", "tn_ob2");
            for (int i = 18; i < tb.Rows.Count; i++)
            {
                dataGridViewOpenExcel.Rows.Add(tb.Rows[i].ItemArray.Select(x => x.ToString()).ToArray());
            }
прикладываю как выглядит дата в икселе, а второй скрин как выводится в таблице... Главное все остальное выводится правильно
Миниатюры
Открывать excel файл в другом потоке  
Изображения
 
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 13:43
Цитата Сообщение от blackaleks Посмотреть сообщение
прикладываю как выглядит дата в икселе, а второй скрин как выводится в таблице...
Странно, вообще может, тип DateTime конвертится в цифру.

Щас попробую по нормальному сделать, достану свой исходник работы с ексель.

Добавлено через 1 час 22 минуты
Короче у меня что-то типа того было когда то.
Спер не помню откуда.
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 13:46
Вот.
Вложения
Тип файла: zip excelthreading.zip (51.3 Кб, 14 просмотров)
0
TheGreatCornholio
 Аватар для Woldemar89
1255 / 733 / 285
Регистрация: 30.07.2015
Сообщений: 2,408
16.09.2015, 13:47
Ну а выборку строк сам запили попробуй, помучай DataTable.
Подредактируй ее допустим в SetData перед биндом датасурса.
По удаляй лишние строки или типа того.
0
0 / 0 / 1
Регистрация: 16.09.2015
Сообщений: 51
18.09.2015, 09:54  [ТС]
Woldemar89, при datetime выдает exception: Не является допустимой датой OleAut
что делать?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
18.09.2015, 09:54
Помогаю со студенческими работами здесь

Обращение к методу в другом потоке
Всем привет, задача следующая: Легче всего объяснить на примере калькулятора. Есть метод, который выполняет суму 2х чисел, мне нужно...

Ивент с реакцией в другом потоке
В главном потоке происходит событие, к примеру А = 5. Как сделать так чтобы на смену значения А, в другом потоке , паралельно...

Работа в другом потоке с WebBrowser
Здрасте... У меня вопрос, возможно ли как-то осуществить(продолжить\передать) работу с WebBrowser в другом потоке? у меня получается на...

Создание TexBox в другом потоке
Есть Panel UserGB, нужно в неё постоянно (раз в секунду) добавлять текст боксы (удаляя от туда старые), причём делать это нужно в отдельном...

CreateControl в другом потоке (Invoke)
UserControl uc1 = AddEducation.Instance; UserControl uc2 = AddParents.Instance; UserControl uc3 = AddOther.Instance; ...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Подключение Box2D v3 к SDL3 для Android: физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
Влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru