使用来自查询的多个工作表创build工作簿

我正在使用ColdFusion 2016,我发现我使用的服务器只有CF9,我对此很新。 我一直在努力更新现有的代码,以适应用户现在想要的。 到目前为止,我已经成功了,但这超出了我。 我有一个网站,生成一个Excel工作簿。 它使用HTML和一个查询来创build它。 以A1中的查询名称开始,A3中的报表date,A5:H5中的表格标题,然后是A6:H53中的数据(确切的长度可以变化,但始终来自列A-H)。 我将发布用于创build工作簿的内容。 我想要做的是使用3个更多的查询来添加3张更多的工作簿。 我已经尝试添加一个我在这里find的function,并没有什么好处。 我试图修改现有的代码来尝试和使用所有4个查询,没有喜悦。

任何帮助,将不胜感激。 让我知道如果我需要添加更多的细节。 这里的代码:(我添加了什么我添加试图让这个工作的意见)

<cfsilent> <!--- ******************************************************************* Filename: execSummary_Excel.cfm, v1.0 03/07/2012 Created By: Original Writer Description: Excel report export for Executive Summary Report. Change History: Date........Name...........Description of Change........................ 08/01/2012 Original Writer Added committed column. 02/28/2013 Original Writer Added stateGM and GM. *************************************************************************---> <cfinvoke component="financial.financial" method="getExecSummary" returnvariable="qExecSummary"> <cfinvokeargument name="level" value="#URL.level#" /> <cfinvokeargument name="stateGM" value="#URL.stateGM#" /> <cfinvokeargument name="GM" value="#URL.GM#" /> <cfinvokeargument name="engVP" value="#URL.engVP#" /> <cfinvokeargument name="engDir" value="#URL.engDir#" /> </cfinvoke> <!---Added this to test if I can get more than one sheet to the Workbook---> <cfinvoke component="financial.financial" method="getExecSummary_OLD" returnvariable="qExecSummary_OLD"> <cfinvokeargument name="level" value="#URL.level#" /> <cfinvokeargument name="stateGM" value="#URL.stateGM#" /> <cfinvokeargument name="GM" value="#URL.GM#" /> <cfinvokeargument name="engVP" value="#URL.engVP#" /> <cfinvokeargument name="engDir" value="#URL.engDir#" /> </cfinvoke> <!--- Get Report Date since qExecSummary is more complex than the other report queries ---> <cfquery name="qRpt_Date" datasource="#application.dsn#"> SELECT DISTINCT rpt_date FROM fin_data </cfquery> <cfsetting requesttimeout="5000" /> </cfsilent> <!---Added this as a function that should allow me to use multiple queries and create a workbook with more than one sheet---> <cfscript> //Create new workbook with one sheet //by default that sheet is the active sheet Workbook = SpreadsheetNew("ExecSummary"); //Add Data to the sheet format1.bold="true"; formatNum.dataformat="0.00%"; Spreadsheetformatcell(Workbook,format1,1,1); SpreadSheetSetCellValue(Workbook,"Executive Summary Report",1,1); Spreadsheetformatcell(Workbook,format1,3,1); SpreadSheetSetCellValue(Workbook,"#dateFormat(now(),'mm/dd/yyyy')#",3,1); SpreadSheetSetCellValue(Workbook,"Data Date",5,1); SpreadSheetSetCellValue(Workbook,"Level",5,2); SpreadSheetSetCellValue(Workbook,"Name",5,3); SpreadSheetSetCellValue(Workbook,"Description",5,4); SpreadSheetSetCellValue(Workbook,"Budget",5,5); SpreadSheetSetCellValue(Workbook,"Commited",5,6); SpreadSheetSetCellValue(Workbook,"Spent YTD",5,7); SpreadSheetSetCellValue(Workbook,"% Spent",5,8); arr="Here"; writedump(arr); //if (qExecSummary.recordCount) { // rowNum = 6; // arr="Here"; // writedump(rowNum); //alert(qExecSummary.recordCount); //for(dataRow in qExecSummary){ //SpreadSheetSetCellValue(Workbook,dateFormat(qRpt_Date.rpt_Date, 'mm/dd/yyyy'),rowNum,1); //SpreadSheetSetCellValue(Workbook,dataRow.responsible,rowNum,2); //SpreadSheetSetCellValue(Workbook,dataRow.name,rowNum,3); //SpreadSheetSetCellValue(Workbook,dataRow.Description,rowNum,4); //SpreadSheetSetCellValue(Workbook,dataRow.bud_sum,rowNum,5); //SpreadSheetSetCellValue(Workbook,dataRow.committed,rowNum,6); //SpreadSheetSetCellValue(Workbook,dataRow.Spent_YTD,rowNum,7); /*if (qExecSummary.bud_sum NEQ 0){ Spreadsheetformatcell(Workbook,formatNum,rowNum,8); //percentSpent="#(qExecSummary.Spent_YTD/qExecSummary.bud_sum)*100#"; SpreadSheetSetCellValue(Workbook,(dataRow.Spent_YTD/dataRow.bud_sum)*100,rowNum,8); } else {*/ //SpreadSheetSetCellValue(Workbook,0,rowNum,8); //} //rowNum++; //} //End of WriteOutput //} else { // SpreadSheetAddRows(Workbook,"No results for your criteria."); //} </cfscript> <!--- <cffunction name="QueriesToXLS" access="public"> <cfargument name="queryArr" required="true"> <cfargument name="sheetNameArr" required="false"> <cfset tempPath="C:\Temp\ExecutiveSummary" & ".xls"> <cfset counter= 1> <cfloop array="#ARGUMENTS.queryArr#" index="i" > <cfset sheetName="Sheet#counter#"> <cfif isDefined("ARGUMENTS.sheetNameArr")> <cfset sheetName=ARGUMENTS.sheetNameArr[counter]> </cfif> <cfspreadsheet action="update" filename="#tempPath#" query="i" sheetName="#sheetName#"/> <cfset counter += 1> </cfloop> <cfreturn SpreadsheetRead(tempPath)> </cffunction> <cfset xlsData = QueriesToXLS([qExecSummary,qExecSummary],["ExecutiveSummary","ExecutiveSummaryOLD"])> ---> <cfheader name="Content-Disposition" value='attachment; filename="execSummaryNew.xls"'> <!---cfcontent type="application/msexcel" variable="#SpreadsheetReadBinary(xlsData)#" reset="true"---> <cfcontent type="application/vnd.ms-excel"> <!---This is where the application type is being set to Excel---> <!---html xmlns:x="urn:schemas-microsoft-com:office:excel"> <head> </head> <h2>Executive Summary Report</h2> <cfoutput> <p>#dateFormat(now(), 'mm/dd/yyyy')#</p> </cfoutput> <table id="tableOne" class="yui" cellspacing="0" cellpadding="5"> <thead> <tr> <th>Data Date</th> <th>Level</th> <th>Name</th> <th>Description</th> <th>Budget</th> <th>Committed</th> <th>Spent YTD</th> <th>% Spent</th> </tr> </thead> <cfif qExecSummary.recordCount> <tbody> <cfoutput query="qExecSummary"> <tr> <td>#dateFormat(qRpt_Date.rpt_Date, 'mm/dd/yyyy')#</td> <td>#qExecSummary.responsible#</td> <td>#qExecSummary.name#</td> <td>#qExecSummary.Description#</td> <td>#qExecSummary.bud_sum#</td> <td>#qExecSummary.committed#</td> <td>#qExecSummary.Spent_YTD#</td> <td><cfif qExecSummary.bud_sum NEQ 0> #numberFormat((qExecSummary.Spent_YTD/qExecSummary.bud_sum)*100,"9.9")#% <cfelse> 0 </cfif> </td> </tr> </cfoutput> </tbody> <cfelse> <tr> <td colspan="9">No results for your criteria.</td> </tr> </cfif> </table> </html---> 

编辑

我已经尝试了在副本中引用的问题上提供的答案。 我无法使它与我有的查询一起工作。 我已经添加了下面的代码来代替我的脚本:

编辑2

更新了这个脚本,仍然没有工作。 writeOutput()错误。我不确定如何实现使用查询来创build行的数据?

  <cfscript> //Create new workbook with one sheet //by default that sheet is the active sheet Workbook = SpreadsheetNew("ExecSummary"); //Add Data to the sheet format1.bold="true"; formatNum.dataformat="0.00%"; Spreadsheetformatcell(Workbook,format1,1,1); SpreadSheetSetCellValue(Workbook,"Executive Summary Report",1,1); Spreadsheetformatcell(Workbook,format1,3,1); SpreadSheetSetCellValue(Workbook,"#dateFormat(now(),'mm/dd/yyyy')#",3,1); SpreadSheetSetCellValue(Workbook,"Data Date",5,1); SpreadSheetSetCellValue(Workbook,"Level",5,2); SpreadSheetSetCellValue(Workbook,"Name",5,3); SpreadSheetSetCellValue(Workbook,"Description",5,4); SpreadSheetSetCellValue(Workbook,"Budget",5,5); SpreadSheetSetCellValue(Workbook,"Commited",5,6); SpreadSheetSetCellValue(Workbook,"Spent YTD",5,7); SpreadSheetSetCellValue(Workbook,"% Spent",5,8); if (qExecSummary.recordCount) { rowNum = 6; //writeOutput(query="qExecSummary"); for(dataRow in qExecSummary){ SpreadSheetSetCellValue(Workbook,dateFormat(qRpt_Date.rpt_Date, 'mm/dd/yyyy'),rowNum,1); SpreadSheetSetCellValue(Workbook,dataRow.responsible,rowNum,2); SpreadSheetSetCellValue(Workbook,dataRow.name,rowNum,3); SpreadSheetSetCellValue(Workbook,dataRow.Description,rowNum,4); SpreadSheetSetCellValue(Workbook,dataRow.bud_sum,rowNum,5); SpreadSheetSetCellValue(Workbook,dataRow.committed,rowNum,6); SpreadSheetSetCellValue(Workbook,dataRow.Spent_YTD,rowNum,7); if (qExecSummary.bud_sum NEQ 0){ Spreadsheetformatcell(Workbook,formatNum,rowNum,8); percentSpent="#(qExecSummary.Spent_YTD/qExecSummary.bud_sum)*100#"; SpreadSheetSetCellValue(Workbook,(qExecSummary.Spent_YTD/qExecSummary.bud_sum)*100,rowNum,8); } else { SpreadSheetSetCellValue(Workbook,0,rowNum,8); } rowNum++; } //End of WriteOutput } else { SpreadSheetAddRows(Workbook,"No results for your criteria."); } </cfscript> 

但是,它显示与Output错误。 我不知道该怎么改。 我已经search了什么是可用的cfscript标签,并发现这一点 ,但没有什么看起来像它会帮助?

现在更新到<cfscript>我得到这个错误:

来自新更新的脚本的错误消息

最终编辑

这是工作脚本:

 <cfsilent> <!--- ******************************************************************* Filename: execSummary_Excel.cfm, v1.0 03/07/2012 Created By: Original Writer Description: Excel report export for Executive Summary Report. Change History: Date........Name...........Description of Change........................ 08/01/2012 Original Writer Added committed column. 02/28/2013 Original Writer Added stateGM and GM. *************************************************************************---> <cfinvoke component="financial.financial" method="getExecSummary" returnvariable="qExecSummary"> <cfinvokeargument name="level" value="#URL.level#" /> <cfinvokeargument name="stateGM" value="#URL.stateGM#" /> <cfinvokeargument name="GM" value="#URL.GM#" /> <cfinvokeargument name="engVP" value="#URL.engVP#" /> <cfinvokeargument name="engDir" value="#URL.engDir#" /> </cfinvoke> <!---Added this to test if I can get more than one sheet to the Workbook---> <cfinvoke component="financial.financial" method="getExecSummary331" returnvariable="qExecSummary331"> <cfinvokeargument name="level" value="#URL.level#" /> <cfinvokeargument name="stateGM" value="#URL.stateGM#" /> <cfinvokeargument name="GM" value="#URL.GM#" /> <cfinvokeargument name="engVP" value="#URL.engVP#" /> <cfinvokeargument name="engDir" value="#URL.engDir#" /> </cfinvoke> <!--- Get Report Date since qExecSummary is more complex than the other report queries ---> <cfquery name="qRpt_Date" datasource="#application.dsn#"> SELECT DISTINCT rpt_date FROM fin_data </cfquery> <cfsetting requesttimeout="5000" /> </cfsilent> <!---Added this as a function that should allow me to use multiple queries and create a workbook with more than one sheet---> <cfscript> //Create new workbook with one sheet //by default that sheet is the active sheet Workbook = SpreadsheetNew("ExecSummary"); //Add Data to the sheet //Formatting format1.bold="true"; format1.fontsize=12; format1.font="Calibri"; format2.bold="true"; format2.fontsize=18; format2.font="Calibri"; formatNum.dataformat="0.0%"; //adding the Headers Spreadsheetformatcell(Workbook,format2,1,1); Spreadsheetformatcell(Workbook,format1,3,1); Spreadsheetformatcell(Workbook,format1,5,1); Spreadsheetformatcell(Workbook,format1,5,2); Spreadsheetformatcell(Workbook,format1,5,3); Spreadsheetformatcell(Workbook,format1,5,4); Spreadsheetformatcell(Workbook,format1,5,5); Spreadsheetformatcell(Workbook,format1,5,6); Spreadsheetformatcell(Workbook,format1,5,7); Spreadsheetformatcell(Workbook,format1,5,8); SpreadSheetSetCellValue(Workbook,"Executive Summary Report",1,1); SpreadSheetSetCellValue(Workbook,"#dateFormat(now(),'mm/dd/yyyy')#",3,1); SpreadSheetSetCellValue(Workbook,"Data Date",5,1); SpreadSheetSetCellValue(Workbook,"Level",5,2); SpreadSheetSetCellValue(Workbook,"Name",5,3); SpreadSheetSetCellValue(Workbook,"Description",5,4); SpreadSheetSetCellValue(Workbook,"Budget",5,5); SpreadSheetSetCellValue(Workbook,"Commited",5,6); SpreadSheetSetCellValue(Workbook,"Spent YTD",5,7); SpreadSheetSetCellValue(Workbook,"% Spent",5,8); arr=server.ColdFusion.ProductVersion; if (qExecSummary.recordCount) { rowNum = 6; do { SpreadSheetSetCellValue(Workbook,dateFormat(qRpt_Date.rpt_date,'mm/dd/yyy'),rowNum,1); SpreadSheetSetCellValue(Workbook,qExecSummary.responsible[rowNum-5],rowNum,2); SpreadSheetSetCellValue(Workbook,qExecSummary.name[rowNum-5],rowNum,3); SpreadSheetSetCellValue(Workbook,qExecSummary.Description[rowNum-5],rowNum,4); SpreadSheetSetCellValue(Workbook,qExecSummary.bud_sum[rowNum-5],rowNum,5); SpreadSheetSetCellValue(Workbook,qExecSummary.committed[rowNum-5],rowNum,6); SpreadSheetSetCellValue(Workbook,qExecSummary.Spent_YTD[rowNum-5],rowNum,7); if (qExecSummary.bud_sum[rowNum-5] NEQ 0){ Spreadsheetformatcell(Workbook,formatNum,rowNum,8); SpreadSheetSetCellValue(Workbook,(qExecSummary.Spent_YTD[rowNum-5]/qExecSummary.bud_sum[rowNum-5]),rowNum,8); } else { SpreadSheetSetCellValue(Workbook,0,rowNum,8); } rowNum++; } while (rowNum - 6 LT qExecSummary.recordCount); } else { SpreadSheetAddRows(Workbook,"No results for your criteria."); } SpreadsheetCreateSheet(Workbook,"ExecSummaryTest"); SpreadsheetSetActiveSheet(Workbook,"ExecSummaryTest"); //Formatting format1.bold="true"; format1.fontsize=12; format1.font="Calibri"; format2.bold="true"; format2.fontsize=18; format2.font="Calibri"; formatNum.dataformat="0.0%"; Spreadsheetformatcell(Workbook,format2,1,1); Spreadsheetformatcell(Workbook,format1,3,1); Spreadsheetformatcell(Workbook,format1,5,1); Spreadsheetformatcell(Workbook,format1,5,2); Spreadsheetformatcell(Workbook,format1,5,3); Spreadsheetformatcell(Workbook,format1,5,4); Spreadsheetformatcell(Workbook,format1,5,5); Spreadsheetformatcell(Workbook,format1,5,6); Spreadsheetformatcell(Workbook,format1,5,7); Spreadsheetformatcell(Workbook,format1,5,8); SpreadSheetSetCellValue(Workbook,"Executive Summary Report",1,1); SpreadSheetSetCellValue(Workbook,"#dateFormat(now(),'mm/dd/yyyy')#",3,1); SpreadSheetSetCellValue(Workbook,"Data Date",5,1); SpreadSheetSetCellValue(Workbook,"Level",5,2); SpreadSheetSetCellValue(Workbook,"Name",5,3); SpreadSheetSetCellValue(Workbook,"Description",5,4); SpreadSheetSetCellValue(Workbook,"Budget",5,5); SpreadSheetSetCellValue(Workbook,"Commited",5,6); SpreadSheetSetCellValue(Workbook,"Spent YTD",5,7); SpreadSheetSetCellValue(Workbook,"% Spent",5,8); arr=server.ColdFusion.ProductVersion; if (qExecSummary331.recordCount) { rowNum = 6; do { SpreadSheetSetCellValue(Workbook,dateFormat(qRpt_Date.rpt_date,'mm/dd/yyy'),rowNum,1); SpreadSheetSetCellValue(Workbook,qExecSummary331.responsible[rowNum-5],rowNum,2); SpreadSheetSetCellValue(Workbook,qExecSummary331.name[rowNum-5],rowNum,3); SpreadSheetSetCellValue(Workbook,qExecSummary331.Description[rowNum-5],rowNum,4); SpreadSheetSetCellValue(Workbook,qExecSummary331.bud_sum[rowNum-5],rowNum,5); SpreadSheetSetCellValue(Workbook,qExecSummary331.committed[rowNum-5],rowNum,6); SpreadSheetSetCellValue(Workbook,qExecSummary331.Spent_YTD[rowNum-5],rowNum,7); if (qExecSummary331.bud_sum[rowNum-5] NEQ 0){ Spreadsheetformatcell(Workbook,formatNum,rowNum,8); SpreadSheetSetCellValue(Workbook,(qExecSummary331.Spent_YTD[rowNum-5]/qExecSummary331.bud_sum[rowNum-5]),rowNum,8); } else { SpreadSheetSetCellValue(Workbook,0,rowNum,8); } rowNum++; } while (rowNum - 6 LT qExecSummary331.recordCount); } else { SpreadSheetAddRows(Workbook,"No results for your criteria."); } SpreadsheetSetActiveSheet(Workbook,"ExecSummary"); </cfscript> <cfheader name="Content-Disposition" value='attachment; filename="execSummaryNew.xls"'> <cfcontent type="application/msexcel" variable="#SpreadsheetReadBinary(Workbook)#" reset="true"> 

WriteOutput()用于在屏幕上显示数据。 要将数据添加到电子表格,您需要使用电子表格function。 在你的场景中,你可以使用for / in循环遍历查询行。 然后使用SpreadSheetSetCellValue(sheet,value,row,col)填充单个单元格。

更新1:

如果你运行下面的代码(从“编辑2”),在一个全新的.cfm脚本,你会看到它的作品完美。 所以任何错误都必须来自代码的不同部分。 如果您在查找错误时遇到问题,我会build议您重新启动一个干净的版本。 使用非常简单的代码创build一个全新的脚本:生成电子表格所需的最低限度。 省略任何额外的function,下载等,并获得基本的代码工作第一。

 <cfscript> // FOR DEMO ONLY: Create manual queries qRpt_Date = queryNew(""); queryAddColumn(qRpt_Date, "Rpt_Date", [now()]); qExecSummary = queryNew(""); queryAddColumn(qExecSummary, "responsible", [1,12,13]); queryAddColumn(qExecSummary, "bud_sum", [0,50,100]); queryAddColumn(qExecSummary, "Spent_YTD", [0,50,100]); queryAddColumn(qExecSummary, "Name", ["Name A","Name B","Name C"]); queryAddColumn(qExecSummary, "Description", ["Description A","DescriptionB","Description C"]); queryAddColumn(qExecSummary, "Committed", [0,50,100]); //Create new workbook with one sheet //by default that sheet is the active sheet Workbook = SpreadsheetNew("ExecSummary"); //Add Headers headerTextFormat.bold=true; Spreadsheetformatcell(Workbook,headerTextFormat,1,1); SpreadSheetSetCellValue(Workbook,"Executive Summary Report",1,1); Spreadsheetformatcell(Workbook,headerTextFormat,3,1); SpreadSheetSetCellValue(Workbook, dateFormat(now(),'mm/dd/yyyy'),3,1); SpreadSheetSetCellValue(Workbook,"Data Date",5,1); SpreadSheetSetCellValue(Workbook,"Level",5,2); SpreadSheetSetCellValue(Workbook,"Name",5,3); SpreadSheetSetCellValue(Workbook,"Description",5,4); SpreadSheetSetCellValue(Workbook,"Budget",5,5); SpreadSheetSetCellValue(Workbook,"Commited",5,6); SpreadSheetSetCellValue(Workbook,"Spent YTD",5,7); SpreadSheetSetCellValue(Workbook,"% Spent",5,8); //Add data detail if (qExecSummary.recordCount) { // Start populating the spreadsheet on this row number // Change as needed. rowNum = 6; // Loop through query rows for(dataRow in qExecSummary) { // add SpreadSheetSetCellValue(Workbook,dateFormat(qRpt_Date.rpt_Date, 'mm/dd/yyyy'),rowNum,1); SpreadSheetSetCellValue(Workbook,dataRow.responsible,rowNum,2); SpreadSheetSetCellValue(Workbook,dataRow.name,rowNum,3); SpreadSheetSetCellValue(Workbook,dataRow.Description,rowNum,4); SpreadSheetSetCellValue(Workbook,dataRow.bud_sum,rowNum,5); SpreadSheetSetCellValue(Workbook,dataRow.committed,rowNum,6); SpreadSheetSetCellValue(Workbook,dataRow.Spent_YTD,rowNum,7); if (qExecSummary.bud_sum != 0){ Spreadsheetformatcell(Workbook,formatNum,rowNum,8); SpreadSheetSetCellValue(Workbook,(qExecSummary.Spent_YTD/qExecSummary.bud_sum)*100,rowNum,8); } else { SpreadSheetSetCellValue(Workbook,0,rowNum,8); } rowNum++; } //End of WriteOutput } else { SpreadSheetAddRows(Workbook,"No results for your criteria."); } //For test purposes, save the results to a file SpreadSheetWrite(Workbook, "c:/path/to/yourFile.xls", true); WriteOutput("Done!"); </cfscript> 

更新2:

正如在评论中指出的,在CF9中不支持查询循环。 如果您使用的是旧版本的CF,那么您将需要使用from/to循环。

 // Loop through query rows for(x = 1; x lte yourQueryName.recordCount; x++) { SpreadSheetSetCellValue(Workbook, yourQueryName.YourColumnName[x], theSheetRowNum, 1); // ... theSheetRowNum++; } 

注意,我个人更喜欢cfscript。 但是,如果您对CFML感觉更舒适,则可以随时重写该示例 。 只要摆脱cfscript标签,并取代:

 <cfscript> SomeFunctionName(....); </cfscript> 

有:

 <cfset SomeFunctionName(....)>