数组元素中的逗号打破电子表格

时间:2012-03-01 19:35:06

标签: arrays coldfusion cfspreadsheet

将数据添加到数组时,其中一个元素的值中包含逗号。值的一个示例是“在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] />

4 个答案:

答案 0 :(得分:2)

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

由于SpreadsheetAddRow()不接受大多数CF列表功能支持的可选分隔符,我猜您可以将逗号转义为其他内容,然后使用spreadsheetsetcellvalue()将其替换为逗号?

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

  来自Adobe的Kunal指出了一个更加直截了当的问题   解决方法,即将变量包装在单引号中,然后输入   双引号

所以......在<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)) />

答案 3 :(得分:0)

正如亨利所说,用单引号包装变量对我有用,除非最后一个字符是逗号。

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

所以我在每个单元格的值中添加了一个空格,如下所示:

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