0

重複の可能性:
Toad for Data Analyst で結果を Excel の別のタブにエクスポートする方法は?

2 つのプロシージャが含まれている pl/sql コードがあり (互いに独立しています)、プロシージャを実行すると、出力が 1 つの Excel ファイルに書き込まれますが、2 つのワークシートが含まれます。

例:
1 つの手順の場合、出力はシート 1 にある必要があります

次の手順では、出力はシート 2 にある必要があります。

誰でも助けることができますか?私は使っているutl_file

4

2 に答える 2

1

本当にこれに取り組みたい場合は、私がどこかで拾ったコードを次に示します。警告: XML データを Excel にロードするのが遅すぎることがわかったので、このアプローチを断念しました。コンマ区切り値ファイルの読み込みははるかに高速ですが、きれいな書式設定は失われます (私の場合は重要ではありません)。

使用するには:

  1. WORKBOOK_OPENワークブックを表す CLOB を初期化するために 呼び出します。
  2. WORKSHEET_OPENブックにワークシートを作成するために呼び出します。
  3. ROW_OPEN行を作成するために使用します。
  4. 一連の呼び出しをCREATE_CELL行って、行のセルを作成および設定します。
  5. ROW_OPEN行とCREATE_CELLセルを作成するための呼び出しを続けます。
  6. ワークシートの呼び出しが完了したらWORKSHEET_CLOSE
  7. WORKSHEET_OPEN別のシートを開くために別のワークシートを再度呼び出す必要がある場合は、 と を使用ROW_OPENCREATE_CELLてデータを入力します。
  8. 完了したら、 を呼び出しWORKBOOK_CLOSEてブックを閉じます。
  9. EXPORT_WORKBOOK_TO_FILEワークブックをファイルに書き込むために使用します。

EXPORT_WORKBOOK_TO_FILEUTL_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;
于 2012-08-29T11:20:12.867 に答える
0

一般的な方法は、 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」を参照してください。

于 2012-08-29T03:16:20.900 に答える