1

下面的代码将生成带有两个明显错误的文件:

  1. SpreadSheetSetColumnWidth 在第二个选项卡上的 21 行后似乎停止工作
  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操作保存它。

更新:至于为什么,在您的原始代码中,您要创建两个单独的工作簿对象。从概念上讲,它就像创建两个单独的 Excel 文件,每个文件一张。然后尝试将它们合并到一个文件中:

     c:/path/to/MyWorkbookNamedTab1.xlsx   

          | Sheet1 / 

     c:/path/to/MyWorkbookNamedTab2.xlsx   

          | Sheet1 / 

这与创建具有多工作表的单个工作簿不同(如上面的链接中所示):

     c:/path/to/MySingleWorkbook.xlsx   

          | Sheet1 / Sheet2 /

没有简单的方法可以合并单独的文件(或工作簿)。您基本上必须将所有内容从一个工作簿复制到另一个工作簿(这比听起来要复杂得多)。就是action=update这样。在复制过程中的某个地方,它会丢失其中一张图像。我不确定这是否是由于 POI 中的一个 CF 错误。

无论如何,最简单的解决方案是完全避免复制的需要。如果您坚持使用单个工作簿(并向其中添加多工作表),则无需复制或合并。一切都已包含在一个工作簿中。因此,所action=write要做的就是将其完全“按原样”保存到磁盘。

于 2013-03-01T18:39:35.343 回答