2012-08-28 30 views

回答

0

常見的方法是創建與Microsoft XML Spreadsheet (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等。

有關更多信息和示例,請參閱Oracle PL/SQL Utility Library, codename "Alexandria"

+0

但我使用utl_file..and我很困惑,使用xml..shall我給你的代碼,你會編輯更改pls ?? .... – user1620464

0

如果你真的想解決這個問題,這裏有一些我在某處找到的代碼。警告:爲了我的目的,我放棄了這種方法,因爲我發現將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; 
相關問題