XSSFSheet has this code in the write method: if(row.getLastCellNum() != -1) { maxCell = Math.max(maxCell, row.getLastCellNum()); ... if(minCell != Integer.MAX_VALUE) { String ref = new CellRangeAddress(getFirstRowNum(), getLastRowNum(), minCell, maxCell).formatAsString(); if(worksheet.isSetDimension()) { worksheet.getDimension().setRef(ref); } else { worksheet.addNewDimension().setRef(ref); } } Arguments to the CellRangeAddress are zero-based: /** * Creates new cell range. Indexes are zero-based. However row.getLastCellNum() returns the zero-based last cell number PLUS ONE: * @return short representing the last logical cell in the row <b>PLUS ONE</b>, * or -1 if the row does not contain any cells. */ As a result the dimension in the worksheet has the last column number off by one. A single column sheet with five rows is written with <dimension ref="A1:B5"/> instead of <dimension ref="A1:A5"/>
As far as I see this is already fixed on trunk via bug 61798, r1819404. The next release POI 4.0.0 will be released shortly and will include this fix. *** This bug has been marked as a duplicate of bug 61798 ***