ПРЕДПОСЫЛКА: Я пытаюсь прочитать файл Excel в программе Java. Мой файл Excel предназначен для представления сетки или растровой карты, поэтому я сделал высоту и ширину каждой ячейки на дюйм. Идея состоит в том, что я могу «нарисовать» карту или изображение путем штриховки в каждой ячейке с цветом. Затем я могу прочитать файл Excel в Java-программе, которую я создал с объектом «Pixel», и создать более буквальное изображение. Я - студент в области компьютерных наук, и на данный момент у меня только четыре класса компьютерных наук. Я понимаю ООП и могу программировать на Java. Это не для класса; это побочный проект. Я использую XSSF (Microsoft 2007 и после).Прочитайте цвет из пустой ячейки в Excel на Java с помощью Apache POI
ИССЛЕДОВАНИЕ: Я обнаружил, что решением для этого является использование POI Apache. Я уже загрузил необходимые файлы jar Apache POI и настроил BuildPath в Eclipse, чтобы прочитать их. Я обнаружил, что использование метода Iterator
hasNext()
пропускает пустые ячейки, поэтому решение должно использовать более прямой метод getCell()
. Я обнаружил, что есть два метода getCell()
- один с индексом только как входной, и один, который использует как вход индекса, так и MissingCellPolicy. Однако, когда я попытался использовать метод MissingCellPolicy, поместив RETURN_NULL_AND_BLANK
в качестве ввода, он сделал ячейку пустой, но сделал нулевой цвет в этом процессе. Аналогичная проблема имеет MissingCellPolicy CREATE_NULL_AS_BLANK
.
НЕПОСРЕДСТВЕННОЕ РЕШЕНИЕ: Когда я помещаю текст в ячейку, он правильно считывает цвет. Даже метод итератора может корректно считывать ячейки, в которых есть текст. Это связано с тем, что как только я помещаю в них текст, ячейка инициализируется. Однако сетка, которую я пытаюсь сделать, слишком велика для того, чтобы я помещал текст в каждую ячейку. Вероятно, есть способ установить для каждой ячейки на листе тот же текст, но я не могу этого сделать, потому что у меня уже есть много ячеек с определенным текстом в моей сетке, и их нельзя стереть. Это также, вероятно, сделает все ячейки одного и того же цвета, которые я также не могу сделать в этот момент. Кроме того, я бы предпочел, чтобы у меня были ячейки без текста.
TL; DR: Мне нужно прочитать цвет ячейки в Excel на Java с помощью Apache POI без ввода текста в ячейку. По моему мнению, метод getCell()
с MissingCellPolicy не работает, потому что политика создает новую пустую ячейку, перезаписывая существующий цвет. Я видел много вопросов относительно чтения пустых ячеек в POI Apache, но я не видел одного о доступе к цвету.
MAIN CODE:
try {
FileInputStream file = new FileInputStream(new File("My FilePath"));
XSSFWorkbook workbook = new XSSFWorkbook(file);
XSSFSheet sheet = workbook.getSheetAt(0);
for(int i=0; i<5040; i++) {
Row row = sheet.getRow(i);
for(int j=0; j<10080; j++) {
Cell cell = row.getCell(j, Row.MissingCellPolicy.RETURN_NULL_AND_BLANK);
ExtendedColor color = (ExtendedColor) cell.getCellStyle().getFillForegroundColorColor();
//NOTE: getFillBackgroundColorColor did not work! It only returns the color black.
byte[] bytes = color.getRGB();
RGBColor rgb = new RGBColor(bytes);
String text = cell.getStringCellValue();
Coordinate coordinate = new Coordinate(j, i);
Tile tile = new Tile(rgb, text);
map[j][i] = tile;
// Coordinate and Tile are other objects I made myself.
// The map is a two-dimensional array of Tiles, declared previously.
// I left this code here because it works.
}
}
workbook.close();
file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
RGBColor
Конструктор Код:
public RGBColor(byte[] bytes) {
if(bytes != null) {
this.red = (int) bytes[0];
this.green = (int) bytes[1];
this.blue = (int) bytes[2];
if(red<0) {red = red+256;}
if(green<0) {green = green+256;}
if(blue<0) {blue = blue+256;}
}
RESULT:
Приведенный выше код правильно считывает цвет ячейки, если он имеет текст в нем и создает объект RGBColor из цвет. Вышеприведенный код также может читать текст из ячейки. Однако, как только он достигает ячейки без текста, она вызывает NullPointerException
в строке ExtendedColor (поэтому ячейка равна нулю). Когда вместо этого используется MissingCellPolicy CREATE_NULL_AS_BLANK, он вызывает NullPointerException
по линии byte[]
(так что цвет является нулевым). Любая помощь приветствуется, даже если это не совсем то, о чем я прошу, потому что я новичок в Apache POI
!
Благодарим за скорый комментарий, но это не сработает в моей ситуации. Я не хочу, чтобы каждая нулевая ячейка была одного цвета, и нет способа назначить цвет по местоположению. Нулевые ячейки уже имеют цвет в файле excel. Я хочу извлечь этот цвет - он уже существует. – Luke1195
Вы правы. Я неправильно понял ваш вопрос. –