Ответ 1
Вместо создания файлов Excel или HTML на сервере Oracle вы можете получить данные Oracle в существующий документ Excel через ODBC или OLEDB. Недостатком является то, что вы должны быть осторожны с правами пользователя.
Я пишу 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. Недостатком является то, что вы должны быть осторожны с правами пользователя.
Я разработал пакет в pl/sql для генерации файла excel с форматированием и несколькими рабочими листами. Это может быть полезно для вас.
http://sanjeev-oracle-world.blogspot.com/2007/06/create-excel-workbook-by-plsql-code.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
Вы можете получить утилиту Tom Kyte OWA-SYLK, которая поддерживает подмножество функций формата .xls.
ExcelDocumentType - отличное решение. Он позволяет создавать полнофункциональные многостраничные документы Excel с помощью PL/SQL. Вы можете найти его здесь:
http://radio.weblogs.com/0137094/2006/10/26.html
http://radio.weblogs.com/0137094/2009/01/02.html
(Уголок разработчика Джейсона Беннетта)
Я нашел это решение в Интернете (не изобретенное мной), используя 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
... затем используйте решение Moleboy.
Вы можете сохранить (маленький) лист Excel как html в Excel, а затем воспроизвести этот формат.
Существует продукт под названием SQL * XL, который позволяет запускать SQL-запросы из Excel, и результаты отображаются на листе (он также может обновляться).
Это коммерческий, не бесплатный, но всего около 50 евро, поэтому не дорого. Я использую его довольно много.
Мы используем методы OOXML. Сначала мы писали собственный метод, чтобы сделать это в PL/SQL, но сотрудник нашел этот продукт под названием Excellant. Это вы переходите в спецификацию xml с сопоставлениями столбцов и стилями/формулами (почти любая работа формулы excel), запрос, и это дает вам клобу обратно. Таким образом, вы можете запустить gzip в clob, если хотите уменьшить его. Продукт довольно cheep мой менеджер купил его с pcard.
Веб-сайт www.peak42solutions.com. Мы не могли использовать ODBC, поскольку пользователи сети не разрешают доступ непосредственно к базе данных. И мы теперь отправляем по электронной почте фактурирование в excel для клиентов.
Спасибо,
Билл
Ваша проблема кажется похожей на поток здесь в SO (Запись в ExcelSheet с использованием пакета UTL_FILE в Oracle.), и я смог найти простое решение этой проблемы в последнее время.
я использовал пакет под названием as_xlsx
, созданный Антоном Шеффером, (Создать файл Excel с PL/SQL) и сделал несколько изменений, поэтому он создает несколько листов внутри одной книги Excel, помещая ее через Loop.
Он также поддерживает некоторые базовые форматирования, такие как цвет ячеек, стиль шрифта, размер шрифта, границы и т.д. Его довольно изящный.
(Создать файл Excel (.xlsx) с использованием PL/SQL).
Надеюсь, это поможет!