Bug 53611: populate dimension of XSSF Worksheet when writing the document

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1767096 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Dominik Stadler 2016-10-29 07:38:46 +00:00
parent d47fff6e1c
commit ca4a7d2f27
2 changed files with 48 additions and 7 deletions

View File

@ -3451,8 +3451,28 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
worksheet.getHyperlinks().setHyperlinkArray(ctHls);
}
int minCell=Integer.MAX_VALUE, maxCell=Integer.MIN_VALUE;
for(XSSFRow row : _rows.values()){
// first perform the normal write actions for the row
row.onDocumentWrite();
// then calculate min/max cell-numbers for the worksheet-dimension
if(row.getFirstCellNum() != -1) {
minCell = Math.min(minCell, row.getFirstCellNum());
}
if(row.getLastCellNum() != -1) {
maxCell = Math.max(maxCell, row.getLastCellNum());
}
}
// finally, if we had at least one cell we can populate the optional dimension-field
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);
}
}
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);

View File

@ -25,13 +25,7 @@ import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.*;
import java.util.Arrays;
import java.util.Calendar;
import java.util.HashMap;
@ -3169,4 +3163,31 @@ public final class TestXSSFBugs extends BaseTestBugzillaIssues {
sheet = wb.getSheetAt(4);
assertNotNull(sheet.getDrawingPatriarch());
}
@Test
public void test53611() throws IOException {
Workbook wb = new XSSFWorkbook();
Sheet sheet = wb.createSheet("test");
Row row = sheet.createRow(1);
Cell cell = row.createCell(1);
cell.setCellValue("blabla");
row = sheet.createRow(4);
cell = row.createCell(7);
cell.setCellValue("blabla");
// we currently only populate the dimension during writing out
// to avoid having to iterate all rows/cells in each add/remove of a row or cell
//OutputStream str = new FileOutputStream("/tmp/53611.xlsx");
OutputStream str = new ByteArrayOutputStream();
try {
wb.write(str);
} finally {
str.close();
}
assertEquals("B2:I5", ((XSSFSheet)sheet).getCTWorksheet().getDimension().getRef());
wb.close();
}
}