Я пишу процедуру pl / sql, которая экспортирует данные из Oracle в Excel. Мне нужно форматирование данных, поэтому я не могу использовать CSV. Я уже пробовал использовать XML, но он генерирует слишком большие файлы, когда я хочу экспортировать, например 70000 строк по 50 столбцов (почти 300 МБ !!!).
Вот почему я решил использовать HTML-теги для создания файла XLS - он меньше, чем XML, и я должен напрямую определять формат только некоторых специальных столбцов (строки, числа и даты форматируются автоматически в Excel). Это очень просто и удобно, но я не могу определить более одного листа.
Вы знаете, как добавить / определить более одного рабочего листа в файле Excel, написанном с использованием HTML? Я пробовал использовать формулу VBScript, например <% ActiveWorkbook.Worksheet.Add%>, но она не работает.






Вместо того, чтобы создавать файлы Excel или HTML на сервере Oracle, вы можете извлекать данные Oracle в существующий документ Excel через ODBC или OLEDB. Недостаток в том, что вы должны быть осторожны с разрешениями пользователей.
Вы можете сохранить (небольшой) лист Excel как html в Excel, а затем воспроизвести этот формат.
Вы можете получить утилиту Tom Kyte OWA-SYLK, которая поддерживает подмножество функций формата .xls.
Я использовал это раньше, и он не справляется с несколькими листами
Существует продукт под названием SQL * XL, который позволяет запускать sql-запросы из Excel, а результаты отображаются на рабочем листе (он также может обновляться).
Это коммерческий, не бесплатный, но стоит всего около 50 евро, так что не дорого. Я использую это довольно часто
ExcelDocumentType - отличное решение. Он позволяет создавать полнофункциональные многостраничные документы Excel с помощью PL / SQL. Вы можете найти это здесь:
http://radio.weblogs.com/0137094/2006/10/26.html
http://radio.weblogs.com/0137094/2009/01/02.html
(Уголок разработчика Джейсона Беннета)
У меня были похожие проблемы, и в конце концов я сделал электронную таблицу с некоторым кодом VBA, который запросил и заполнил электронную таблицу для меня. Моя задача заключалась в том, чтобы экспортировать серию таблиц, каждая из которых находится на отдельном листе, но любой флаг можно использовать для переключения на новый лист. В любом случае, дайте мне знать, если вы хотите увидеть код. Вот кусок, который может вам помочь. Просто измените строку TableSQL на то, что вам нужно. Каждая возвращенная запись будет вставлена в виде строки на листе. Затем, основываясь на выбранном вами флаге, вы можете создать и перейти к следующему листу. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация (поскольку этот конкретный пример НЕ ТОЧНО то, что вы делаете)
Private Sub getMyRows(inSchema As String, InTable As String)
Dim RS As Object
Dim TableSQL As String
Dim DataType As String
Dim DataLength As String
Dim DataPrecision As String
Dim DataScale As String
Dim ColCount As Integer
Dim WS As Worksheet
' create a sheet with the current table as name
Worksheets.Add().Name = InTable
Set RS = CreateObject("ADODB.recordset")
TableSQL = "Select * from " & inSchema & "." & InTable
' grab the data
RS.Open TableSQL, conn, adOpenStatic
For ColCount = 0 To RS.Fields.Count - 1
' set column headings to match table
ActiveSheet.Cells(1, ColCount + 1).Value = RS.Fields(ColCount).Name
Next
' copy table data to sheet
With Worksheets(InTable).Range("A2")
.CopyFromRecordset RS
End With
RS.Close
End Sub
Мы используем методы OOXML. Сначала мы писали наш собственный метод, чтобы сделать это на PL / SQL, но наш сотрудник нашел этот продукт под названием Excellant. Это вы передаете спецификацию xml с сопоставлениями столбцов и стилями / формулами (работает почти любая формула Excel), запросом, и он дает вам ответ. Таким образом, вы можете запустить gzip на clob, если хотите уменьшить его. Товар довольно дешевый, мой менеджер купил его с картой.
Веб-сайт: www.peak42solutions.com. Мы не могли использовать ODBC, поскольку сотрудники сети не разрешают доступ напрямую к базе данных. И теперь мы рассылаем клиентам счета в формате excel по электронной почте.
Спасибо,
Счет
Я нашел это решение в сети (придуманное не мной), используя SQL plus:
set feed off markup html on spool on
spool c:\table1.xls
select * from table1;
spool off
set markup html off spool off
Есть еще один проект ORA_EXCEL (www.oraexcel.com), который может создавать документы Excel из базы данных Oracle, используя только PL / SQL.
От: MSDN. Если вы хотите, чтобы ваш рабочий лист был переносимым и не полагался на системные DSN, вы можете подключиться с помощью строки подключения, например:
Dim cnn As ADODB.Connection
Set cnn = New ADODB.Connection
cnn.ConnectionString = "Provider=OraOLEDB.Oracle.1;Password=<PASSWORD>;Persist Security Info=True;User ID=<USER ID>;Data Source=<DATABASE NAME>"
cnn.Open
... затем используйте Решение Молебоя.
Ваша проблема кажется похожей на поток здесь, в SO (Запись в ExcelSheet с использованием пакета UTL_FILE в Oracle.), И недавно я смог найти простое решение этой проблемы.
Я использовал пакет под названием as_xlsx, созданный Антоном Шеффером (Создать Excel-файл с PL / SQL), и сделал несколько модификаций, поэтому он создает несколько листов внутри одной книги Excel, пропуская его через цикл.
Он также поддерживает базовое форматирование, такое как цвет ячейки, стиль шрифта, размер шрифта, границы и т. д. Это довольно изящно.
(Создайте файл Excel (.xlsx) с помощью PL / SQL).
Надеюсь это поможет!
Может показаться устаревшим, старомодным и, да, немного странным, но все же я предпочитаю использовать OracleReport для этого. Если у вас уже есть инфраструктура Forms / Report IAS, работающая btw.