Coldfusion SpreadsheetAddRow() – 如何用逗号绕过值

我已经阅读了一些在networking上的这个问题的其他解决scheme,但没有在我的具体情况的帮助。 我循环查询,并使用spreadsheetAddRow()将行添加到我的Excel电子表格中,每次迭代。 问题是任何带有逗号的值都会导致CF引发“string索引超出范围:-1”错误。 即使我将这些值包装在单引号中,也会发生这种情况。 所以像这样:

<cfset spreadsheetAddRow(s, "'foobar','foo,bar'")> 

第一个值是好的,但第二个值会显示一个错误。 即使我使用variables而不是string文字,也会发生这种情况:

 <cfset val1 = "foobar"> <cfset val2 = "foo,bar"> <cfset spreadsheetAddRow(s, "'#val1#','#val2#'")> 

或者,如果我尝试在页面的最底部提出的方法。

我将使用spreadsheetAddRows()而不是一次抓取查询的所有行,但问题是我想要显示电子表格的信息的方式。 对于查询中的每一行,我在Excel工作表上创build了3行 – 一个用于查询行中的一些值,一个用于查询行中其他值的一个值,然后是一个空行。

我将尝试使用SpreadsheetSetCellValue(),其中为每个单元格值查找逗号,暂时将其replace为特殊字符,然后在spreadsheetAddRow()返回并replace该行中该特殊字符的所有实例用逗号。 但是这样做效率低下而且很无礼。 有没有办法“逃避”逗号,让CF认识到逗号是价值的一部分?

你这样说:

对于查询中的每一行,我在Excel工作表上创build3行 – 一个用于查询行中的一些值,一个用于查询行中其他值的一个,然后是一个空行。

我build议你简单地做你说你想做的事情。 像这样的东西:

 <cfset currentSpreadSheetRow = 0> <cfloop query = "yourQuery"> <cfset columnNumber = 1> <cfloop list = "#yourQuery.columnlist#" index = "field"> <cfset SpreadsheetSetCellValue(yourSheet, yourQuery[field][currentRow] , currentSpreadSheetRow + 1 , columnNumber) > <cfset columnNumber +=1> </cfloop> <!--- code for second row ---> <cfset currentSpreadSheetRow += 3> </cfloop> 

这是一般的想法。 您可以更改细节以适应您的特定要求。

此外,如果不明显,我无法遍历qReconciled.columnlist,因为某些列需要包含在每个迭代的第1行,有些需要在每个迭代的第2行。 总体思路是在两个表上进行连接,并显示两个表中每个logging应具有相同值的某些列可以进行比较。

最终的代码如下所示:

 <cfset currentSpreadSheetRow = 1> <!---start at 1, to ignore spreadsheet header row---> 

 <cfset s = spreadsheetNew("true")><!---true makes it support xlsx format ---> <!--- Add header row ---> <cfset spreadsheetAddRow(s, "Assessment Source,Client Last,Client First,SSN,Gender,Client Case Number,...")> <!---For each row in the query, create 3 rows in the spreadsheet. One for STARS, one for SACAP, and a blank row---> <cfloop query="qReconciled"> <!---Need to do this, else spreadsheet won't recognize them as strings---> <cfset tCheckin = " #timeformat(dcheckin,'short')#" /> <cfset tAssessmentStart = " #timeformat(dAssessmentStart,'short')#" /> <cfset tCheckouttime = " #timeformat(dCheckouttime,'short')#" /> <cfset tTimeInBin = " #timeformat(timeInBin,'short')#" /> <cfset tApptBeginTime = " #timeformat(dApptBeginTime,'short')#" /> <cfset tApptEndTime = " #timeformat(dApptEndTime,'short')#" /> <cfset tAppointmentTime = " #timeformat(dAppointmentdate,'short')#" /> <cfset tScheduledTime = " #timeformat(scheduledTime, 'short')#" /> <cfset arrThisRowSTARSValues = ['STARS','#vClientlname#','#vClientfname#','#vSSN#','#vGender#',#listFirst(vClientcasenumber, '-')#,...] /> <cfset arrThisRowSACAPValues = ['SACAP','#sacap_clientLName#','#sacap_clientFName#','#sacap_ssn#','#sacap_gender#','#vcientId#',...]/> <!---This method of populating the spreadsheet is necessary; with spreadsheetAddRow(), commas in values will be interpreted as a new column, even if the value is wrapped in single-quotes, and this screws everything up---> <cfset currentSpreadSheetRow = currentSpreadSheetRow + 1 /> <!---STARS Row---> <cfloop from="1" to="39" index="x"> <cfset spreadsheetSetCellValue(s,arrThisRowSTARSValues[x],currentSpreadSheetRow,x) /> </cfloop> <cfset currentSpreadSheetRow = currentSpreadSheetRow + 1 /> <!---SACAP Row---> <cfloop from="1" to="39" index="x"> <cfset spreadsheetSetCellValue(s,arrThisRowSACAPValues[x],currentSpreadSheetRow,x) /> </cfloop> <!---Blank Row---> <cfset spreadsheetAddRow(s, "") /> <cfset currentSpreadSheetRow = currentSpreadSheetRow + 1 /> </cfloop> <cfheader name="content-disposition" value="attachment; filename=#vImportName#_Reconciled.xlsx"> <cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(s)#" reset="true">