Coldfusion CSV в электронную таблицу - PullRequest
2 голосов
/ 20 мая 2019

У меня есть несколько процессов, которые используют тег CFSpreadsheet для импорта, а затем манипулировать данными Excel.Это прекрасно работает для файлов .XLS и .XLSX, однако не работает, если данные отправляются в виде файла .CSV, поскольку очевидно, что CFSpreadsheet никогда не обновлялся для импорта файлов .CSV.В конце дня я просто хочу простой препроцессор , который берет файл .CSV и перезаписывает его как файл .XLSX, чтобы мой другой процесс мог взять его оттуда.

Моя среда - это версия Coldfusion 2018 для разработчиков, и я попытался импортировать данные вручную (это может сработать, если я знаю все определения столбцов - но я не всегда буду знать это).Моя последняя попытка была с функцией 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 ]

2 голосов
/ 21 мая 2019

Похоже, ваш UDF возвращает многомерный массив, не массив структур.Вместо того чтобы пытаться привести массив в объект запроса, попробуйте использовать функции электронной таблицы для записи данных массива в файл xlsx.

DEMO / Sample data

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 );

.. или, как предложил Джеймс Мохлер , вы также можете использовать функции-члены :

xlsx = SpreadSheetNew("The Results", true);
xlsx.addRows( result );
xlsx.write( "c:/path/to/test.xlsx", true );
1 голос
/ 21 мая 2019

Если у вас уже есть массив структур из CSVToArray. Можете ли вы затем использовать функцию ArrayOfStructuresToQuery: https://cflib.org/udf/ArrayOfStructuresToQuery

1 голос
/ 20 мая 2019

Бьюсь об заклад, вы могли бы сделать что-то вроде этого

<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() выглядит так, как будто он создает массив структур.

...