SQL到Excel丢失尾随零
我有一个SQL表,有价格列。 字段types是varchar
因为某些价格字段必须具有“市场价格”作为数据值。 我通过ColdFusion查询这些数据并使用cfspreadsheet创build一个导出:
<cfspreadsheet action="write" filename="prices.xlsx" query="qTierPrices" sheetname="Food Pricing" overwrite="yes">
在查看电子表格时, 1.00
价格变成1
,在电子表格单元中, 4.50
变为4.5
。 有没有一种方法来解决这个问题,所以电子表格完全反映了什么是从表中出来? 提前致谢!
就像丹说的那样,你可以使用spreadsheetFormatColumn
格式化一个spreadsheetFormatColumn
中的整个列。
以下示例使用虚拟数据创build电子表格,并将价格列设置为您的规格。
<!--- Generating some dummy data ---> <cfset qData = queryNew('foo,bar,price','varchar,date,varchar')> <cfset queryAddRow(qData)> <cfset querySetCell(qData, 'foo', createUUID())> <cfset querySetCell(qData, 'bar', now())> <cfset querySetCell(qData, 'price', 'Market Price')> <cfset queryAddRow(qData)> <cfset querySetCell(qData, 'foo', createUUID())> <cfset querySetCell(qData, 'bar', now())> <cfset querySetCell(qData, 'price', '4.55')> <cfset queryAddRow(qData)> <cfset querySetCell(qData, 'foo', createUUID())> <cfset querySetCell(qData, 'bar', now())> <cfset querySetCell(qData, 'price', '1.5')> <cfset queryAddRow(qData)> <cfset querySetCell(qData, 'foo', createUUID())> <cfset querySetCell(qData, 'bar', now())> <cfset querySetCell(qData, 'price', '1')> <cfset queryAddRow(qData)> <cfset querySetCell(qData, 'foo', createUUID())> <cfset querySetCell(qData, 'bar', now())> <cfset querySetCell(qData, 'price', '7.6')> <!--- create the spreadsheet and add a header row ---> <cfset theSheet = spreadsheetNew("Food Pricing", true)> <cfset spreadsheetAddRow( theSheet, 'foo,bar,price' )> <cfset spreadsheetAddRows( theSheet, qData )> <!--- Format the third column (price) to a number with two decimal places ---> <cfset spreadSheetFormatColumn( theSheet, {dataformat='0.00'}, 3)> <!--- Output the spreadsheet to a file ---> <cfspreadsheet action="write" filename="prices.xlsx" name="theSheet" sheetname="Food Pricing" overwrite="yes" >
您没有指出您使用的是哪个版本的ColdFusion。 (Adobe倾向于在未来的ColdFusion版本中修正错误,而不是在报告的版本中)。
为了输出小数位,你可以使用ColdFusion内build的SpreadSheetFormatColumn(),但你很快就会发现它不能像广告中那样工作(即date)。 使用Ben Nadel的POIUtility.cfc将提供更好更一致的结果(和更小的Excel文件大小)。
https://github.com/bennadel/POIUtility.cfc
我写了一个使用POIUtility.cfc的CustomTag来提供更简单的导出(即更less的模板)。
http://gamesover2600.tumblr.com/post/116662989199/coldfusion-cfexcelpoi
作为最后一个选项,您可以将列转换为“文本”,然后在使用CFSpreadsheet之前循环并格式化该值,但Excel可能仍然会篡夺格式。
http://www.cflib.org/udf/castQueryColumn
如果将值格式设置为“文本”,则Excel单元格值将左alignment,而不是右alignment作为数值。 在这种情况下,您还需要将“正确”alignment样式应用于列(或使用SpreadsheetFormatCell单独应用于每个单元格,但需要更长的时间。)
format1=StructNew(); format1.alignment="right"; SpreadsheetFormatColumn(spreadsheetObj, format1, column)
在我看来,最好使用POIUtility,因为它能在ColdFusion 7-11中产生正确和一致的结果,但是如果你将数值作为文本返回,里程会有所不同。 (绝对使用兴趣点速度,date格式和较小的文件大小。)