можно ли прочитать цвет фона ячейки на листе excel с помощью coldfusion

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

Обычно я размещал каждый тип действия в отдельной колонке или добавлял еще одну колонку для определения действия.

Какие варианты у меня есть для получения «формата», который возвращается в объекте электронной таблицы?

Спасибо


person illiquent    schedule 15.01.2014    source источник
comment
Какую версию ColdFusion вы используете?   -  person Sean Coyne    schedule 16.01.2014


Ответы (1)


Полагаться на цвет ячейки звучит хрупко, ИМО. Назначение столбца явных действий было бы лучшим подходом IMO.

Тем не менее, можно получить доступ к цвету. Однако встроенных методов CF нет. Вы должны погрузиться в основной POI. Сначала выполните итерацию по ячейкам в электронной таблице:

<cfscript>
   // get the sheet you want to read
   cfSheet = SpreadSheetRead("c:/path/to/somefile.xlsx"); 
   workbook = cfSheet.getWorkBook();
   sheetIndex = workbook.getActiveSheetIndex();
   sheet = workbook.getSheetAt( sheetIndex );


   // process the rows and columns
   rows = sheet.rowIterator();
   while (rows.hasNext()) {
       currentRow = rows.next();

       // loop through populated cells in this row
       cells = currentRow.cellIterator();
       while (cells.hasNext()) { 
           currentCell = cells.next();

           // .... get color
       }
    }
</cfscript>

Затем для каждой ячейки извлеките цвет стиля. Не проверял, но что-то вроде этого должно работать. (См. XSSFColor)

   cellColor = currentCell.getCellStyle().getFillForegroundColorColor();
   colorValue = cellColor.getARGBHex(); 

Обновление:

Как упоминалось в комментариях @Sean, в CF9 нет описанного выше метода. К сожалению, getFillForegroundColorColor() и getARGBHex() были представлены примерно в 3.7, но CF поставляется с более ранней версией: 3.5 (я думаю). Поэтому вместо этого вы должны использовать метод индексированного цвета (или обновить банки POI).

    // only create once
    colors = createObject("java", "org.apache.poi.ss.usermodel.IndexedColors");

    //....
    cellColor = currentCell.getCellStyle().getFillForegroundColor();
    if (cellColor == colors.RED.getIndex()) {
       WriteDump("This cell is RED. Do something...");          
    }
person Leigh    schedule 15.01.2014
comment
если вы знаете, какая это ячейка, вы можете захватить ее без повторения, например: ss.getWorkbook().getSheetAt(0).getRow(0).getCell(0).getCellStyle().getFillForegroundColor(), где ss — ваш объект электронной таблицы, а лист 0 — это нужный вам лист, и в этом примере вам нужна ячейка A1 (0,0). Кроме того, в ходе тестирования я обнаружил, что getFillForegroundColor() на самом деле то, что вам нужно, а не фон. YMMV. - person Sean Coyne; 16.01.2014
comment
(Изменить) К сожалению, ошибка копирования и вставки. Хороший улов @Sean. Ага. Если вы не знакомы с POI, просто а) следите за нулями б) будьте осторожны с индексами, которые начинаются с нуля (0), а не с единицы (1), как в CF. - person Leigh; 16.01.2014
comment
Ну, все, что он хочет сделать, это выяснить, зеленый ли он. Так что ему не нужен код RGB. Ему просто нужно сопоставить его с зеленым кодом. Вы можете получить код для зеленого, запустив greenCode = createobject('java', 'org.apache.poi.hssf.util.HSSFColor$GREEN').getIndex();, который возвращает 17. Затем вы можете проверить результат getFillForegroundColor() в моем комментарии выше, чтобы получить индекс цвета ячейки. Если они совпадают, то ячейка становится зеленой! Вы можете получить различные цветовые коды здесь: poi. apache.org/apidocs/org/apache/poi/hssf/util/HSSFColor.html просто замените ЗЕЛЕНЫЙ на цвет - person Sean Coyne; 16.01.2014
comment
@SeanCoyne - Нет, это была моя ошибка. Попытка сделать слишком много дел одновременно. Я забыл, что нужный метод на самом деле называется с именем xxxxColorColor ;-) - person Leigh; 16.01.2014
comment
Ну, еще один способ сделать это был бы примерно таким (просто другой взгляд на Ли). Сопоставьте индекс цвета с известными индексами. gist.github.com/seancoyne/8447155 - person Sean Coyne; 16.01.2014
comment
Хм, у моего объекта стиля нет метода getXXXColorColor(). Выдает там ошибку. Ты уверен, @Leigh? - person Sean Coyne; 16.01.2014
comment
@Шон - Ага. Какую версию CF вы используете? getFillForegroundColorColor() работает с CF9.0.1. Re: Использование индексированных цветов зависит от формата файла. В документах упоминается, что он устарел для XSSF, но для устаревшего формата HSSF это нормально. - person Leigh; 16.01.2014
comment
Если сбрасывать стиль, то какие методы у вас есть? - person Leigh; 16.01.2014
comment
У меня есть getFillForegroundColor() и getFillBackgroundColor(), оба из которых возвращают короткое замыкание. Но нет версий ColorColor() этих методов. - person Sean Coyne; 16.01.2014
comment
Хм.. странно. Позвольте мне проверить банки и CF10. Убедитесь, что на этом компьютере не установлена ​​более новая версия POI. - person Leigh; 16.01.2014
comment
Ух... оказывается, моя тестовая машина использовала более новую версию 3.7, чем поставляется с CF9. Печально то, что версия 3.7 довольно старая... а CF10 поставляется с еще более старой версией! Время обновить POI. - person Leigh; 16.01.2014