SpreadsheetFormatRow внезапно перестает работать

Я видел этот пост, но похоже, что есть решение. Во всяком случае, я использую ColdFusion 10 для создания электронной таблицы Excel. Однако, когда я использую SpreadsheetFormatRow() и передаю строки для форматирования, он делает только около 3, а затем резко останавливается. Вот пример...

Код ColdFusion

<cfscript>

    rowCount = 1;
    headingRows = 4;

    // Create instance of new Spreadsheet
    excelSheet = SpreadsheetNew("ReportName",false); 

    // HEADING (IMAGE) ROW FORMAT
    formatHeadingRow = StructNew();
    formatHeadingRow.fgcolor="blue";        

    // Add rows to fill the header area (must add as many as we are spanning with the above image)
    for (x=0;x<headingRows;x++) {
        SpreadsheetAddRow(excelSheet,"TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST,TEST");
        SpreadsheetFormatRow(excelSheet,formatHeadingRow,rowCount);
        rowCount++;
    }

</cfscript>

<!--- stream it to the browser --->
<cfheader name="Content-Disposition" value="inline; filename=reportName.xls">
<cfcontent type="application/vnd.ms-excel" variable="#SpreadSheetReadBinary(excelSheet)#">

и вот скриншот получившегося листа Excel

введите здесь описание изображения

Почему форматирование останавливается после X строк и ячеек? Если я перейду на использование формата XML с

excelSheet = SpreadsheetNew("ReportName",true);

он работает правильно. Однако я использую пользовательскую палитру для своих цветов, поэтому я не думаю, что переход на формат XLSX мне подойдет. Когда я пытаюсь, а затем звоню

palette = excelSheet.getWorkbook().getCustomPalette();

Я получаю сообщение об ошибке о том, что метод getCustomPalette() не определен.

coldfusion.runtime.java.MethodSelectionException: The getcustompalette method was not found

Может ли кто-нибудь помочь мне понять это? Спасибо!!!

Или даже лучше, поскольку он работает с форматом XML, может ли кто-нибудь показать пример использования пользовательской палитры с XLSX (формат xml)


person Phil    schedule 14.06.2016    source источник
comment
Только что попробовал ваш код через trycf, и он отлично работает на cf10   -  person John Whish    schedule 14.06.2016
comment
@JohnWhish Я только что попытался использовать вашу ссылку на trycf.com, и это дало мне те же результаты. Сломанное форматирование после нескольких строк, последние несколько ячеек остались белыми, а не синими. Какая версия Экселя? У меня Excel 2016 с Office 365.   -  person Phil    schedule 14.06.2016


Ответы (2)


Это проблема, с которой я часто сталкивался при работе с файлами xls из CF; они, похоже, перестают применять стили после определенного количества ячеек. Я смог обойти это, выведя вместо этого xlsx. (Таким образом, я смог воспроизвести и «исправить» вашу проблему.)

excelSheet = SpreadsheetNew("ReportName",true); 

...

<cfheader name="Content-Disposition" value="inline; filename=reportName.xlsx">
<cfcontent type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"
        variable="#SpreadSheetReadBinary(excelSheet)#">
person Tim Jasko    schedule 14.06.2016
comment
хотя это работает, мне нужно использовать пользовательскую палитру с моей электронной таблицей, поэтому я не ограничен предопределенными цветами HSSF. Когда я пытаюсь использовать параметр XLSL, метод getCustomPalette() больше недоступен в объекте рабочей книги. - person Phil; 14.06.2016

Поскольку вы применяете один и тот же формат ко всем строкам, делайте это один раз, а не к каждой строке. Использование SpreadsheetFormatCellRange после того, как цикл должен решить проблему:

SpreadsheetFormatCellRange(excelSheet
                             , formatHeadingRow
                              , startRow
                              , startCol
                              , endRow
                              , endCol ); 

Я подозреваю, что проблема каким-то образом связана с максимальными ограничениями стиля Excel< /а>. Поскольку CF — это черный ящик, трудно понять, сколько стилей он на самом деле создает или как именно они применяются. Однако, по моему опыту, очень легко выйти за пределы стиля, даже не подозревая об этом. Особенно при использовании более старого формата файлов .xls, ограничения которого намного ниже. Вот почему я предложил использовать вместо этого более новый формат .xlsx.

Метод getCustomPalette() не определен.

Верный. Его нет в XSSF. Есть ли какая-то причина, по которой вам нужна пользовательская палитра, а не просто определение ваших собственных цветов, как указано в ваша другая тема?

person Leigh    schedule 14.06.2016
comment
реализовать пример, который вы предоставили в моем другом посте, чтобы получить мои собственные цвета и переключиться на формат XSLX. - person Phil; 14.06.2016
comment
Справедливости ради, если вы собираетесь переключиться на xlsx, @TimJasko сначала предложил это :) Хотя вышеизложенное действительно решает проблему для .xls, честно говоря, это только отсрочивает неизбежное в отношении стилей. Лучший вариант — переключиться на .xlsx, который обладает большей функциональностью и более высокими ограничениями стиля. - person Leigh; 15.06.2016