0

可能重复:
如何在 Toad for Data Analyst 中将结果导出到 Excel 的不同选项卡中?

我有一个 pl/sql 代码,其中有两个过程(彼此独立),并且在执行该过程时,我希望将输出写入一个 excel 文件,但其中有两个工作表。

例如:
对于一个程序,输出应在表 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_OPENCREATE_CELL创建行和单元格。
  6. 完成工作表调用后WORKSHEET_CLOSE
  7. 如果您需要再次调用另一个工作表WORKSHEET_OPEN来打开另一个工作表,请使用ROW_OPENCREATE_CELL填充它。
  8. 完成后,调用WORKBOOK_CLOSE以关闭工作簿。
  9. 用于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;
于 2012-08-29T11:20:12.867 回答
0

常用方法是使用Microsoft XML 电子表格 (XMLSS)创建文件,将内容附加到VARCHARCLOB.

例如,要编写一个单元格,您可以执行以下操作:

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 实用程序库。

于 2012-08-29T03:16:20.900 回答