Форум программистов, компьютерный форум, киберфорум
Наши страницы
C# Windows Forms
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
Ejinator
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 34
1

Быстрая выгрузка в готовый шаблон Excel

08.06.2016, 12:39. Просмотров 2101. Ответов 6
Метки нет (Все метки)

Добрый день!
Необходимо было создать внешнюю оболочку для пользователя, которая запускала бы хранимую процедуру на сервере со входными параметрами. Результат вывожу в DataGridVeew. По желанию пользователь может выгрузить результат в уже готовый шаблон.
осуществляю это следующим способом:
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
public void ExportToExcel(DataGridView grid)
        {
            Application Excel = new Application();
            XlReferenceStyle RefStyle = Excel.ReferenceStyle;
            
            Workbook wb = null;
            String TemplatePath = System.Windows.Forms.Application.StartupPath + @"\w1.xltx";
            try
            {
                wb = Excel.Workbooks.Add(TemplatePath); // !!! 
            }
            catch (System.Exception ex)
            {
                throw new Exception("Не удалось загрузить шаблон для экспорта " + TemplatePath + "\n" + ex.Message);
            }
            MessageBox.Show("Шаблон найден, начинаю выгрузку.Это может занять несколько минут. Для удобства - форма будет скрыта.. Для продолжнения нажми ОК ");
            Worksheet ws = wb.Worksheets.get_Item(1) as Worksheet;
 
 
            int i = 0;
            int j = 0;
            int k = 2;
            int l = 0;
 
            for (i = 0; i <= grid.RowCount - 1; i++)
            {
                l = 0;
                for (j = 0; j <= grid.ColumnCount - 1; j++)
                {
                    DataGridViewCell cell = grid[j, i];
                    ws.Cells[k + 1, l + 1] = cell.Value;
                    l++;
                }
                k++;
            }
 
 
          
 
            ws.Columns.EntireColumn.AutoFit();
            Excel.ReferenceStyle = RefStyle;
            Excel.Visible = true;
            ReleaseExcel(Excel as Object);
            
        }
 
        private void ReleaseExcel(object excel)
        {
            // Уничтожение объекта Excel.
            Marshal.ReleaseComObject(excel);
            // Вызываем сборщик мусора для немедленной очистки памяти
            GC.GetTotalMemory(true);
        }
Но, ввиду того, что записей может быть больше нескольких десятков тысяч - процесс длительный (вывод по строкам получается).
Может быть есть какой-то более быстрый способ?
В VB делал так - и довольно быстро получается:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
...
Sql = "SELECT * from table" & e
    rs.Open Sql, conn, 3, 3
   i = 3
        Set appExcel = CreateObject("Excel.Application")
        appExcel.Workbooks.Open (App.Path & "" & "w1.xls")
        appExcel.Visible = True
        With appExcel.ActiveSheet
            .Range("A" & i).CopyFromRecordset rs
        End With
   i = i + 1
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.06.2016, 12:39
Ответы с готовыми решениями:

Экспорт из ListBox в готовый шаблон Word
Добрый день, нужна помощь в реализации одной функции, в общем в ListBox у меня хранится подробная...

Выгрузка из DataGridView в Excel
Всем доброго времени суток! Задался на работе целью, программку мелкую сделать, для упрощения...

Выгрузка CSV в Excel
Есть файл txt в нем данные в формате csv. Если этот файл открывать с помощью Excel c разделителем...

Выгрузка из Excel в ComboBox
Здравствуйте. Хотел узнать как произвести выгрузку из Excel в ComboBox? Нужно перенести...

Выгрузка Excel из процессов
Доброго времени суток всем! Есть код, который из Excel передает все данные на форму в...

6
Storm23
Эксперт .NETАвтор FAQ
9276 / 4500 / 1632
Регистрация: 11.01.2015
Сообщений: 5,725
Записей в блоге: 34
08.06.2016, 14:06 2
Ejinator, обращаться к каждой ячейке эксела - долго. Нужно создать массив и заполнить им Range эксела за раз. Пример здесь.
1
Ejinator
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 34
09.06.2016, 10:00  [ТС] 3
Получилось - время сократилось с 2 минут до 5 сек - 19 столбцов и 30000 строк.
Код:

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
public void ExportToExcel(DataGridView grid)
        {
            Application Excel = new Application();
            XlReferenceStyle RefStyle = Excel.ReferenceStyle;
 
            Workbook wb = null;
            String TemplatePath = System.Windows.Forms.Application.StartupPath + @"\w1.xltx";
            try
            {
                wb = Excel.Workbooks.Add(TemplatePath); // !!! 
            }
            catch (System.Exception ex)
            {
                throw new Exception("Не удалось загрузить шаблон для экспорта " + TemplatePath + "\n" + ex.Message);
            }
            MessageBox.Show("Шаблон найден, начинаю выгрузку.Это может занять несколько минут. Для удобства - форма будет скрыта.. Для продолжнения нажми ОК ");
            Worksheet wsh = wb.Worksheets.get_Item(1) as Worksheet;
 
 
            object[,] d = new object[dataGridView1.RowCount, dataGridView1.ColumnCount];
 
            for (int i = 0; i < dataGridView1.Rows.Count - 1; i++)
            {
                for (int j = 0; j < dataGridView1.Columns.Count; j++)
                {
                    d[i, j] = dataGridView1.Rows[i].Cells[j].Value.ToString();
                }
            }
 
 
            Excel.Range c1 = (Excel.Range)wsh.Cells[3, 1];
            Excel.Range c2 = (Excel.Range)wsh.Cells[1 + grid.Rows.Count - 1, grid.Columns.Count];
            Excel.Range range = (Excel.Range)wsh.get_Range(c1, c2);
            range.Value2 = d;
 
            Excel.Visible = true;
            
 
        }
1
Ejinator
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 34
22.06.2016, 11:21  [ТС] 4
В продолжении темы..
Не хватает памяти для выгрузки таблицы 279000 строк на 278 столбцов. Может кто подскажет, как здесь выделить необходимый объем? Просто если на прямую - создаю подключение в шаблоне в Excel и выгружаю, занимает 7 часов и объем файла 110 Мб. Хотел убыстрить процесс. Программа виснет на строке
C#
1
   d[i, j] = dataGridView1.Rows[i].Cells[j].Value.ToString();
Пишет System.OutOfMemory при этом программа в диспетчере задач занимает 1,6 ГБ.
0
Storm23
Эксперт .NETАвтор FAQ
9276 / 4500 / 1632
Регистрация: 11.01.2015
Сообщений: 5,725
Записей в блоге: 34
22.06.2016, 11:28 5
Ejinator, Я думаю вы занимаетесь фигней. Такие объемы данных не хранятся в экселе. Вам нужна либо БД, либо свой формат данных.
В любом случае, массивы на миллионы строк вам все равно вылетят в OutOfMemory, так с данными работать нельзя.
Обрабатывайте ваши данные без экселя (и без строк кстати тоже). В крайнем случае, если нужно делать экспорт - можно выгрузить в CSV и открыть его в экселе. Тогда это будет уже его проблема, как это все отображать.
1
Ejinator
2 / 2 / 1
Регистрация: 27.07.2015
Сообщений: 34
22.06.2016, 12:00  [ТС] 6
Я не спорю и согласен, что было бы проще работать не с Excel. Но, по ТЗ от отдела "Только форма Excel таблицы". Не моя прихоть.
0
treyk
54 / 54 / 10
Регистрация: 28.06.2012
Сообщений: 224
Завершенные тесты: 1
22.06.2016, 14:20 7
Ejinator, если необходимо оставить всё, как есть, и работать с экселем, то сделайте себе "буфер", в который будете считывать столько, сколько позволяет память, потом эти данные отправлять на обработку, можно в отдельный поток, а буфер очищать и заполнять снова, продолжая с того места, где остановились.
1
22.06.2016, 14:20
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.06.2016, 14:20

Выгрузка таблицы dataGridView в Excel
Создала приложение на C# для работы с большим массивом данных. - Сначала в таблицу dataGridView...

Перестала работать выгрузка в Excel
Нормально работала и компилилась выгрузка, потом были выходные, сегодня перестали работать даже те...

Быстрая выгрузка из DataGridView1 в Excel
Всем привет. Столкнулся с проблемой выгрузки данных из DataGridView1 в Excel Почти все примеры,...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.