powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Из Datatable в Excel
22 сообщений из 22, страница 1 из 1
Из Datatable в Excel
    #37645008
Zaharius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Имеется DataTable с именем dt и лист Excel c именем Sheet. Для того, чтобы копировать данные из dt в Sheet делаю так:
Код:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
Dim arr(dt.Rows.Count - 1, dt.Columns.Count - 1) As Object 
 For i = 0 To dt.Rows.Count - 1 
 For y = 0 To dt.Columns.Count - 1 
  arr(i, y) = dt.Rows(i).Item(y) 
 Next 
 Next 
  Sheet.Range("A1").Resize(dt.Rows.Count, dt.Columns.Count).Value = arr 





Но нельзя ли это сделать, минуя стадию пошагового заполнения массива?
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37645299
Фотография mds_world
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В екселе есть очень приятный метод - CopyFromRecordset. На первый взгляд, то, что вам нужно.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37646693
Zaharius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
mds_worldВ екселе есть очень приятный метод - CopyFromRecordset. На первый взгляд, то, что вам нужно.

Метод, конечно, приятный. Только он -для рекордсета, а не датасета...
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37646820
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) А зачем вообще массив создавать? Есть же коллекция .Cells:
Код: vbnet
1.
2.
3.
4.
5.
For i = 0 To dt.Rows.Count - 1 
 For y = 0 To dt.Columns.Count - 1 
  Sheet.Cells(i+1, y+1) = dt.Rows(i).Item(y) 
 Next 
Next


2) А по поводу прямой записи - так какой VB.NET может быть в Excel?
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37647220
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AndreTM2) А по поводу прямой записи - так какой VB.NET может быть в Excel?
Думаю, что через Interop.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37647240
Фотография AndreTM
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
big-duke,
проблема там примерно такая же, как при прямой передаче содержимого многоколоночного List/Combo на лист Excel с помощью VBA. То есть в .DataTable есть, конечно, Rows(), Columns()... но они возвращают объекты .DataRow/Column, где обращение идет не по второму индексу, а по Item(), т.е. массив там не arr(i,j) , а arr(i)(j)
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37647343
Zaharius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AndreTM1) А зачем вообще массив создавать? Есть же коллекция .Cells:
Код: vbnet
1.
2.
3.
4.
5.
For i = 0 To dt.Rows.Count - 1 
 For y = 0 To dt.Columns.Count - 1 
  Sheet.Cells(i+1, y+1) = dt.Rows(i).Item(y) 
 Next 
Next


2) А по поводу прямой записи - так какой VB.NET может быть в Excel?

1) Это на порядок дольше займёт времени. Очень ощутимо, если необходимо поместить в екселевскую таблицу один-два десятка записей.

2) VB.Net в данном случае в самом VB.Net-e, просто он создает, открывает и заполняет экселевский файл.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37647344
Zaharius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
[quot big-duke]AndreTMДумаю, что через Interop.

Это я и имею в виду
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #37647346
Zaharius
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
P.S. Априори ADO.NET считается лучше, чем ADO. Но я уже в не раз сталкивался с невозможность для ADO.NET сделать то, что может старичок ADO.
В VB6 я использовал то, что предложил mds_world, а именно CopyFromRecordset - вставлял в экселевские листы огромные таблицы почти мгновенно. Не ужели ничего похожего нет в ADO.NET?
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
Из Datatable в Excel
    #39311988
Beliy443
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день? Данный вопрос как-то решился? Есть какая-то замена copyfromrecordset?
Раньше делал очень просто:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
Dim CON As Object
Dim RS As Object
Dim Excel_obj As Object
Dim Excel_Doc As Object
Dim strSQL As String
strSQL = "select * from names"
Excel_obj = CreateObject("Excel.Application")
Excel_obj.visible = True
Excel_Doc = Excel_obj.workbooks.add
CON = CreateObject("ADODB.Connection")
CON.Provider = "SQLOLEDB"
CON.ConnectionString = "Server=a001;Database=Base01;Integrated Security=SSPI"
CON.Open()
RS = CreateObject("ADODB.Recordset")
RS.Open(strSQL, CON)
Excel_Doc.Range("a1").CopyFromRecordset RS 'копируем рекордсет на лист Excel без заморочек
RS = Nothing


Сейчас нету такой приблуды как copyfromrecordset.
Какими наименьшими затратами и потерями сбросить таблицу, полученную в результате sql запроса в Excel?
Может кто-нибудь подсказать простейший код, так как я не настоящий сварщик и курение справки Microsoft мне не помогло.
Заморочек каких то особых не надо. просто полученную таблицу вставить в excel и все.
Заранее спасибо.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312157
dvim
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сейчас нету такой приблуды как copyfromrecordset.

А почему ей таки не воспользоваться ?
Сформировать рекордсет и отправить.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312172
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliy443Сейчас нету такой приблуды как copyfromrecordset.???
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312244
Beliy443
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может я не правильно выражаюсь.
Но visual studio 2012 ругается на строку
Код: vbnet
1.
Excel_Doc.Range("a1").CopyFromRecordset RS


Не понимает он что такое CopyFromRecordset RS.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312252
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliy443Но visual studio 2012 ругается на строкуа на каком языке вы пишете в visual studio 2012?
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312254
Beliy443
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
visual basic
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312262
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В интеропе всё на месте
https://msdn.microsoft.com/en-us/library/microsoft.office.interop.excel.range.copyfromrecordset.aspx

Какая ошибка хоть выдается?
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312267
Beliy443
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Сейчас нет под рукой базы sql. поэтому попробовал подключиться просто к файлу excel как к бд.
Вообще подчеркивал RS после copyfromrecordset. Но сейчас я закооментировал последние четыре строки и сменил connectionstring.
Получилось так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
        Dim CON As Object
        Dim RS As Object
        Dim Excel_obj As Object
        Dim Excel_Doc As Object
        Dim strSQL As String
        strSQL = "select * from BD"
        Excel_obj = CreateObject("Excel.Application")
        Excel_obj.visible = True
        Excel_Doc = Excel_obj.workbooks.add
        CON = CreateObject("ADODB.Connection")
        CON.Provider = "Microsoft.ACE.OLEDB.12.0"
        CON.ConnectionString = "Data Source=g:\ПробнаяБаза.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"""
        CON.Open()
        'RS = CreateObject("ADODB.Recordset")
        'RS.Open(strSQL, CON)
        'Excel_Doc.Range("a1").CopyFromRecordset RS   'копируем рекордсет на лист Excel без заморочек
        'RS = Nothing


Теперь стал ругаться на строку CON.Open(). С такой ошибкой:
Необработанное исключение типа "System.Runtime.InteropServices.COMException" в Microsoft.VisualBasic.dll
Дополнительные сведения: Не удается найти указанный поставщик. Вероятно, он установлен неправильно.

Что еще...в самом верху кода есть строка Imports Microsoft.Office.Interop.Excel (но она почему то подчеркнута зеленым)
Что то я совсем запутался...
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312271
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliy443но она почему то подчеркнутаохохох.... подчеркнута зеленым, подчеркнута красным - детский сад. Ну так посмотрите, в чем проблема-то! Мышь наведите или Error List откройте.


Звонит главбух производства сегодня, и заявляет:
- Володь... Шото у нас во всем отделе... Тэлэвизоры перекрестились!
И попробуй тут сразу догадайся, что у них сеть пропала...
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312280
Beliy443
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вы не смейтесь, пожалуйста. Я в первом сообщении уже сказал, что я не настоящий сварщик....
С Imports Microsoft.Office.Interop.Excel разобрался. Добавил ссылку на Microsoft Excel 15.0 Object Library. И стало нормально. На CON.Open() больше не ругается.
Опять ругается на строку Excel_Doc.Range("a1").CopyFromRecordset RS.
Такая ошибка:
Необработанное исключение типа "System.MissingMemberException" в Microsoft.VisualBasic.dll
Дополнительные сведения: Общий член "Range" для типа "Workbook" не найден.
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
 Public RS As Object
    Public Excel_obj As Object
    Public Excel_Doc As Object
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        Dim CON As Object


        Dim strSQL As String
        strSQL = "select * from BD"
        Excel_obj = CreateObject("Excel.Application")
        Excel_obj.visible = True
        Excel_Doc = Excel_obj.workbooks.add
        CON = CreateObject("ADODB.Connection")
        CON.Provider = "Microsoft.ACE.OLEDB.12.0"
        CON.ConnectionString = "Data Source=g:\ПробнаяБаза.xlsx;Extended Properties=""Excel 12.0 Xml;HDR=YES"""
        CON.Open()
        RS = CreateObject("ADODB.Recordset")
        RS.Open(strSQL, CON)
        Excel_Doc.Range("a1").CopyFromRecordset(RS)   'копируем рекордсет на лист Excel без заморочек
        RS = Nothing
    End Sub
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312285
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliy443Общий член "Range" для типа "Workbook" не найден.А что непонятно в этом сообщении? Range есть у листа, а никак не у книги.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312288
Beliy443
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное Вам спасибо. Все получилось.
...
Рейтинг: 0 / 0
Из Datatable в Excel
    #39312294
Фотография Shocker.Pro
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Beliy443Огромное Вам спасибо. Все получилось.Пожалуста. В следующий раз читайте сообщения об ошибках - проблема решится гораздо быстрее.

А лучше работать через Interop.Excel
http://www.cyberforum.ru/blogs/100536/blog1471.html

А может вам вообще не нужно взаимодействие с экселем
https://msdn.microsoft.com/en-us/library/hh180830(v=office.14).aspx
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Из Datatable в Excel
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]