powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Передача в Excel
18 сообщений из 18, страница 1 из 1
Передача в Excel
    #32810807
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Помогите, пожалуйста!!!
у меня есть datagrid, как все его содержимое оправить в Excel. надо это сделать через массив. подскажите, как?
...
Рейтинг: 0 / 0
Передача в Excel
    #32810852
DDirks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Для VB мы делаем так:

Private Sub cmdExport_Click()

Dim xlApp As Excel.Application
Dim xlBook As Excel.Workbook
Dim xlSheet As Excel.Worksheet

Set xlApp = CreateObject("Excel.Application")
Set xlBook = xlApp.Workbooks.Add
Set xlSheet = xlBook.Worksheets(1)

Dim i As Integer
Dim j As Integer
Dim locArr() As Variant

sbStatusBar.Panels(1).Text = "Заполняем лист Excel"
Screen.MousePointer = vbHourglass
tm_beg = Timer

'вариант по ячейкам, медленный
'For i = 0 To grd.Rows - 1
' For j = 0 To grd.Cols - 1
' xlSheet.Cells(i + 1, j + 1) = grd.TextMatrix(i, j)
' Next j
'Next i

ReDim locArr(0 To grd.Rows - 1, 0 To grd.Cols - 1)
'из грида в таблицу
For i = 0 To grd.Rows - 1
For j = 0 To grd.Cols - 1
locArr(i, j) = grd.TextMatrix(i, j)
Next j
Next i

'из таблицы в Excel
xlSheet.Activate
xlSheet.Range(xlSheet.Cells(1, 1), xlSheet.Cells(UBound(locArr, 1) + 1, UBound(locArr, 2) + 1)).Value = locArr
Erase locArr

tm_end = Timer
sbStatusBar.Panels(1).Text = "Готово " + Format(tm_end - tm_beg, "###.0") + " сек."
Screen.MousePointer = vbDefault

xlSheet.Range("A1").Select

' Делает Excel видимым через объект Application.
xlSheet.Application.Visible = True

' Освобождает объектную переменную.
Set xlSheet = Nothing
Set xlBook = Nothing
Set xlApp = Nothing

End Sub
...
Рейтинг: 0 / 0
Передача в Excel
    #32811041
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот пример работает с msflexgrid. а мне надо с datagrid. у него нет свойств: cols, rows, textmatrix
...
Рейтинг: 0 / 0
Передача в Excel
    #32811212
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
этот пример работает с msflexgrid. а мне надо с datagrid. у него нет свойств: cols, rows, textmatrix
...
Рейтинг: 0 / 0
Передача в Excel
    #32811220
Фотография big-duke
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а в свой грид вы данные получаете через курсор ?
тогда CopyFromRecordset
...
Рейтинг: 0 / 0
Передача в Excel
    #32813596
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не трудно, покажите пример кода. не очень понятно.
...
Рейтинг: 0 / 0
Передача в Excel
    #32813598
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не трудно, покажите пример кода. не очень понятно.
...
Рейтинг: 0 / 0
Передача в Excel
    #32813600
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если не трудно, покажите пример кода. не очень понятно.
...
Рейтинг: 0 / 0
Передача в Excel
    #32813662
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
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.
Sub ВыводВExel()
   Const НачСтрока =  2 
   Dim rs As New ADODB.Recordset
   Dim ex1 As Object ' Excel.Application
   Dim wb As Object ' Excel.Workbook
   Dim ws As Object ' Excel.Worksheet
   Dim i As Long, j As Long, k As Long, rДанные As String
   Dim v As Variant
   Set ex1 = CreateObject("Excel.Application")  'New Excel.Application
   Set wb = ex1.Workbooks.Add
   Set ws = wb.Sheets( 1 )
   Set rs = рекордсетГрида.Clone
   rs.filter = рекордсетГрида.filter
   rs.sort = рекордсетГрида.sort
   k = rs.Fields.Count -  1 
   rДанные = "A" & (НачСтрока +  1 ) & ":" & XCol_(k) & rs.RecordCount + НачСтрока
   If rs.RecordCount >  0  Then
      rs.MoveFirst
      i =  0 
      Do Until rs.EOF
         For j =  0  To k
             v(i, j) = rs.Fields(j).Value
         Next j
         i = i +  1 
         rs.MoveNext
      Loop
      ws.Range(rДанные) = v
   End If
End Sub

Function XCol_(ByVal Column_ As Long) As String
    If (Column_ <  0 ) Then Column_ =  0 
    If (Column_ <  26 ) Then
        XCol_ = Chr(Column_ + Asc("A"))
    ElseIf (Column_ <  676 ) Then
        XCol_ = Chr((Column_ \  26 ) + Asc("A") -  1 ) & Chr((Column_ Mod  26 ) + Asc("A"))
    Else
        XCol_ = "ZZ"
    End If
End Function
Есть пример универсальной процедуры для ComponentOne True DBGrid с форматированием ширин и порядка следования колонок. Боюсь для MSGrid не применима.
...
Рейтинг: 0 / 0
Передача в Excel
    #32813664
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
+
Код: plaintext
1.
2.
rДанные = "A" & (НачСтрока +  1 ) & ":" & XCol_(k) & rs.RecordCount + НачСтрока
   ReDim v(rs.RecordCount, k) 'Забыл указать
   If rs.RecordCount >  0  Then
...
Рейтинг: 0 / 0
Передача в Excel
    #32813673
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
      ex1.Visible = True   'Еще забыл
      ws.Range(rДанные) = v
...
Рейтинг: 0 / 0
Передача в Excel
    #32813735
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо огромное, код просто супер. Очень мне помог.
...
Рейтинг: 0 / 0
Передача в Excel
    #32813739
Настенька
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо огромное, код просто супер. Очень мне помог.
...
Рейтинг: 0 / 0
Передача в Excel
    #32813925
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну если это получилось, то пригодится и это:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
'Форматирование колонок. Поставить перед выводом данных (для быстроты работы)
   Dim Строк As Long, cДанные As String, cFooter As String, cЗаголовок As String
   Строк = rs.RecordCount
   For j =  0  To k
      cДанные = XCol_(j) & (НачСтрока +  1 ) & ":" & M2.XCol_(j) & НачСтрока + Строк
      cFooter = XCol_(j) & НачСтрока + Строк +  1 
      cЗаголовок = XCol_(j) & (НачСтрока)
      ws.Range(cЗаголовок) = rs.Fields(j).Name
      If (rs.Fields(j).Type = adDBDate) Or (rs.Fields(j).Type = adDBTime) Or (rs.Fields(j).Type = adDate) Or (rs.Fields(j).Type = adDBTimeStamp) Then
         ws.Range(cДанные).NumberFormat = "dd mmmm yyyy"
      End If
      'Проверка необходимости добавить формулу
      If (rs.Fields(j).Type = adCurrency) Or (rs.Fields(j).Type = adDouble) Then
         ws.Range(cFooter).FormulaR1C1 = "=SUM(R[-" & Строк & "]C:R[-1]C)"
      End If
   Next j
'Дальше идет уже написанное (показано для ориентировки)
   ReDim v(rs.RecordCount, k) 'Забыл указать
   If rs.RecordCount >  0  Then
Можно развивать пример дальше
...
Рейтинг: 0 / 0
Передача в Excel
    #32814757
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1.А зачем через массив? Можно ведь использовать CopyFromRecordset, будет гораздо быстрее.
2.Если уж через массив то его из рекордсета можно получить использовав rs.GetRows
3.Настенька фотку давай! :)


Magnus
...
Рейтинг: 0 / 0
Передача в Excel
    #32814864
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus231.А зачем через массив? Можно ведь использовать CopyFromRecordset, будет гораздо быстрее.
2.Если уж через массив то его из рекордсета можно получить использовав rs.GetRowsИногда бывает нужно вывести только часть полей rs
Мы ведь не хотим пользователю показывать PK и FK. Не так ли?

А если надо показать только те поля, которые пользователь сам выбрал шириной колонок грида.
Или такая задача пока не встречалась?
...
Рейтинг: 0 / 0
Передача в Excel
    #32814922
Фотография Magnus23
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Worobjoff Magnus231.А зачем через массив? Можно ведь использовать CopyFromRecordset, будет гораздо быстрее.
2.Если уж через массив то его из рекордсета можно получить использовав rs.GetRowsИногда бывает нужно вывести только часть полей rs
Мы ведь не хотим пользователю показывать PK и FK. Не так ли?

А если надо показать только те поля, которые пользователь сам выбрал шириной колонок грида.
Или такая задача пока не встречалась?

Кроме первого из предложенных вариантов, во всех используется прямой перенос из рекордсета, а на счет выбора в гриде, так извини - это спекуляция, бывает многое, но в вопросе ничего подобного не было.

Как уже писалось в правилах - каков вопрос таков и ответ. Если нужно переносить только выбранное, гораздо продуктивнее было бы автору упомянуть об этом, чем уповать на то что мы сами догадаемся. Телепаты ведь все еще не вернулись из санатория :).

На счет GetRows возражений нет? При переносе матрицу ведь и ограничить можно как вздумается.
...
Рейтинг: 0 / 0
Передача в Excel
    #32815009
Фотография Worobjoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Magnus23Кроме первого из предложенных вариантов, во всех используется прямой перенос из рекордсета, а на счет выбора в гриде, так извини - это спекуляция, бывает многое, но в вопросе ничего подобного не было.

Как уже писалось в правилах - каков вопрос таков и ответ. Если нужно переносить только выбранное, гораздо продуктивнее было бы автору упомянуть об этом, чем уповать на то что мы сами догадаемся. Телепаты ведь все еще не вернулись из санатория :).

На счет GetRows возражений нет? При переносе матрицу ведь и ограничить можно как вздумается.Согласен со всем, что сказано.
Просто если печатешь пример, то это - из реального приложения (и иногда вымученного большой ценой). Даже и не вспомнишь почему отверг то или другое (эти же CopyFromRecordset, rs.GetRows)
...
Рейтинг: 0 / 0
18 сообщений из 18, страница 1 из 1
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Передача в Excel
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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