Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
dimachus
Зарегистрирован: 07.10.2011 Сообщения: 108
|
Добавлено: Чт Фев 27, 2020 11:14 Заголовок сообщения: Быстрый вывод в Excel |
|
|
Добрый день коллеги!
Задался задачей, как на платформе Oracle сделать вывод большого количества данных (заранее наполненного двумерного массива) в Excel.
Хочется не по строчно выводить данные, а загнать в массив и фигануть всё средствами VBA.
Кто-нибудь так делал? Получалось?
Если пробовать так:
Код: |
number ir[1][2];
ir[0][0] = 3;
ir[0][1] = 4;
m_Excel.VBScript("Dim TheRange(1,2)");
m_Excel.VBScript("TheRange(0,0) = " + ir[0][0]);
m_Excel.VBScript("TheRange(0,1) = " + ir[0][1]);
m_Excel.VBScript("Range(\"H1:I1\").Value = TheRange");
m_Excel.VBScript("Erase TheRange");
|
то нигде не ругается.. но ничего и не делает
Код: |
m_Excel.VBScript("TheRange(0,0) = 3");
m_Excel.VBScript("Range(\"H1\").Value = TheRange(0,0)");
|
так тоже ничего...
Поддерживаются ли вообще массивы для передачи в VBA в Z-языке?
P.S. Есть ещё менее красивая, но действующая идея.. вывести запрос с данными на сервер приложений с помощью to_Excel( а потом скопировать на компьютер пользователя.. но тогда очень ограничено получается.
Буду признателен за различные идеи и мысли) |
|
Вернуться к началу |
|
|
Optimizer
Зарегистрирован: 11.03.2020 Сообщения: 3
|
Добавлено: Ср Мар 11, 2020 10:23 Заголовок сообщения: |
|
|
Добрый день, коллеги.
Столкнулись с аналогичной проблемой при построении больших отчетов.
На данный момент используем следующие функции поячеячной записи:
Код: | m_Excel_num
m_Excel_str |
Но это работает быстро только на маленьких отчетах до пары тысяч строк и небольшого количества столбцов.
Для больших отчетов формирование может длиться часами, что не есть клиентоориентированный подход.
То есть сам запрос формируется за несколько минут и потом 95% времени он выгружается в Excel поячеячно.
Наверняка должен быть способ более быстрого вывода записей, возможно через массив, подобно тому как описал топикстартер, возможно через recordset или каким-то иным образом.
Помогите, пожалуйста!
Спасибо. |
|
Вернуться к началу |
|
|
NewAge
Зарегистрирован: 11.06.2010 Сообщения: 108
|
Добавлено: Ср Мар 11, 2020 11:00 Заголовок сообщения: |
|
|
А чем QueryTables не подходит??? У меня отчет, который ранее выводился более 4 часов, сейчас формируется за 20 минут. |
|
Вернуться к началу |
|
|
_Alexander_
Зарегистрирован: 10.03.2020 Сообщения: 3
|
Добавлено: Ср Мар 11, 2020 11:15 Заголовок сообщения: |
|
|
На платформе MS SQL для передачи результатов запроса в Excel используем OpenQuery. Самый быстрый вариант для выдачи отчета пользователю. Запрос может быть в макросе в xls-файле или вызываться из x-языка. А у Вас, видимо, можно и из z через m_Excel.VBScript(...) |
|
Вернуться к началу |
|
|
Optimizer
Зарегистрирован: 11.03.2020 Сообщения: 3
|
Добавлено: Ср Мар 11, 2020 17:47 Заголовок сообщения: |
|
|
NewAge писал(а): | А чем QueryTables не подходит??? У меня отчет, который ранее выводился более 4 часов, сейчас формируется за 20 минут. |
Можете прислать пример на Z-языке?
Работает ли он для Web версии БК?
У пользователей нет толстого клиента.
Спасибо. |
|
Вернуться к началу |
|
|
Optimizer
Зарегистрирован: 11.03.2020 Сообщения: 3
|
Добавлено: Чт Мар 12, 2020 13:31 Заголовок сообщения: |
|
|
_Alexander_ писал(а): | На платформе MS SQL для передачи результатов запроса в Excel используем OpenQuery. Самый быстрый вариант для выдачи отчета пользователю. Запрос может быть в макросе в xls-файле или вызываться из x-языка. А у Вас, видимо, можно и из z через m_Excel.VBScript(...) |
Может быть и можно через m_Excel.VBScript,только к сожалению нигде не нашли документацию и примеры по тому, что и как в нем прописывать. |
|
Вернуться к началу |
|
|
_Alexander_
Зарегистрирован: 10.03.2020 Сообщения: 3
|
Добавлено: Чт Мар 12, 2020 16:41 Заголовок сообщения: |
|
|
Вот пример кода для x-языка SQL-версии.
Предполагается, что Excel-файл уже открыт.
wb = ActiveWorkbook
Код: | vb {
y = wb.ActiveSheet.Cells(7,4)
With wb.ActiveSheet.QueryTables.Add("ODBC;DSN=MyBase;DATABASE=MyBase;LANGUAGE=us_english;Trusted_Connection=Yes", wb.Application.Range("A1"))
.CommandText = "exec dbo.MyBase_holiday_work_report @y=" & y
.Name = "export_table"
.FieldNames = True
.RowNumbers = False
.FillAdjacentFormulas = False
.PreserveFormatting = True
.RefreshOnFileOpen = False
.BackgroundQuery = False
.RefreshStyle = xlInsertDeleteCells
.SavePassword = False
.SaveData = True
.AdjustColumnWidth = True
.RefreshPeriod = 0
.PreserveColumnInfo = True
.Refresh(BackgroundQuery=False)
End With
While wb.ActiveSheet.QueryTables("export_table").Refreshing = True
Wend
xlInsideVertical = 11
xlInsideHorizontal = 12
xlContinuous = 1
xlThin = 2
xlAutomatic = -4105
With wb.ActiveSheet.QueryTables("export_table").ResultRange.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
With wb.ActiveSheet.QueryTables("export_table").ResultRange.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = xlAutomatic
End With
wb.ActiveSheet.QueryTables("export_table").Delete
wb.ActiveSheet.Cells(1,1).Select
};
|
|
|
Вернуться к началу |
|
|
|