diff --git a/patch.xml b/patch.xml index 61b3cb7a9..2ad888675 100755 --- a/patch.xml +++ b/patch.xml @@ -65,7 +65,6 @@ diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index a94ba77bf..a953da8f6 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -34,6 +34,7 @@ + 53763 - avoid style mess when using HSSFOptimiser 52972 - preserve leading / trailing spaces in SXSSF 53965 - Fixed XmlValueOutOfRangeExceptio calling getDataValidations for custom validations with XSSFSheet 53974 - Avoid NPE when constructing HSSFWorbook on Google App Engine diff --git a/src/java/org/apache/poi/hssf/model/InternalWorkbook.java b/src/java/org/apache/poi/hssf/model/InternalWorkbook.java index 7161e48f1..88b9d63ef 100644 --- a/src/java/org/apache/poi/hssf/model/InternalWorkbook.java +++ b/src/java/org/apache/poi/hssf/model/InternalWorkbook.java @@ -82,12 +82,16 @@ import org.apache.poi.hssf.record.WindowProtectRecord; import org.apache.poi.hssf.record.WriteAccessRecord; import org.apache.poi.hssf.record.WriteProtectRecord; import org.apache.poi.hssf.record.common.UnicodeString; -import org.apache.poi.ss.formula.FormulaShifter; -import org.apache.poi.ss.formula.udf.UDFFinder; -import org.apache.poi.ss.formula.ptg.*; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName; import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet; +import org.apache.poi.ss.formula.FormulaShifter; +import org.apache.poi.ss.formula.ptg.Area3DPtg; +import org.apache.poi.ss.formula.ptg.NameXPtg; +import org.apache.poi.ss.formula.ptg.OperandPtg; +import org.apache.poi.ss.formula.ptg.Ptg; +import org.apache.poi.ss.formula.ptg.Ref3DPtg; +import org.apache.poi.ss.formula.udf.UDFFinder; import org.apache.poi.ss.usermodel.BuiltinFormats; import org.apache.poi.util.Internal; import org.apache.poi.util.POILogFactory; @@ -845,6 +849,19 @@ public final class InternalWorkbook { records.remove(rec); // this updates XfPos for us numxfs--; } + + /** + * Removes ExtendedFormatRecord record with given index from the + * file's list. This will make all + * subsequent font indicies drop by one, + * so you'll need to update those yourself! + * @param index of the Extended format record (0-based) + */ + public void removeExFormatRecord(int index) { + int xfptr = records.getXfpos() - (numxfs - 1) + index; + records.remove(xfptr); // this updates XfPos for us + numxfs--; + } /** diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFOptimiser.java b/src/java/org/apache/poi/hssf/usermodel/HSSFOptimiser.java index e8768dc2a..7c0851a42 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFOptimiser.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFOptimiser.java @@ -252,13 +252,18 @@ public class HSSFOptimiser { } // Zap the un-needed user style records - for(int i=21; i 22 assertEquals(22, r.getCell(1).getCellValueRecord().getXFIndex()); + assertEquals(22, r.getCell(1).getCellStyle().getFont(wb).getFontHeight()); // cs3 = cs1 -> 21 assertEquals(21, r.getCell(2).getCellValueRecord().getXFIndex()); // cs4 --> 24 -> 23 @@ -269,4 +270,44 @@ public final class TestHSSFOptimiser extends TestCase { // csD -> cs1 -> 21 assertEquals(21, r.getCell(8).getCellValueRecord().getXFIndex()); } + + public void testOptimiseStylesCheckActualStyles() { + HSSFWorkbook wb = new HSSFWorkbook(); + + // Several styles + assertEquals(21, wb.getNumCellStyles()); + + HSSFCellStyle cs1 = wb.createCellStyle(); + cs1.setBorderBottom(HSSFCellStyle.BORDER_THICK); + + HSSFCellStyle cs2 = wb.createCellStyle(); + cs2.setBorderBottom(HSSFCellStyle.BORDER_DASH_DOT); + + HSSFCellStyle cs3 = wb.createCellStyle(); // = cs1 + cs3.setBorderBottom(HSSFCellStyle.BORDER_THICK); + + assertEquals(24, wb.getNumCellStyles()); + + // Use them + HSSFSheet s = wb.createSheet(); + HSSFRow r = s.createRow(0); + + r.createCell(0).setCellStyle(cs1); + r.createCell(1).setCellStyle(cs2); + r.createCell(2).setCellStyle(cs3); + + assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex()); + assertEquals(22, r.getCell(1).getCellValueRecord().getXFIndex()); + assertEquals(23, r.getCell(2).getCellValueRecord().getXFIndex()); + + // Optimise + HSSFOptimiser.optimiseCellStyles(wb); + + // Check + assertEquals(23, wb.getNumCellStyles()); + + assertEquals(HSSFCellStyle.BORDER_THICK, r.getCell(0).getCellStyle().getBorderBottom()); + assertEquals(HSSFCellStyle.BORDER_DASH_DOT, r.getCell(1).getCellStyle().getBorderBottom()); + assertEquals(HSSFCellStyle.BORDER_THICK, r.getCell(2).getCellStyle().getBorderBottom()); + } }