从多个查询创建电子表格

时间:2012-02-07 18:47:43

标签: coldfusion spreadsheet

在尝试创建从多个查询生成的电子表格时,以下代码仅生成一行数据,而不是整个电子表格:

<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不会创建用于填充行的数据。我做得不好?

2 个答案:

答案 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实用程序,不像电子表格选项那样可配置,但对于某些工作负载更快。