在尝试创建从多个查询生成的电子表格时,以下代码仅生成一行数据,而不是整个电子表格:
<cfset filenametouse = 'Usage_Report' />
<cfset theDir = GetDirectoryFromPath(GetCurrentTemplatePath()) />
<cfset theFile = theDir & filenametouse & ".xls" />
<cflock name="fileActionSentItems" type="exclusive" timeout="30" throwontimeout="true">
<cfset SpreadsheetObj = spreadsheetNew()>
<cfset fcol = {}>
<cfset fcol.dataformat = "@">
<cfset SpreadsheetAddRow(SpreadsheetObj, "Part Number, Description, Allocated, On Hand, Pending Receipt, Job Count, Qty Needed, Qty Issued, Order Count, Qty Ordered, Qty Shipped")>
<cfoutput>
<cfset SpreadsheetAddRows(SpreadsheetObj,"#getParts.partnum#, #getParts.partdescription#, #getParts.allocated#, #getParts.onhand#, #receiptdata.recqty#, #jobdata.JobCount#, #jobdata.QtyNeeded#, #jobdata.qtySent#, #orderdata.ordercount#, #orderdata.ordered#, #orderdata.shipqty#")>
</cfoutput>
<cfset SpreadsheetFormatColumn(SpreadsheetObj,fcol,11)>
<cfspreadsheet action="write" filename="#theFile#" name="SpreadsheetObj" sheetname="Sheet1" overwrite="true" />
</cflock>
spreadsheetAddRows不会创建用于填充行的数据。我做得不好?
答案 0 :(得分:1)
您需要传入查询对象而不是单行数据。
<cfset SpreadsheetAddRows(SpreadsheetObj, getParts) >
顺便说一句,你可能不需要锁定整个部分。如果锁旨在阻止并发文件访问,则只需要锁定将表单写入磁盘的代码。 (根据您的需要,您可能还会使用更精细的名称。但这只是猜测。)
答案 1 :(得分:0)
您没有遍历查询以分配多行。因为您没有指定值应该来自哪个位置,所以它们是从每个查询中的第一条记录中分配的。
使用queryNew()
创建包含电子表格中所需内容的其他查询<cfset newQuery = queryNew("partNo,desc,allocated,onHand,rendingReceipt,jobCount,qtyNeeded,qtyIssued,orderCount,qtyOrdered,qtyShipped","varchar,varchar,varchar,varchar,varchar,varchar,integer,integer,integer,integer,integer,integer,integer,integer") />
...等,随时分配单元格。如果您有完整的查询对象,则可以将其添加到spreadsheetAddRows(spreadsheetObj,newQuery)/&gt;
如果您发现电子表格创建速度太慢,您可能需要在http://www.bennadel.com/projects/poi-utility.htm查看POI实用程序,不像电子表格选项那样可配置,但对于某些工作负载更快。