我有一个 pl/sql 代码,其中有两个过程(彼此独立),并且在执行该过程时,我希望将输出写入一个 excel 文件,但其中有两个工作表。
例如:
对于一个程序,输出应在表 1 中
对于下一个程序,输出应在表 2 中。
有人可以帮忙吗?我在用utl_file
我有一个 pl/sql 代码,其中有两个过程(彼此独立),并且在执行该过程时,我希望将输出写入一个 excel 文件,但其中有两个工作表。
例如:
对于一个程序,输出应在表 1 中
对于下一个程序,输出应在表 2 中。
有人可以帮忙吗?我在用utl_file
如果你真的想解决这个问题,这里有一些我在某处捡到的代码。警告:出于我的目的,我放弃了这种方法,因为我发现将 XML 数据加载到 Excel 中太慢了。尽管您丢失了漂亮的格式(在我的情况下并不重要),但加载逗号分隔值文件的速度要快得多。
要使用:
WORKBOOK_OPEN
以初始化表示工作簿的 CLOB。 WORKSHEET_OPEN
以在书中创建工作表。ROW_OPEN
创建行。CREATE_CELL
创建和填充行中的单元格。 ROW_OPEN
并CREATE_CELL
创建行和单元格。WORKSHEET_CLOSE
。WORKSHEET_OPEN
来打开另一个工作表,请使用ROW_OPEN
并CREATE_CELL
填充它。WORKBOOK_CLOSE
以关闭工作簿。EXPORT_WORKBOOK_TO_FILE
将工作簿写入文件。请注意,EXPORT_WORKBOOK_TO_FILE
使用 UTL_FILE 写入其输出,满足您使用 UTL_FILE 的要求。
分享和享受。
PROCEDURE WORKBOOK_OPEN(pWorkbook IN OUT NOCOPY CLOB) IS
BEGIN
pWorkbook := '<?xml version="1.0" encoding="ISO-8859-9"?>' || chr(10) ||
'<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"' || chr(10) ||
'xmlns:o="urn:schemas-microsoft-com:office:office"' || chr(10) ||
'xmlns:x="urn:schemas-microsoft-com:office:excel"' || chr(10) ||
'xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"' || chr(10) ||
'xmlns:html="http://www.w3.org/TR/REC-html40">' || chr(10) ||
'<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">' || chr(10) ||
'<WindowHeight>8580</WindowHeight>' || chr(10) ||
'<WindowWidth>15180</WindowWidth>' || chr(10) ||
'<WindowTopX>120</WindowTopX>' || chr(10) ||
'<WindowTopY>45</WindowTopY>' || chr(10) ||
'<ProtectStructure>False</ProtectStructure>' || chr(10) ||
'<ProtectWindows>False</ProtectWindows>' || chr(10) ||
'</ExcelWorkbook>' || chr(10) ||
'<Styles>' || chr(10) ||
'<Style ss:ID="Default" ss:Name="Normal">' || chr(10) ||
'<Alignment ss:Vertical="Bottom"/>' || chr(10) ||
'<Borders/>' || chr(10) ||
'<Font/>' || chr(10) ||
'<Interior/>' || chr(10) ||
'<NumberFormat/>' || chr(10) ||
'<Protection/>' || chr(10) ||
'</Style>' || chr(10) ||
'<Style ss:ID="s22">' || chr(10) ||
'<Font x:Family="Swiss" ss:Bold="1" ss:Underline="Single"/>' || chr(10) ||
'</Style>' || chr(10) ||
'</Styles>';
END WORKBOOK_OPEN;
PROCEDURE WORKBOOK_CLOSE(pWorkbook IN OUT NOCOPY CLOB) IS
BEGIN
pWorkbook := pWorkbook || '</Workbook>';
END WORKBOOK_CLOSE;
PROCEDURE WORKSHEET_OPEN(pWorkbook IN OUT NOCOPY CLOB,
pstrWorksheet_name IN VARCHAR2) IS
BEGIN
--
-- Create the worksheet
--
pWorkbook := pWorkbook || '<Worksheet ss:Name="' || pstrWorksheet_name || '"><Table>';
END WORKSHEET_OPEN;
PROCEDURE WORKSHEET_CLOSE(pWorkbook IN OUT NOCOPY CLOB) IS
BEGIN
pWorkbook := pWorkbook || '</Table></Worksheet>';
END WORKSHEET_CLOSE;
PROCEDURE ROW_OPEN(pWorkbook IN OUT NOCOPY CLOB) IS
BEGIN
pWorkbook := pWorkbook || '<Row>';
END ROW_OPEN;
PROCEDURE ROW_CLOSE(pWorkbook IN OUT NOCOPY CLOB) IS
BEGIN
pWorkbook := pWorkbook || '</Row>' || chr(10);
END row_close;
PROCEDURE CREATE_CELL(pWorkbook IN OUT NOCOPY CLOB,
pstrCell_contents IN VARCHAR2) IS
BEGIN
pWorkbook := pWorkbook || '<Cell><Data ss:Type="String"> ' ||
pstrCell_contents || ' </Data></Cell>';
END CREATE_CELL;
PROCEDURE EXPORT_WORKBOOK_TO_FILE(pstrDirectory_name IN VARCHAR2,
pstrFilename IN VARCHAR2,
pWorkbook IN CLOB)
IS
nChunk_size CONSTANT BINARY_INTEGER := 32767;
strChunk VARCHAR2(32767);
nPos_chr10 NUMBER;
nWorkbook_len NUMBER;
fHandle UTL_FILE.FILE_TYPE;
nPos NUMBER := 1;
BEGIN
nWorkbook_len := DBMS_LOB.GETLENGTH(pWorkbook);
fHandle := UTL_FILE.FOPEN(pstrDirectory_name, pstrFilename, 'W', nChunk_size);
WHILE nPos < nWorkbook_len LOOP
strChunk := dbms_lob.substr(pWorkbook, nChunk_size, nPos);
EXIT WHEN strChunk IS NULL;
nPos_chr10 := INSTR(strChunk, CHR(10), -1);
IF nPos_chr10 != 0 THEN
strChunk := SUBSTR(strChunk, 1, nPos_chr10 - 1);
END IF;
UTL_FILE.PUT_LINE(fHandle, strChunk, TRUE);
nPos := nPos + LEAST(LENGTH(strChunk)+1, nChunk_size);
END LOOP;
UTL_FILE.FCLOSE(fHandle);
EXCEPTION
WHEN OTHERS THEN
IF UTL_FILE.IS_OPEN(fHandle) THEN
UTL_FILE.FCLOSE(fHandle);
END IF;
RAISE;
END EXPORT_WORKBOOK_TO_FILE;
常用方法是使用Microsoft XML 电子表格 (XMLSS)创建文件,将内容附加到VARCHAR
或CLOB
.
例如,要编写一个单元格,您可以执行以下操作:
xmlBody := xmlBody || '<Cell><Data ss:Type="String">' || stringContent || '</Data></Cell>';
现在,要打开一个新工作表,您可以执行以下操作:
xmlBody := xmlBody || '<Worksheet ss:Name="' || yourWorksheetName || '"><Table>';
要关闭它(在附加所有内容之后):
xmlBody := xmlBody || '</Table></Worksheet>';
有一些实用程序包可以让您执行此操作,或者您可以像我一样编写自己的。您只需编写函数来打开和关闭元素,例如 openRow、closeRow、openWorkbook、closeWorkbook、openWorksheet 等。
有关更多信息和示例,请参阅代号为“Alexandria”的 Oracle PL/SQL 实用程序库。