Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / Передача в Excel / 18 сообщений из 18, страница 1 из 1
03.12.2004, 06:07:58
    #32810807
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
Помогите, пожалуйста!!!
у меня есть datagrid, как все его содержимое оправить в Excel. надо это сделать через массив. подскажите, как?
...
Рейтинг: 0 / 0
03.12.2004, 07:48:25
    #32810852
DDirks
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
Для 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
03.12.2004, 10:01:07
    #32811041
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
этот пример работает с msflexgrid. а мне надо с datagrid. у него нет свойств: cols, rows, textmatrix
...
Рейтинг: 0 / 0
03.12.2004, 11:04:16
    #32811212
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
этот пример работает с msflexgrid. а мне надо с datagrid. у него нет свойств: cols, rows, textmatrix
...
Рейтинг: 0 / 0
03.12.2004, 11:06:00
    #32811220
big-duke
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
а в свой грид вы данные получаете через курсор ?
тогда CopyFromRecordset
...
Рейтинг: 0 / 0
06.12.2004, 05:19:24
    #32813596
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
если не трудно, покажите пример кода. не очень понятно.
...
Рейтинг: 0 / 0
06.12.2004, 05:33:57
    #32813598
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
если не трудно, покажите пример кода. не очень понятно.
...
Рейтинг: 0 / 0
06.12.2004, 05:39:26
    #32813600
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
если не трудно, покажите пример кода. не очень понятно.
...
Рейтинг: 0 / 0
06.12.2004, 08:26:10
    #32813662
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
Код: 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
06.12.2004, 08:29:33
    #32813664
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
+
Код: plaintext
1.
2.
rДанные = "A" & (НачСтрока +  1 ) & ":" & XCol_(k) & rs.RecordCount + НачСтрока
   ReDim v(rs.RecordCount, k) 'Забыл указать
   If rs.RecordCount >  0  Then
...
Рейтинг: 0 / 0
06.12.2004, 08:42:47
    #32813673
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
Код: plaintext
1.
      ex1.Visible = True   'Еще забыл
      ws.Range(rДанные) = v
...
Рейтинг: 0 / 0
06.12.2004, 09:32:52
    #32813735
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
спасибо огромное, код просто супер. Очень мне помог.
...
Рейтинг: 0 / 0
06.12.2004, 09:35:47
    #32813739
Настенька
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
спасибо огромное, код просто супер. Очень мне помог.
...
Рейтинг: 0 / 0
06.12.2004, 11:07:07
    #32813925
Worobjoff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
Ну если это получилось, то пригодится и это:
Код: 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
06.12.2004, 15:56:57
    #32814757
Magnus23
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача в Excel
1.А зачем через массив? Можно ведь использовать CopyFromRecordset, будет гораздо быстрее.
2.Если уж через массив то его из рекордсета можно получить использовав rs.GetRows
3.Настенька фотку давай! :)


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

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

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

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

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

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

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

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


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