Почему код электронной таблицы POIUtil.cfc неправильно отображает некоторые цифры? - PullRequest
1 голос
/ 20 июня 2019

У меня есть запрос, который получает некоторые данные и отображает их на веб-странице с помощью CFLOOP, а также создает файл Excel с POI: Документ в ColdFusion.

<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 генерируются повторяющиеся / неправильные значения.

Например, на изображении ниже

  • Значение ListingID в строке 1 равно 113799576, но оно должно быть 113799573
  • Значение ListingID в строке2 - 113807824, но должно быть 113807820

acquisitionAssociate [acqAsso_val ListingId_val]

ListingId [ListingId_val]

EXCEL RESULTS

Check column AcquisitionAssociate and ListingID

ОБНОВЛЕНИЕ

Я пыталсяизменив тип данных столбца ListingId на текст (строка) в коде, тогда результаты будут правильными.DataType для ListingId в DATABASE - это varchar, но он содержит только числовые значения.Таким образом, возможная ошибка здесь - преобразование из кода varchar в числовой тип dataType в коде.Но я до сих пор не знаю, почему это происходит.

1 Ответ

1 голос
/ 21 июня 2019

Вы правы, это проблема конверсии. Эта библиотека обрабатывает <poi:cell type="numeric" путем приведения входных значений к типу FLOAT .

      <cfset VARIABLES.Cell.SetCellValue( 
                        JavaCast( "float", THISTAG.GeneratedContent )
            ) />

Float является приблизительным типом , который не может представлять все числа точно .Вот почему некоторые из ваших значений "Listing 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

...