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格式和较小的文件大小。)