1

以下のコードは、2つの注目すべきエラーを含むファイルを生成します。

  1. SpreadSheetSetColumnWidthは、2番目のタブの21行後に機能を停止しているように見えます
  2. 画像は2番目のタブに表示されません


うまくいけば、これは単なる新人の間違いであり、日付の書式設定の問題に沿ったものではありません。修正/改善するための助けや建設的な批判は大歓迎です。

<!--- We cannot directly reference the image --->
<cfimage source="img/A2LA_Logo.jpg" name="A2LA_Logo">
<!--- We need an absolute path, so get the current directory path.  --->
<cfset theFile=GetDirectoryFromPath(GetCurrentTemplatePath()) & "Final_Report.xlsx">

<cfscript> 
/*********************************************************************** Page 1 ***********************************************************************/
//Create a new Excel spreadsheet object - SpreadsheetNew("Tab name", "yes=2007+ no=2003");
    Tab1 = SpreadsheetNew("Final Report Page 1","yes"); 

    SpreadSheetSetRowHeight(Tab1,1,45);
    SpreadsheetSetCellValue(Tab1,"Final Test Report",1,1); SpreadsheetMergeCells(Tab1,1,1,1,10);
    SpreadsheetAddImage(Tab1, A2LA_Logo,"jpg","1,12,2,20"); 
    SpreadsheetSetCellValue(Tab1,"Confidential",1,21); SpreadsheetMergeCells(Tab1,1,1,21,30);
</cfscript>

<cfscript>  
/*********************************************************************** Page 2 ***********************************************************************/
//Create a new Excel spreadsheet object - SpreadsheetNew("Tab name", "yes=2007+ no=2003");
    Tab2 = SpreadsheetNew("Final Report Page 2","yes"); 

    SpreadSheetSetRowHeight(Tab2,1,45);
    SpreadsheetSetCellValue(Tab2,"Final Test Report",1,1); SpreadsheetMergeCells(Tab2,1,1,1,10);
    SpreadsheetAddImage(Tab1, A2LA_Logo,"jpg","1,12,2,20"); 
    SpreadsheetSetCellValue(Tab2,"Confidential",1,21); SpreadsheetMergeCells(Tab2,1,1,21,30);
</cfscript> 

<!--- There must be a better way --->
<cfscript> 
    for(index=1; index LTE 30; index++) {SpreadSheetSetColumnWidth(Tab1,index,3);}
    for(index=1; index LTE 30; index++) {SpreadSheetSetColumnWidth(Tab2,index,3);}
</cfscript> 

<!--- Write the spreadsheet to a file, replacing any existing file, then append the other tabs.  --->
<cfspreadsheet action="write" filename="#theFile#" name="Tab1" overwrite=true>
<cfspreadsheet action="update" filename="#theFile#" name="Tab2">

<!--- Needs to be at the bottom --->
<cfheader name="Content-disposition" value="attachment;filename=Final_Report.xlsx">
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" file="#theFile#">
<!--- Clean up your mess after it is served to the browser --->
<cffile action="delete" file="#theFile#">
4

1 に答える 1

2

(コメントより)

個別に保存すると画像が表示されます。updateバグだと思います。私の通常の推奨事項は、「回避できる場合は更新を使用しない」です。単一のワークブックを作成し、複数のシートを追加して、単一のwriteアクションで保存します。

更新:理由については、元のコードで、2つの別々のブックオブジェクトを作成しています。概念的には、それぞれ1枚のシートで2つの別々のExcelファイルを作成するようなものと考えてください。次に、それらを1つのファイルにマージしようとします。

     c:/path/to/MyWorkbookNamedTab1.xlsx   

          | Sheet1 / 

     c:/path/to/MyWorkbookNamedTab2.xlsx   

          | Sheet1 / 

これは、複数のシートを含む単一のワークブックを作成することとは異なります(上記のリンクのように)。

     c:/path/to/MySingleWorkbook.xlsx   

          | Sheet1 / Sheet2 /

個別のファイル(またはワークブック)をマージする簡単な方法はありません。基本的に、あるワークブックから別のワークブックにすべてをコピーする必要があります(これは思ったよりもはるかに複雑です)。それが何をするかaction=updateです。コピープロセスのどこかで、画像の1つが失われます。それがPOIのCFバグによるものかどうかはわかりません。

いずれにせよ、最も簡単な解決策は、コピーの必要性を完全に回避することです。単一のワークブックに固執する(そしてそれに複数のシートを追加する)場合は、コピーまたはマージする必要はありません。すべてがすでに1つのワークブックに含まれています。したがって、必要なのaction=writeは、正確に「そのまま」ディスクに保存することだけです。

于 2013-03-01T18:39:35.343 に答える