为什么POIUtil.cfc电子表格代码无法正确显示一些数字?

时间:2019-06-20 07:09:28

标签: excel coldfusion apache-poi coldfusion-10 cfloop

我有一个查询,该查询获取一些数据并使用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文件中,它正在生成重复/不正确的值。

例如下面的图片

  • 第1行中的ListingID值为113799576,但应为113799573
  • 第2行中的ListingID值为113807824,但应为113807820

acquisitionAssociate [acqAsso_val ListingId_val]

ListingId [ListingId_val]

EXCEL RESULTS

Check column AcquisitionAssociate and ListingID

更新

我尝试在代码中将ListingId列数据类型更改为text(string),然后结果正确。 DATABASE中ListingId的数据类型为varchar,但仅包含数字值。因此,这里可能的错误是代码中从varchar转换为数字dataType。但是我仍然不知道为什么会这样。

1 个答案:

答案 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>

结果:

Screenshot of Demo Spreadsheet Code