2012-03-01 1 views
2

При добавлении данных в массив один из элементов имеет запятую в своем значении. Примером этого значения является «Обрезки на 103, 96 и 90».запятая в элементе массива разрывает таблицу

Используя следующий код для добавления элементов массива к элементу таблицы, элемент описания части, как описано выше, имеет свои данные, охватывающие несколько столбцов в электронной таблице. Он обрабатывается как отдельные элементы, а не один.

<!---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" /> 

Как я могу смягчить эту проблему?

Решено: я устанавливаю переменную в описание части, причем все запятые заменены точкой с запятой. Теперь все данные в той же колонке:

<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-содержать-запятые –

+0

Спасибо за руководство, Дэн; однако я не понимаю, как перевести пример для работы в моей ситуации. Я не использую cfscript, и я собираю таблицу в моем запросе. Я редактировал мой оригинальный вопрос с большим количеством кода для разработки. – aparker81

+0

@ aparker81 cfscript для cfml очень просто. Вместо x = y (z); это ', чтобы вы могли следить за тем, что отправил @Dan A. – Henry

ответ

2

Вы попробовали SpreadsheetAddRows()? Передать весь запрос? Возможно, это будет обходным путем, предполагая, что SpreadsheetAddRows() не просто вызывает SpreadsheetAddRow() внизу.

С SpreadsheetAddRow() не принимает дополнительный разделитель, который поддерживает большинство функций CF-списка, я полагаю, что вы можете избежать запятой на что-то еще, а затем заменить его запятой, используя spreadsheetsetcellvalue()?

Возможно, вы захотите отправить запрос функции Adobe на дополнительный разделитель для функции SpreadsheetAddRow().

+0

Спасибо за вход, Генри. Я ушел с вашего комментария «необязательный разделитель» и попробовал этот маршрут.Я закончил установку переменной в partdescription и заменил запятые точкой с запятой, и это, похоже, решило проблему распространения данных по нескольким столбцам. – aparker81

+0

THX за то, что вы приняли мое предложение, но, прочитав, что Дэн А. написал в комментарии, вы действительно должны просто просто процитировать строку с запятой. – Henry

+0

см. Мой другой ответ – Henry

1

попробуйте использовать «listQualify()», чтобы убедиться, что элементы списка - те, которые содержат запятые, - не путайте с длиной списка.

1

Согласно Adobe Инженера от Dan A.'s link

Кунал от Adobe отметил, гораздо более простой обходного пути, который обернуть переменный в одинарных кавычках, а затем в двойных кавычек

So ... сразу после <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 '" />