SQL到Excel丢失尾随零

时间:2015-08-05 13:43:53

标签: sql excel coldfusion

我有一个包含价格列的SQL表。字段类型为varchar,因为某些价格字段必须具有“市场价格”作为数据值。我通过ColdFusion查询这些数据,并使用cfspreadsheet创建导出:

<cfspreadsheet action="write" filename="prices.xlsx" 
       query="qTierPrices" 
       sheetname="Food Pricing" 
       overwrite="yes">

查看电子表格时,电子表格单元格中的1.00价格变为14.50变为4.5。有没有办法以编程方式修复此问题,以便电子表格能够准确反映出表中的内容?提前谢谢!

2 个答案:

答案 0 :(得分:2)

如Dan所说,您可以使用spreadsheetFormatColumn格式化电子表格中的整个列。

以下示例使用虚拟数据创建电子表格,并将价格列格式化为您的规格。

<!--- 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" >

答案 1 :(得分:1)

您没有指出您正在使用哪种版本的ColdFusion。 (Adobe倾向于修复ColdFusion的未来版本中的错误,而不是他们报告的版本。)

为了输出小数位,你可以使用ColdFusion的内置SpreadSheetFormatColumn(),但你很快就会发现它不像宣传的那样工作(即日期)。使用Ben Nadel的POIUtility.cfc将提供更好,更一致的结果(以及更小的Excel文件大小)。

https://github.com/bennadel/POIUtility.cfc

我编写了一个CustomTag,它使用POIUtility.cfc来提供更简单的导出(即模板化程度更低)。

http://gamesover2600.tumblr.com/post/116662989199/coldfusion-cfexcelpoi

作为最后一个选项,您可以将列转换为“text”,然后在使用CFSpreadsheet之前循环并根据需要格式化值,但Excel仍可能会使用格式化。

http://www.cflib.org/udf/castQueryColumn

如果将值格式设置为“text”,则Excel单元格值将左对齐而不是右对齐作为数值。在这种情况下,您还需要将“右”对齐样式应用于列(或使用SpreadsheetFormatCell单独应用于每个单元格,但这需要更长时间。)

format1=StructNew(); 
format1.alignment="right";
SpreadsheetFormatColumn(spreadsheetObj, format1, column)

在我看来,最好使用POIUtility,因为它产生正确的&amp; ColdFusion 7 - 11中的结果一致,但如果您将数值作为文本返回,则里程会有所不同。 (绝对使用POI进行速度,日期格式化和较小的文件大小。)