我有一个查询,该查询获取一些数据并使用CFLOOP将其显示在网页上,并使用ColdFusion中的POI:Document生成一个Excel文件。
<cfloop query="qUsedListings">
<poi:row>
<poi:cell type="numeric" NumberFormat="0" value="#qUsedListings.region#" />
<poi:cell type="numeric" NumberFormat="0" value="#qUsedListings.district#" />
<poi:cell type="numeric" NumberFormat="0" value="#qUsedListings.storeId#" />
<poi:cell value="#qUsedListings.acquisitionAssociate#" />
<poi:cell type="numeric" NumberFormat="0" value="#qUsedListings.listingId#" />
<!---This above listing ID is generating duplicate values--->
<poi:cell value="#qUsedListings.description#" />
<poi:cell type="numeric" value="#qUsedListings.grossMarginPercentage#" />
<poi:cell type="numeric" value="#qUsedListings.itemCost#" />
<cfif LEN(qUsedListings.UVMAVERAGECOST)>
<poi:cell type="numeric" value="#qUsedListings.UVMAVERAGECOST#" />
<cfelse>
<poi:cell value="N/A" />
</cfif>
此外,当我尝试将#qUsedListings.listingId#
放在其较高的单元格值<poi:cell value="#qUsedListings.acquisitionAssociate#" />
我尝试了<poi:cell value="#qUsedListings.acquisitionAssociate# #qUsedListings.listingId#" />
然后ListingId
在该单元格中与acquisitionAssociate
正确,但同时在原始ListingId
列中存在重复和无序的值。
问题是,它具有不同的列,除了一个列ListingId之外,所有列均产生良好的结果。它显示不可能的重复(或不正确)值。网页上的相同数据是正确的,但是在Excel文件中,它正在生成重复/不正确的值。
例如下面的图片
113799576
,但应为113799573
113807824
,但应为113807820
acquisitionAssociate [acqAsso_val ListingId_val]
ListingId [ListingId_val]
更新
我尝试在代码中将ListingId列数据类型更改为text(string),然后结果正确。 DATABASE中ListingId的数据类型为varchar,但仅包含数字值。因此,这里可能的错误是代码中从varchar转换为数字dataType。但是我仍然不知道为什么会这样。
答案 0 :(得分:1)
是的,这是一个转换问题。 That library通过将输入值强制转换为类型FLOAT来处理<poi:cell type="numeric"
。
<cfset VARIABLES.Cell.SetCellValue(
JavaCast( "float", THISTAG.GeneratedContent )
) />
浮点数是一种近似类型which can't represent all numbers exactly。因此,您的某些“列表ID”值在电子表格中的显示方式有所不同。例如,113807820
之类的数字无法精确表示,当转换为浮点数时会变成113807824
。
您可以使用此示例查看其运行情况:
<cfscript>
input = "113807820";
writeDump( JavaCast( "string", input ) );
writeDump( numberFormat(JavaCast( "string", input), "0" ));
writeDump( numberFormat(JavaCast( "float", input), "0") );
</cfscript>
请注意,使用float时,结果输出不同吗?
113807820 // raw string
113807820 // string + numberFormat
113807824 // float + numberFormat
完整演示:
<cfscript>
sheet = spreadsheetNew();
// Correct Results: Using Adobe's type "numeric"
sheet.setCellValue("113807820", 1, 1, "numeric");
// Correct Results: Using type "String"
sheet.setCellValue("113807820", 1, 2, "string");
// Wrong Results: Cast as type "Float"
sheet.setCellValue(JavaCast( "float","113807820"), 1, 3);
cfcontent (type="application/vnd.ms-excel"
, variable=spreadsheetReadBinary(sheet)
);
</cfscript>
结果: