Coldfusion CSV到电子表格

时间:2019-05-20 16:58:36

标签: csv coldfusion cfspreadsheet coldfusion-2018

我有一些利用CFSpreadsheet标记来导入然后处理Excel数据的过程。这对于.XLS和.XLSX文件非常有用,但是,如果将数据作为.CSV文件发送,则无效,因为CFSpreadsheet显然从未更新为导入.CSV文件。在一天结束时,我只想要一个简单预处理器,该预处理器将一个.CSV文件并重新编写为.XLSX文件,以便我的其他进程可以从那里获取它。

我的环境是Coldfusion 2018的开发人员版本,我尝试过手动导入数据(如果我知道所有列定义,该数据就可以工作,但我并不总是知道这一点)。我的最新尝试是使用Ben Nadel的CSVToArray函数(https://www.bennadel.com/blog/2041-update-parsing-csv-data-files-in-coldfusion-with-csvtoarray.htm),该函数可以工作--我可以轻松地将.CSV文件放入数组中--但是我不知道如何从该数组转到类似于查询,我可以使用CFSpreadsheet编写电子表格。

这是一个例子:

<!--- This include is the function from Ben Nadel referenced above --->
<cfinclude template="Function_CSVtoArray.cfm"> 

<cfset result = csvToArray(file="TEST_File.csv") />

<cfdump var="#result#" label="TESTING">

<!--- *** The above WORKS up to this point ***--->

<!--- Create a new query. --->
<cfset qPartsTwo = QueryNew( "" ) />

<!--- Loop over keys in the struct. --->
<cfloop index="strKey" list="#StructKeyList(result)#" delimiters=",">

<!--- Add column to new query with default values. --->
<cfset QueryAddColumn(qPartsTwo,strKey,"VARCHAR",objParts[strKey]) />

</cfloop>

<!--- This code FAILS with a "You have attempted to dereference a scalar variable of type class coldfusion.runtime.Array as a structure with members" error message --->

我想得出这样的结果(尽管现在“结果”是某种数组而不是查询):

<cfspreadsheet action="write" filename="<my path>\TEST.xlsx" query="result">

任何想法将不胜感激!

3 个答案:

答案 0 :(得分:2)

您的UDF似乎返回一个多维数组,而不是一个 结构数组。与其尝试将数组强制转换为查询对象,不如尝试使用spreadsheet functions将数组数据写入xlsx文件。

演示/样本数据

result = [ ["First Name", "Last Name", "Address"]   
           , ["John", "Doe", "123 Anywhere Ave"]    
           , ["Mary", "Smith", "456 Somewhere Street"]  
           , ["Charles", "Doe", "789 Anywhere Court"]   
];

代码:

// create spreadsheet
xlsx = SpreadSheetNew("The Results", true);
// populate with array data
SpreadSheetAddRows( xlsx, result ); 
// save to file
SpreadSheetWrite( xlsx, "c:/path/to/test.xlsx", true );

..或按照James A Mohler的建议,您也可以使用member functions

xlsx = SpreadSheetNew("The Results", true);
xlsx.addRows( result );
xlsx.write( "c:/path/to/test.xlsx", true );

答案 1 :(得分:1)

我敢打赌,你可以做这样的事情

<cfinclude template="Function_CSVtoArray.cfm"> 

<cfset result = csvToArray(file="TEST_File.csv") />

<cfdump var="#result#" label="TESTING">


<!--- setup the columns that you need --->
<cfset qPartsTwo = queryNew("id,name,amount","Integer,Varchar,Integer", result) />

<cfspreadsheet action="write" filename="<my path>\TEST.xlsx" query="result">

CSVToArray()看起来像是一个结构数组。

答案 2 :(得分:1)

如果您已经具有CSVToArray中的结构数组。然后可以使用ArrayOfStructuresToQuery函数吗:https://cflib.org/udf/ArrayOfStructuresToQuery