What are the limitations (gotchas and) when using POI to create Excel workbooks?

Just saw a crash as we exceeded 255 columns. Maybe this question should go directly to the POI, but let's say I don’t want to interfere with their efforts to further develop this obviously useful API. ;-) The page is not detailed in detail.

So: What is your experience with the actual limitations of assuming that the output should be readable in Excel? Has anyone used POIs to test and study the soft and hard limits of generated Excel POI files?

The only limitations that I can quickly find in the POI are below. Microsoft lists additional restrictions for Excel that do not appear to be covered in the POI.

EDIT: Oh. Just realized that we have not updated the POI in the last 5 years, so the code below may have been replaced 100 times since then.

EDIT: The code below has not changed since and version 3.2 of October 19, 2008.

/**
 * @throws RuntimeException if the bounds are exceeded.
 */
private void checkBounds(int cellNum) {
  if (cellNum > 255) {
      throw new RuntimeException("You cannot have more than 255 columns "+
                "in a given row (IV).  Because Excel can't handle it");
  }
  else if (cellNum < 0) {
      throw new RuntimeException("You cannot reference columns with an index of less then 0.");
  }
}
+3
source share
7 answers

Marliese, poi, , styleManager. , , , . , CellStyleManager.setCellStyle(). , HSSFCellStyle, defaultCellStyle cellStyle. , , cellStyle, CellStyleManager . , , , . attemp reset cellStyle, CellStyleHelper defaultCellStyle, . , , api.

paulgreg , , , . , paulgreg poi, , , , , Excel, .

, , CellStyleHelper. ( , , , getGeneralStyle ( , reset , , ). :

... Creates a workbook
CellStyleManager styleManager = new CellStyleManager(workbook);
... Create a cell
HSSFCellStyle style = styleManager.getGeneralStyle();
styleManager.setCellStyle(cell, style); // no more 4000 styles error!

: PaulGreg!

// CellStyleCacheManager.java

public class CellStyleCacheManager {
    protected Set cellStyles;
    protected HSSFCellStyle cellStyle;
    protected HSSFCellStyle defaultValuesCellStyle;
    protected HSSFWorkbook workbook;

    public CellStyleCacheManager(HSSFWorkbook workbook) {
        this.workbook = workbook;
        this.cellStyles = new HashSet();
        // El desperdicio de estilos será pués de dos
        cellStyle = workbook.createCellStyle();
        // Estilo almacenado para reiniciar el que se va a usar
        defaultValuesCellStyle = workbook.createCellStyle();
    }

    /** Si el estilo se crea con createCellStyle, ya no podremos hacer nada */
    public void setCellStyle(HSSFCell cell, HSSFCellStyle cellStyle) {
        CellStyleWrapper cellStyleWrp = new CellStyleWrapper(cellStyle);
        CellStyleWrapper cachedCellStyleWrp = null;

        Iterator it = cellStyles.iterator();

        while(it.hasNext() && (cachedCellStyleWrp == null)) {
            CellStyleWrapper tmpCachedCellStyleWrp = (CellStyleWrapper) it.next();

            if(tmpCachedCellStyleWrp.equals(cellStyleWrp)) {
                // Si algún estilo coincide con el actual usamos ese
                cachedCellStyleWrp = tmpCachedCellStyleWrp;
            }
        }

        if(cachedCellStyleWrp == null) {
            // Si el estilo no existe creamos uno nuevo
            HSSFCellStyle newCellStyle = workbook.createCellStyle();
            CellStyleCacheManager.copyCellStyle(workbook, cellStyle, newCellStyle);

            CellStyleWrapper newWrp = new CellStyleWrapper(newCellStyle);
            cellStyles.add(newWrp);
            cachedCellStyleWrp = newWrp;
        }

        cell.setCellStyle(cachedCellStyleWrp.getHSSFCellStyle());
    }

    public HSSFCellStyle getGeneralStyle() {
        copyCellStyle(workbook, cellStyle, defaultValuesCellStyle);
        return cellStyle;
    }

    public static void copyCellStyle(HSSFWorkbook wb, HSSFCellStyle c1, HSSFCellStyle c2) {
        c2.setAlignment(c1.getAlignment());
        c2.setBorderBottom(c1.getBorderBottom());
        c2.setBorderLeft(c1.getBorderLeft());
        c2.setBorderRight(c1.getBorderRight());
        c2.setBorderTop(c1.getBorderTop());
        c2.setBottomBorderColor(c1.getBottomBorderColor());
        c2.setDataFormat(c1.getDataFormat());
        c2.setFillBackgroundColor(c1.getFillBackgroundColor());
        c2.setFillForegroundColor(c1.getFillForegroundColor());
        c2.setFillPattern(c1.getFillPattern());

        try {
            c2.setFont(wb.getFontAt(c1.getFontIndex()));
        } catch(NullPointerException e) {
            TLogger.getInstance().log(e.getMessage());
        } catch(ArrayIndexOutOfBoundsException e) {
            TLogger.getInstance().log("Be sure to have intialized all POI font objects !\n%s",e.getMessage());
        }

        c2.setHidden(c1.getHidden());
        c2.setIndention(c1.getIndention());
        c2.setLeftBorderColor(c1.getLeftBorderColor());
        c2.setLocked(c1.getLocked());
        c2.setRightBorderColor(c1.getRightBorderColor());
        c2.setRotation(c1.getRotation());
        c2.setTopBorderColor(c1.getTopBorderColor());
        c2.setVerticalAlignment(c1.getVerticalAlignment());
        c2.setWrapText(c1.getWrapText());
    }   
}

CellStyleWrapper.java

public class CellStyleWrapper implements Comparable {
    private HSSFCellStyle cs;
    private int hashCode;

    public CellStyleWrapper(HSSFCellStyle cs) {
        this.cs = cs;
    }

    public boolean equals(Object obj) {
        CellStyleWrapper csWrp_;
        HSSFCellStyle cs_;

        try {
            csWrp_ = (CellStyleWrapper) obj;
        } catch(ClassCastException e) {
            return false;
        }

        cs_ = csWrp_.getHSSFCellStyle();

        return (cs.getAlignment() == cs_.getAlignment()) && (cs.getBorderBottom() == cs_.getBorderBottom())
                && (cs.getBorderLeft() == cs_.getBorderLeft()) && (cs.getBorderRight() == cs_.getBorderRight())
                && (cs.getBorderTop() == cs_.getBorderTop())
                && (cs.getBottomBorderColor() == cs_.getBottomBorderColor())
                && (cs.getDataFormat() == cs_.getDataFormat())
                && (cs.getFillBackgroundColor() == cs_.getFillBackgroundColor())
                && (cs.getFillForegroundColor() == cs_.getFillForegroundColor())
                && (cs.getFillPattern() == cs_.getFillPattern()) && (cs.getFontIndex() == cs_.getFontIndex())
                && (cs.getHidden() == cs_.getHidden()) && (cs.getIndention() == cs_.getIndention())
                && (cs.getLeftBorderColor() == cs_.getLeftBorderColor()) && (cs.getLocked() == cs_.getLocked())
                && (cs.getRightBorderColor() == cs_.getRightBorderColor()) && (cs.getRotation() == cs_.getRotation())
                && (cs.getTopBorderColor() == cs_.getTopBorderColor())
                && (cs.getVerticalAlignment() == cs_.getVerticalAlignment())
                && (cs.getWrapText() == cs_.getWrapText());
    }

    private int v(int i) {
        if(i == 0) {
            return 1;
        } else {
            return i;
        }
    }

    public int hashCode() {
        if(hashCode == 0) {
            hashCode = 17;
            hashCode = 37 * v(cs.getBorderBottom());
            hashCode = 37 * v(cs.getBorderLeft());
            hashCode = 37 * v(cs.getBorderRight());
            hashCode = 37 * v(cs.getBorderTop());
            hashCode = 37 * v(cs.getBottomBorderColor());
            hashCode = 37 * v(cs.getDataFormat());
            hashCode = 37 * v(cs.getFillBackgroundColor());
            hashCode = 37 * v(cs.getFillForegroundColor());
            hashCode = 37 * v(cs.getFillPattern());
            hashCode = 37 * v(cs.getFontIndex());
            hashCode = 37 * (cs.getHidden() ? 1 : (-1));
            hashCode = 37 * v(cs.getIndention());
            hashCode = 37 * v(cs.getLeftBorderColor());
            hashCode = 37 * (cs.getLocked() ? 1 : (-1));
            hashCode = 37 * v(cs.getRightBorderColor());
            hashCode = 37 * v(cs.getRotation());
            hashCode = 37 * v(cs.getTopBorderColor());
            hashCode = 37 * v(cs.getVerticalAlignment());
            hashCode = 37 * (cs.getWrapText() ? 1 : (-1));
        }

        return hashCode;
    }

    public int compareTo(Object obj) {
        int diff = 0;
        CellStyleWrapper csWrp_;
        HSSFCellStyle cs_;

        try {
            csWrp_ = (CellStyleWrapper) obj;
        } catch(ClassCastException e) {
            return -1;
        }

        cs_ = csWrp_.getHSSFCellStyle();

        diff = cs.getAlignment() - cs_.getAlignment();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getBorderBottom() - cs_.getBorderBottom();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getBorderLeft() - cs_.getBorderLeft();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getBorderRight() - cs_.getBorderRight();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getBorderTop() - cs_.getBorderTop();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getBottomBorderColor() - cs_.getBottomBorderColor();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getDataFormat() - cs_.getDataFormat();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getFillBackgroundColor() - cs_.getFillBackgroundColor();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getFillForegroundColor() - cs_.getFillForegroundColor();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getFillPattern() - cs_.getFillPattern();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getFontIndex() - cs_.getFontIndex();

        if(diff != 0) {
            return diff;
        }

        if(cs.getHidden() != cs_.getHidden()) {
            return -1;
        }

        diff = cs.getIndention() - cs_.getIndention();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getLeftBorderColor() - cs_.getLeftBorderColor();

        if(diff != 0) {
            return diff;
        }

        if(cs.getLocked() != cs_.getLocked()) {
            return -1;
        }

        diff = cs.getRightBorderColor() - cs_.getRightBorderColor();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getRotation() - cs_.getRotation();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getTopBorderColor() - cs_.getTopBorderColor();

        if(diff != 0) {
            return diff;
        }

        diff = cs.getVerticalAlignment() - cs_.getVerticalAlignment();

        if(diff != 0) {
            return diff;
        }

        if(cs.getWrapText() != cs_.getWrapText()) {
            return -1;
        }

        return 0;
    }

    public HSSFCellStyle getHSSFCellStyle() {
        return cs;
    }
}

poi, HSSFCellStyle,

// Why would you do that??
protected HSSFCellStyle(...

4000 , ?

+6

HSSFCellStyles , , . POI CellUtils setCellStyleProperty(), , .

POI 3.7 ( ):

   public void writeFormattedDate(Workbook wb, Cell cell, Date date) {
            CellUtil.setCellStyleProperty(cell, wb, CellUtil.DATA_FORMAT, wb.getCreationHelper().createDataFormat().getFormat("dd-MMM-yyyy"));
            cell.setCellValue(date)
    }

setCellStyleProperty() , . , .

4030 , .

+3

, POI Excel, , , . ( ) , OutOfMemory.

, , POI. , .

+2

( ) , HSSFCellStyle ( , excel).

( excel ), , .

, HSSFCellStyle, , : CellStyleCacheManager.

+1

paulgreg CellStyleCacheManager: , , setCellStyle() HSSFCellStyle HSSFCellStyle, , , , , createCellStyle().

, , , ? - HSSF, ?

+1

@albfan

-, .NET. , , .

getGeneralStyle() :

copyCellStyle(workbook, cellStyle, defaultValuesCellStyle);

cellStyle defaultValuesCellStyle, .

, , :

copyCellStyle(workbook, defaultValuesCellStyle, cellStyle);
+1

- , , , -, . , - paulgreg , .

0

Source: https://habr.com/ru/post/1704420/


All Articles