2016-10-27 1 views
1

Я читаю очень большие (150 Мб) xlsx-файлы. У меня есть собственный XSSFSheetXMLHandler.SheetContentsHandler для извлечения интересующих данных. (Он выполняется быстро и быстро). Однако для каждой ячейки переопределенный методПолучение информации о стиле с использованием XSSFSheetXMLHandler

cell(String cellReference, String formattedValue, XSSFComment comment) 

только получает меня ссылку на ячейку и значение.

Как я могу получить стиль (и, следовательно, цвет заливки переднего плана), примененный к этой ячейке? XSSFSheetXMLHandler дает мне данные StylesTable - поэтому я знаю, какие стили существуют, все, что у меня нет, - это любой указатель из каждой ячейки в StylesTable. Единственное решение состоит в том, чтобы расширить XSSFSheetXMLHandler, а затем начать обратную разработку анализа SAX.

Это единственный подход?

ответ

1

Возьмите исходный код для XSSFSheetXMLHandler из источника POI Apache; это довольно просто.

Я нашел, что имеет смысл клонировать этот класс, чтобы делать все, что мне нужно, чем проходить в SheetHandler. Я смог добиться всего (стиля, цвета, границ, объединенных ячеек и т. Д.), Которые я сделал с пользовательским API, прежде чем я столкнулся с проблемами памяти, обрабатывая большие файлы XLSX.

Например, я немного изменил обработчик «c» в элементе startElement. Я сохраняю XSSFCellStyle как свойство класса, а затем могу использовать его в cellHandler.

// c => cell 
     else if ("c".equals(localName)) { 
      // Set up defaults. 
      this.nextDataType = xssfDataType.NUMBER; 
      this.formatIndex = -1; 
      this.formatString = null; 
      cellRef = attributes.getValue("r"); 
      String cellType = attributes.getValue("t"); 
      String cellStyleStr = attributes.getValue("s"); 
      if (stylesTable != null) { 
       if (cellStyleStr != null) { 
        int styleIndex = Integer.parseInt(cellStyleStr); 
        this.cellStyle = stylesTable.getStyleAt(styleIndex); 
       } else if (stylesTable.getNumCellStyles() > 0) { 
        this.cellStyle = stylesTable.getStyleAt(0); 
       } 
      } 

и использовать его позже (например, в cellHandler):

XSSFFont cellFont = cellStyle.getFont(); 
     if(cellFont.getXSSFColor() != null) { 
      // set hex colour in style. drop first 2 hex characters since they represent alpha 
      styles.put(CSS_COLOR, "#"+cellFont.getXSSFColor().getARGBHex().substring(2)); 
     } 

клетки: Объединенные

else if ("mergeCell".equals(localName)) { 
      if (attributes.getValue("ref") != null) { 
       CellRangeAddress cra = CellRangeAddress.valueOf(attributes.getValue("ref")); 
       // store merged cell ranges in hashmap?  
      } 
     }