У меня есть запрос от клиента на создание электронной таблицы Excel из запроса. У меня есть запрос, выбивающий поля, и я могу без проблем сгенерировать файл Excel. Проблема возникает, когда клиент берет этот файл Excel, а затем пытается им манипулировать.
Большинство проблем возникает из-за полей, которые должны быть помечены как валюта или даты. С некоторыми трудностями я могу создать «настоящее» поле даты. До этого Excel неправильно сортировал даты. Я смог вызвать формулу Excel, используя приведенный ниже код. DateValue
заставляет Excel признать это поле реальной даты. Однако это не удается, когда этот файл обрабатывается через Excel.
<cfset SpreadsheetSetCellFormula(s
,"DATEVALUE(#Chr(34)##Replacement_ETD##Chr(34)#)"
, therow
, 9)>
Следующая проблема — поле валюты. Я не могу заставить Excel признать значения как валюту. Это всегда приходит на заказ. Когда это установлено, функция SUM
не будет работать в Excel. Вы можете добавлять поля по отдельности, например A1+B1+C1 = TOTAL
. Однако это бесполезно, когда есть 200 строк.
Мне удалось получить предложение от другого программиста CF, у которого была аналогичная ситуация. Сначала он создал файл Excel с правильными заголовками и установил для столбцов соответствующие поля, такие как дата, валюта и т. д.
Следующим шагом будет заполнение полей построчно, и они должны быть правильно отформатированы.
Код:
<cfset filename = expandPath("./reports/arrivals.xlsx")>
<cfspreadsheet action="read" src = "#filename#" name = "s" >
<cfset therow = 0>
<cfoutput query="myExcel" startrow="1">
<cfset therow = myExcel.currentrow + 1>
<cfset SpreadsheetSetCellValue(s, Incumbent, therow, 1)>
<cfset SpreadsheetSetCellValue(s, Section, therow, 2)>
<cfset SpreadsheetSetCellValue(s, Position_Number, therow, 3)>
<cfset SpreadsheetSetCellValue(s, Position_Title, therow, 4)>
<cfset SpreadsheetSetCellValue(s, Incumbent_Emplyment_Type, therow, 5)>
<cfset SpreadsheetSetCellValue(s, Incumbent_ETD, therow, 6)>
<cfset SpreadsheetSetCellValue(s, Tour_Comments, therow, 7)>
<cfset SpreadsheetSetCellValue(s, Replacement, therow, 8)>
<cfset SpreadsheetSetCellValue(s, Replacement_ETA, therow, 9)>
</cfoutput>
<cfheader name="content-disposition" value="attachment; filename=Departures_(#DateFormat(now(),'mmddyy')#).xls">
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(s)#" reset="true">
Данные в ячейках уже правильно отформатированы. Когда этот файл создается и передается пользователю, столбцы форматируются не так, как ожидалось.
Кто-нибудь еще знает, будет ли этот метод работать, или у него есть лучшее предложение о том, как заставить CF генерировать правильное поле даты и валюты для подтверждения Excel?
Adobe ColdFusion v10 работает на RHEL 5.
По запросу вот некоторый код, использующий queryNe
w, который будет генерировать кодовые даты и валюту.
Шаг первый: я создал файл Excel с замороженной первой строкой и заголовком столбца. Первая колонка была обозначена как дата в длинном формате - мм/дд/гггг; Второй столбец - это доллар, который был установлен в валюте.
Я читаю этот файл, затем заполняю строки и передаю файл пользователю для загрузки.
<cfset filename = expandPath("./reports/Test.xlsx")>
<cfspreadsheet action="read" src = "#filename#" name = "s" >
<cfset myQuery = QueryNew("MyDate, Dollar", "Date, Decimal")>
<cfset newRow = QueryAddRow(MyQuery, 5)>
<cfset temp = QuerySetCell(myQuery, "MyDate", "03-11-2000", 1)>
<cfset temp = QuerySetCell(myQuery, "Dollar", "403.45", 1)>
<cfset temp = QuerySetCell(myQuery, "MyDate", "01-01-2009", 2)>
<cfset temp = QuerySetCell(myQuery, "Dollar", "603.22", 2)>
<cfset temp = QuerySetCell(myQuery, "MyDate", "09-21-2013", 3)>
<cfset temp = QuerySetCell(myQuery, "Dollar", "103.55", 3)>
<cfset temp = QuerySetCell(myQuery, "MyDate", "01-15-2005", 4)>
<cfset temp = QuerySetCell(myQuery, "Dollar", "3.33", 4)>
<cfset temp = QuerySetCell(myQuery, "MyDate", "07-22-2003", 5)>
<cfset temp = QuerySetCell(myQuery, "Dollar", "13.75", 5)>
<cfset therow = 0>
<cfoutput query="myQuery" startrow="1">
<cfset therow = myQuery.currentrow + 1>
<cfset SpreadsheetSetCellValue(s, DateFormat(MyDate, 'mm/dd/yyyy'), therow, 1)>
<cfset SpreadsheetSetCellValue(s, Dollar, therow, 2)>
#myQuery.currentrow# <br>
#myQuery.MyDate# <br>
#myQuery.Dollar# <br>
</cfoutput>
<cfheader name="content-disposition" value="attachment;
filename=Departures_(#DateFormat(now(),'mmddyy')#).xls">
<cfcontent type="application/msexcel" variable="#spreadsheetReadBinary(s)#" reset="true">
Вы можете открыть файл в MS Excel или в Google Таблицах. Протестируйте один, с замороженной первой строкой, мы должны иметь возможность сортировать по полю даты. Мои результаты: даты не сортируются должным образом. В столбце 2 с валютой, если мы попытаемся сделать SUM, это сработает! Раньше это не работало, но теперь работает.
Кроме того, когда я пытаюсь открыть файл, мне выдается предупреждение о том, что этот файл поврежден, и Excel попытается его открыть. Я не получаю такого предупреждения в Google Таблицах.
QueryNew()
для создания запроса вручную, чтобы в примере не требовался запрос к базе данных. - person Leigh   schedule 24.05.2016