[英]Create workbook with multiple sheets from Queries
我正在使用ColdFusion 2016,並且發現我所使用的服務器僅具有CF9,對此我還很陌生。 我一直在努力更新現有代碼,以適應用戶現在的需求。 到目前為止,我已經做到了,但是這超出了我的范圍。 我有一個網站,可以用一張紙生成一個Excel工作簿。 它使用HTML和查詢來創建它。 從A1中的查詢名稱開始,A3中的報告日期開始,A5:H5中的表標題然后A6:H53中的數據開始(確切的長度可能有所不同,但始終在A-H列中)。 我將發布用於創建工作簿的內容。 我想做的是使用3個以上的查詢向工作簿中添加3個以上的工作表。 我試圖添加一個我在這里找到的功能,但效果不佳。 我嘗試對現有代碼進行一些修改,以嘗試使用所有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()
上發生錯誤。我不確定如何使用查詢來創建行數據嗎?
<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
一起的行中顯示錯誤。 我不知道將其更改為什么。 我已經搜索了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()用於在屏幕上顯示數據。 要將數據添加到電子表格,您需要使用電子表格功能。 在您的方案中,可以使用for / in循環遍歷查詢行。 然后使用SpreadSheetSetCellValue(sheet,value,row,col)填充單個單元格。
更新1:
如果您運行下面的代碼(來自“ Edit 2”),則在全新的.cfm腳本中,您將看到它運行正常。 因此,任何錯誤都必須來自代碼的不同部分。 如果您在查找錯誤時遇到麻煩,建議您從頭開始。 使用非常簡單的代碼創建一個全新的腳本:僅是生成電子表格所需的最少代碼。 省略任何其他功能,例如下載,下載等,並讓基本代碼首先生效。
<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不支持for..in
查詢循環。 如果您使用的是舊版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(....)>
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.