2017-01-02 19 views
0

ПРЕДПОСЫЛКА: Я пытаюсь прочитать файл Excel в программе Java. Мой файл Excel предназначен для представления сетки или растровой карты, поэтому я сделал высоту и ширину каждой ячейки на дюйм. Идея состоит в том, что я могу «нарисовать» карту или изображение путем штриховки в каждой ячейке с цветом. Затем я могу прочитать файл Excel в Java-программе, которую я создал с объектом «Pixel», и создать более буквальное изображение. Я - студент в области компьютерных наук, и на данный момент у меня только четыре класса компьютерных наук. Я понимаю ООП и могу программировать на Java. Это не для класса; это побочный проект. Я использую XSSF (Microsoft 2007 и после).Прочитайте цвет из пустой ячейки в Excel на Java с помощью Apache POI

ИССЛЕДОВАНИЕ: Я обнаружил, что решением для этого является использование POI Apache. Я уже загрузил необходимые файлы jar Apache POI и настроил BuildPath в Eclipse, чтобы прочитать их. Я обнаружил, что использование метода IteratorhasNext() пропускает пустые ячейки, поэтому решение должно использовать более прямой метод 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!

ответ

0

одного цветные клетки никогда не может быть пустым. Он должен существовать. Таким образом, мы можем перебирать только существующие ячейки. CellStyle не имеет значения null для определения. Но CellStyle.getFillForegroundColorColor может вернуть null, если нет цвета. Поэтому нам нужно проверить.

Предположив следующий лист:

enter image description here

Код:

import org.apache.poi.ss.usermodel.*; 
import java.io.*; 

import java.util.Arrays; 

class ReadColorsFromExcel { 

public static void main(String[] args) throws Exception{ 

    InputStream inp = new FileInputStream("MyFile.xlsx"); 
    Workbook workbook = WorkbookFactory.create(inp); 
    Sheet sheet = workbook.getSheetAt(0); 
    for (Row row : sheet) { 
    for (Cell cell : row) { // cell will always be not-null only existing cells are in loop 
    CellStyle cellStyle = cell.getCellStyle(); // cellStyle is always not-null 
    ExtendedColor extendedColor = (ExtendedColor)cellStyle.getFillForegroundColorColor(); // extendedColor may be null 
    String color = "none"; 
    if (extendedColor != null) { 
    byte[] bytes = extendedColor.getRGB(); 
    color = Arrays.toString(bytes); 
    } 
    System.out.println("Cell " + cell.getAddress() + " of type " + cell.getCellType() + " has color " + color); 
    } 
    } 
} 
} 

Напечатает:

Cell A1 of type 1 has color none 
Cell B1 of type 0 has color [-1, -1, 0] 
Cell C1 of type 2 has color none 
Cell B3 of type 0 has color none 
Cell C3 of type 3 has color [-110, -48, 80] 
Cell D4 of type 1 has color none 
Cell B6 of type 3 has color [0, 112, -64] 
Cell D7 of type 3 has color [-1, 0, 0] 
Cell A9 of type 3 has color [-1, -64, 0] 
Cell F12 of type 3 has color [0, -80, 80] 

Но в Excel целые столбцы и целые строки также могут иметь стили. Если это так, то не ячейки будут иметь цвет, а столбцы и/или строки. Поэтому, если необходимо также получить не существующие ячейки, такие, которые не сохраняются и поэтому имеют значение null, а также учитывать, что могут быть стили столбцов (целые столбцы) и стили строк (целые строки), тогда рассмотрим следующие :

Лист:

enter image description here

Все клетки (все столбцы) имеют белый фон, строка 8 имеет светло-голубой фон, колонка Е имеет светло-зеленый фон. Некоторые ячейки имеют собственный фон клеток.

Код:

import org.apache.poi.ss.usermodel.*; 
import java.io.*; 

import java.util.Arrays; 

class ReadColorsFromExcel { 

public static void main(String[] args) throws Exception{ 

    InputStream inp = new FileInputStream("MyFile.xlsx"); 
    Workbook workbook = WorkbookFactory.create(inp); 
    Sheet sheet = workbook.getSheetAt(0); 

    int lastRow = 12; 
    int lastCol = 6; 

    for (int rowNum = 0; rowNum < lastRow; rowNum++) { 
    Row row = sheet.getRow(rowNum); 
    if (row == null) { 
    row = sheet.createRow(rowNum); 
    } 
    CellStyle rowStyle = row.getRowStyle(); // if the whole row has a style 
    for (int colNum = 0; colNum < lastCol; colNum++) { 
    CellStyle colStyle = sheet.getColumnStyle(colNum); // if the whole column has a style 
    Cell cell = row.getCell(colNum, Row.MissingCellPolicy.CREATE_NULL_AS_BLANK); 
    CellStyle cellStyle = cell.getCellStyle(); // cellStyle is always not-null 
    String color = "none"; 
    ExtendedColor extendedColor = (ExtendedColor)cellStyle.getFillForegroundColorColor(); // first we try cellStyle 
    if (extendedColor == null && rowStyle != null) extendedColor = (ExtendedColor)rowStyle.getFillForegroundColorColor(); // now we try rowStyle 
    if (extendedColor == null && colStyle != null) extendedColor = (ExtendedColor)colStyle.getFillForegroundColorColor(); // at last we try colStyle 
    if (extendedColor != null) { 
    byte[] bytes = extendedColor.getRGB(); 
    color = Arrays.toString(bytes); 
    } 
    System.out.println("Cell " + cell.getAddress() + " of type " + cell.getCellType() + " has color " + color); 
    } 
    } 
} 
} 

Теперь все возможные стили должны быть приняты во внимание.

0

В конечном счете, что происходит, вы пытаетесь иметь дело с нулевыми или пустыми ячейками и не обрабатывать их, когда сталкиваетесь с ними.То, что вы хотите сделать что-то вроде этого после вызова GetCell():

if (cell == null || cell.getCellType() == Cell.CELL_TYPE_BLANK) { 
    // assign whatever color you want for a blank cell to rgb 
} else { 
    // do your logic to get the ExtendedColor and turn it into an RGBColor 
} 
+0

Благодарим за скорый комментарий, но это не сработает в моей ситуации. Я не хочу, чтобы каждая нулевая ячейка была одного цвета, и нет способа назначить цвет по местоположению. Нулевые ячейки уже имеют цвет в файле excel. Я хочу извлечь этот цвет - он уже существует. – Luke1195

+0

Вы правы. Я неправильно понял ваш вопрос. –

 Смежные вопросы

  • Нет связанных вопросов^_^