Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Работа с данными

Страница: 1 | 2 |

 

  Вопрос: Экспорт в Excel Добавлено: 16.01.07 08:54  

Автор вопроса:  Денис | ICQ: 109593029 
Следующая проблема. Надо перенести данные из DataTable в лист Excel'я, примерно 1000 строк и около 30 столбцов.
Массивом слишком долго переносится уходит примерно около 10 минут, можно ли как нибудь этот процесс ускорить.
Если такой вопрос уже рассматривался киньте ссылку...

Ответить

  Ответы Всего ответов: 21  

Номер ответа: 1
Автор ответа:
 Lion



ICQ: 367220539 

Вопросов: 13
Ответов: 55
 Web-сайт: lammeru.net
 Профиль | | #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 xlAppSh As Excel.Application
        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-сайт: lammeru.net
 Профиль | | #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-сайт: lammeru.net
 Профиль | | #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-сайт: lammeru.net
 Профиль | | #10
Добавлено: 16.01.07 16:07
Смотри ответ №1. Проверил еще раз только что
Проблем нет. Excel откр. и закр.

Ответить

Номер ответа: 11
Автор ответа:
 Lion



ICQ: 367220539 

Вопросов: 13
Ответов: 55
 Web-сайт: lammeru.net
 Профиль | | #11
Добавлено: 16.01.07 16:15
EROS: Работает все одинаково.
Тормоза не в базе.
А в самом Excel, при выводе.
т.к. Excel-электронная таблица
(Если заметил ему 1000х30 надо вывести

Ответить

Номер ответа: 12
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #12 Добавлено: 16.01.07 16:23
EROS: Работает все одинаково.
Тормоза не в базе.
А в самом Excel, при выводе.
т.к. Excel-электронная таблица
(Если заметил ему 1000х30 надо вывести

Уважаемый.. ты даже по ходу и не пытался вникнуть в суть моего поста. Ты бы хоть напрягся слегка.. вникнул бы хоть что ли... У него все тормоза из за циклов.. будь то цикл по записям, или по ячейкам.. а я предлагаю вариант, как вообще избавиться от циклов!!! И уверяю тебя, разница в скорости передачи данных описанным мною способом будет более, чем ощутима!!

Ответить

Номер ответа: 13
Автор ответа:
 Денис



ICQ: 109593029 

Вопросов: 15
Ответов: 32
 Профиль | | #13 Добавлено: 16.01.07 16:23
Этот пример утром нашел.
Наверное я не все вам сказал, я пишу на VB.NET
RecordSet И DataTable - Это одно и тоже?
из моего кода видно что я использую DataTable.
xlSheetSh.Range("a1";).CopyFromRecordset(Table)

Так не идет "Интерфей не поддерживается".

Ответить

Номер ответа: 14
Автор ответа:
 EROS



Вопросов: 58
Ответов: 4255
 Профиль | | #14 Добавлено: 16.01.07 16:35
Наверное я не все вам сказал, я пишу на VB.NET

Ну ты молодец!!!!!!!!!!!! ))))))))))))))

Ответить

Номер ответа: 15
Автор ответа:
 Денис



ICQ: 109593029 

Вопросов: 15
Ответов: 32
 Профиль | | #15 Добавлено: 16.01.07 16:39
А что такое?

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам