2012-03-01 41 views
2

将数据添加到数组时,其中一个元素的值为逗号。值的一个示例是“103,96和90处的修剪标记”。数组元素中的逗号分隔电子表格

使用以下代码将数组元素添加到电子表格对象,如上所述,partdescription元素使其数据跨越电子表格中的多列。它作为单独的元素处理,而不是一个。

<!---Create file name variable---> 
    <cfset filenametouse = 'PartLevel_Report' /> 
    <!---Set directory and full file path---> 
    <cfset theDir = GetDirectoryFromPath(GetCurrentTemplatePath()) /> 
    <!---Attach file extension to full file path and file name---> 
    <cfset theFile = theDir & filenametouse & ".xls" /> 

    <cflock name="fileActionSentItems" type="exclusive" timeout="30" throwontimeout="true"> 
     <cfset SpreadsheetObj = spreadsheetNew()> 
     <cfset fcol = {}> 
     <cfset fcol.dataformat = "@"> 

     <!---Create the column headings---> 
     <cfset SpreadsheetAddRow(SpreadsheetObj, "Part ##, Reorder ##, Description, Bin ##, Current Inv., Staged, Allocations, Available Inv., Shelf Count, Total Shipped, Total ## of Stores, Total Ordered, Avg. Per Store, Lead Time (in days), Low Water Mark, Total ## of Stores Remaining")> 

      <cfoutput query="getParts" group="partnum"> 

    <cfset aColumns = [ partnum , shortchar08 , partdescription , binlist , inventory.currinv , staged.stagedqty , alloc.allocqty , available , shelfCount , shipdtl.shipqty , getNumberofStores.numStores , tordered , APS, paddedLeadTime, LWM , storesRemain] /> 

    <!---add the column data to the spreadsheet---> 
    <cfset SpreadsheetAddRow(SpreadsheetObj, ArrayToList(aColumns)) /> 
</cfoutput> 

     <!---Generate the spreadsheet---> 
     <cfspreadsheet action="write" filename="#theFile#" name="SpreadsheetObj" sheetname="Sheet1" overwrite="true" /> 

我该如何缓解这个问题?

解决方法:我将一个变量设置为partdescription,所有逗号都用分号替换。现在数据全部出现在同一列中:

<cfset cleanDesc = rereplace(partdescription, ",", ";", "all")> 
    <cfset aColumns = [ partnum , shortchar08 , cleanDesc , binlist , inventory.currinv , staged.stagedqty , alloc.allocqty , available , shelfCount , shipdtl.shipqty , getNumberofStores.numStores , tordered , APS, paddedLeadTime, LWM , storesRemain] /> 
+2

看到这个:http://cfsimplicity.com/30/workaround-for-spreadsheetaddrow-limitation-when -column-values-containing-commas – 2012-03-01 19:50:36

+0

谢谢你的指导,Dan;然而,我不明白如何翻译这个例子来适应我的情况。我没有使用cfscript,而是在查询中构建电子表格。我用更多的编码来编辑我的原始问题。 – aparker81 2012-03-01 20:19:41

+0

@ aparker81 cfscript to cfml非常容易。而不是x = y(z);它是'所以你应该能够关注@Dan A.发布的内容。 – Henry 2012-03-02 00:46:52

回答

2

您是否试过SpreadsheetAddRows()而不是?传入整个查询?也许这将是一个解决方法,假设SpreadsheetAddRows()不只是在下面调用SpreadsheetAddRow()

由于SpreadsheetAddRow()不接受大多数CF列表功能支持的可选定界符,所以我猜或者您可以将逗号转义为其他东西,然后使用spreadsheetsetcellvalue()将其替换为逗号?

您可能希望向Adobe提交功能请求,以获取SpreadsheetAddRow()函数的可选分隔符。

+0

感谢您的意见,亨利。我从你的“可选定界符”评论中脱身并尝试了这条路线。我最终为partdescription设置了一个变量,并用分号替换了逗号,这似乎解决了跨多个列传播数据的问题。 – aparker81 2012-03-01 21:14:00

+0

thx为了采纳我的建议,但在阅读Dan A.在评论中发布的内容时,应该只用逗号引用该字符串。 – Henry 2012-03-02 00:56:48

+0

看到我的其他答案 – Henry 2012-03-02 01:02:37

1

尝试使用“listQualify()”来确保您的列表元素 - 包含逗号的列表元素 - 不会混淆列表长度。

1

据到Adobe工程师关闭Dan A.'s link

注:Kunal从Adobe已经指出了更直接 解决方法,这是包装在单引号的变量,然后在 双引号

所以......之后<cfset aColumns = [ ... ]>

<!--- wrap element with single quote if it contains a comma ---> 
<cfloop from="1" to="#arrayLen(aColumns)#" index="i"> 
    <cfif aColumns[i] CONTAINS ','> 
     <cfset aColumns[i] = "'#aColumns[i]#'"> 
    </cfif> 
</cfloop> 

<cfset SpreadsheetAddRow(SpreadsheetObj, ArrayToList(aColumns)) /> 
0

正如亨利所说的那样,将变量包裹在单引号中对我有用,除非最后一个字符是逗号。

<cfset SpreadsheetAddRow(SpreadsheetObj, "'col1,','col2'" /> 

所以我添加到每个单元格的值的空间,就像这样:

<cfset SpreadsheetAddRow(SpreadsheetObj, "'col1, ','col2 '" />