Страница: 1 | 2 |
Вопрос: Экспорт в Excel
Добавлено: 16.01.07 08:54
Автор вопроса: Денис | ICQ: 109593029
Следующая проблема. Надо перенести данные из DataTable в лист Excel'я, примерно 1000 строк и около 30 столбцов.
Массивом слишком долго переносится уходит примерно около 10 минут, можно ли как нибудь этот процесс ускорить.
Если такой вопрос уже рассматривался киньте ссылку...
Ответы
Всего ответов: 21
Номер ответа: 1
Автор ответа:
Lion
ICQ: 367220539
Вопросов: 13
Ответов: 55
Web-сайт:
Профиль | | #1
Добавлено: 16.01.07 11:19
В модуле:
Option Explicit
Dim objExcel As New Excel.Application
'--------------------------------------------
objExcel.Workbooks.Open ("путь к файлу.*.xls"
objExcel.Visible = False 'Невидимый лист
do while not . EOF ' цикл Перебора данных
' 17,4 позиции в таблице Excel соответственно X и Y
objExcel.ActiveCell(17, 4) = rs("ваша запись"
.movenext
loop
objExcel.Visible = True 'Показываем лист с данными
' Вот и все. Проблемы будут пиши.
Номер ответа: 2
Автор ответа:
Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #2
Добавлено: 16.01.07 14:32
Принцип такой же как и у меня:
Dim xlBookSh As Excel.Workbook
Dim xlSheetSh As Excel.Worksheet
xlAppSh = CreateObject("Excel.Application"
xlBookSh = xlAppSh.Workbooks.Add
xlSheetSh = xlBookSh.Worksheets(1)
'Экспорт шапки
Dim i, j As Integer
Dim Table As DataTable = Me.DataGrid1.DataSource
For i = 0 To Table.Columns.Count - 1
xlSheetSh.Cells(1, i + 1) = Table.Columns(i).Caption
Next
'Экспорт Данных
Dim row As DataRow
Dim k As Integer = 1
For i = 0 To Table.Rows.Count - 2
For j = 0 To Table.Columns.Count - 1
row = Table.Rows(i)
xlSheetSh.Cells(2 + i, j + 1) = row(j).ToString
Next
k += 1
Next
xlAppSh.Visible = True
xlAppSh.Quit
Это слишком медленно, но работает. Есть ли более быстрый способ?
Номер ответа: 3
Автор ответа:
Lion
ICQ: 367220539
Вопросов: 13
Ответов: 55
Web-сайт:
Профиль | | #3
Добавлено: 16.01.07 14:38
А ты не из грида делай экспорт, а из базы.
Всеж быстрее будет.
Ну быстрее по моему никак.....
Ммммм Дааааа.
Номер ответа: 4
Автор ответа:
Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #4
Добавлено: 16.01.07 14:45
База на SQL server, клиент обращается к хранимой процедуре, возвращается таблица, я ее отображаю в DataGrid, а при нажатии кнопки запускается процедура экспорта...
Номер ответа: 5
Автор ответа:
Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #5
Добавлено: 16.01.07 14:50
Подскажи как правильно сделать форму для остановки процедуры экспорта, а то чтоб принудительно ее остановить приходиться убивать процесс клиента....
Номер ответа: 6
Автор ответа:
Lion
ICQ: 367220539
Вопросов: 13
Ответов: 55
Web-сайт:
Профиль | | #6
Добавлено: 16.01.07 15:17
В цикле перебора данных (и экспорта в Excel) укажи
DoEvents
(процедура не зацикливается)
Размести на форме кнопку и пропиши процедуру остановку экспорта
при нажатии этой кнопки
Global export as boolean 'General Declarations
export=true
do while not .eof
DoEvents
if export=false then .close : exit sub
'Твой экспорт
.movenext
loop
Private Sub Command1_Click()'В любой форме проекта
export=False
end sub
Если я тебя правильно понял.
Номер ответа: 7
Автор ответа:
Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #7
Добавлено: 16.01.07 15:39
Lion спасибо... Супер штука DoEvents, избавился от одного гемора. При обработке большого объема данных прога как будто висла, а так нет...
Еще есть проблема: идет процесс экспорта, но если откроешь Excel, вылетает ошибка (Исключение из HRESULT: 0x800AC472) и процесс останавливается
Номер ответа: 8
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #8
Добавлено: 16.01.07 15:44
Циклы.. это все фигня.. это тормоза вечные. Насколько я помню у объекта RecordSet(или какого то другог) есть метод, позволяющий выгрузить даные один махом без всяких циклов. Я даже несколько лет назад пример выкладывал на этом сайте как раз по этой проблеме, выгрузка данных из db в Excel.. Полазий по сайту и поищи тот пример, там все подробно расписано
Номер ответа: 9
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #9
Добавлено: 16.01.07 15:58
Я тебя обманул... этот метод принадлежит объекту Sheets )) Давно это было (2003 г)., забывать VBA начал ))
Вот ссылка на тот пример...
http://vbnet.ru/samples/download.aspx?id=226
Номер ответа: 10
Автор ответа:
Lion
ICQ: 367220539
Вопросов: 13
Ответов: 55
Web-сайт:
Профиль | | #10
Добавлено: 16.01.07 16:07
Смотри ответ №1. Проверил еще раз только что
Проблем нет. Excel откр. и закр.
Номер ответа: 11
Автор ответа:
Lion
ICQ: 367220539
Вопросов: 13
Ответов: 55
Web-сайт:
Профиль | | #11
Добавлено: 16.01.07 16:15
EROS: Работает все одинаково.
Тормоза не в базе.
А в самом Excel, при выводе.
т.к. Excel-электронная таблица
(Если заметил ему 1000х30 надо вывести
Номер ответа: 12
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #12
Добавлено: 16.01.07 16:23
Тормоза не в базе.
А в самом Excel, при выводе.
т.к. Excel-электронная таблица
(Если заметил ему 1000х30 надо вывести
Уважаемый.. ты даже по ходу и не пытался вникнуть в суть моего поста. Ты бы хоть напрягся слегка.. вникнул бы хоть что ли... У него все тормоза из за циклов.. будь то цикл по записям, или по ячейкам.. а я предлагаю вариант, как вообще избавиться от циклов!!! И уверяю тебя, разница в скорости передачи данных описанным мною способом будет более, чем ощутима!!
Номер ответа: 13
Автор ответа:
Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #13
Добавлено: 16.01.07 16:23
Этот пример утром нашел.
Наверное я не все вам сказал, я пишу на VB.NET
RecordSet И DataTable - Это одно и тоже?
из моего кода видно что я использую DataTable.
Так не идет "Интерфей не поддерживается".
Номер ответа: 14
Автор ответа:
EROS
Вопросов: 58
Ответов: 4255
Профиль | | #14
Добавлено: 16.01.07 16:35
Ну ты молодец!!!!!!!!!!!! ))))))))))))))
Номер ответа: 15
Автор ответа:
Денис
ICQ: 109593029
Вопросов: 15
Ответов: 32
Профиль | | #15
Добавлено: 16.01.07 16:39
А что такое?