2 つのプロシージャが含まれている pl/sql コードがあり (互いに独立しています)、プロシージャを実行すると、出力が 1 つの Excel ファイルに書き込まれますが、2 つのワークシートが含まれます。
例:
1 つの手順の場合、出力はシート 1 にある必要があります
次の手順では、出力はシート 2 にある必要があります。
誰でも助けることができますか?私は使っているutl_file
2 つのプロシージャが含まれている pl/sql コードがあり (互いに独立しています)、プロシージャを実行すると、出力が 1 つの Excel ファイルに書き込まれますが、2 つのワークシートが含まれます。
例:
1 つの手順の場合、出力はシート 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 など、要素を開閉する関数を作成するだけで済みます。
詳細と例については、Oracle PL/SQL Utility Library、コードネーム「Alexandria」を参照してください。