Bugzilla 53763: avoid style mess when using HSSFOptimiser
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1397548 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
96959c79f8
commit
6000b0e528
@ -65,7 +65,6 @@
|
|||||||
<target name="patchpackage" depends="createpatch,newfiles">
|
<target name="patchpackage" depends="createpatch,newfiles">
|
||||||
<delete file="${patch.package}"/>
|
<delete file="${patch.package}"/>
|
||||||
<tar includes="${tar.file.list}"
|
<tar includes="${tar.file.list}"
|
||||||
excludes="${patch.file}"
|
|
||||||
destfile="${patch.package}"
|
destfile="${patch.package}"
|
||||||
basedir="."
|
basedir="."
|
||||||
compression="gzip" >
|
compression="gzip" >
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
|
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.9-beta1" date="2012-??-??">
|
<release version="3.9-beta1" date="2012-??-??">
|
||||||
|
<action dev="poi-developers" type="fix">53763 - avoid style mess when using HSSFOptimiser </action>
|
||||||
<action dev="poi-developers" type="fix">52972 - preserve leading / trailing spaces in SXSSF </action>
|
<action dev="poi-developers" type="fix">52972 - preserve leading / trailing spaces in SXSSF </action>
|
||||||
<action dev="poi-developers" type="fix">53965 - Fixed XmlValueOutOfRangeExceptio calling getDataValidations for custom validations with XSSFSheet </action>
|
<action dev="poi-developers" type="fix">53965 - Fixed XmlValueOutOfRangeExceptio calling getDataValidations for custom validations with XSSFSheet </action>
|
||||||
<action dev="poi-developers" type="fix">53974 - Avoid NPE when constructing HSSFWorbook on Google App Engine</action>
|
<action dev="poi-developers" type="fix">53974 - Avoid NPE when constructing HSSFWorbook on Google App Engine</action>
|
||||||
|
@ -82,12 +82,16 @@ import org.apache.poi.hssf.record.WindowProtectRecord;
|
|||||||
import org.apache.poi.hssf.record.WriteAccessRecord;
|
import org.apache.poi.hssf.record.WriteAccessRecord;
|
||||||
import org.apache.poi.hssf.record.WriteProtectRecord;
|
import org.apache.poi.hssf.record.WriteProtectRecord;
|
||||||
import org.apache.poi.hssf.record.common.UnicodeString;
|
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.hssf.util.HSSFColor;
|
||||||
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName;
|
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalName;
|
||||||
import org.apache.poi.ss.formula.EvaluationWorkbook.ExternalSheet;
|
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.ss.usermodel.BuiltinFormats;
|
||||||
import org.apache.poi.util.Internal;
|
import org.apache.poi.util.Internal;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
@ -845,6 +849,19 @@ public final class InternalWorkbook {
|
|||||||
records.remove(rec); // this updates XfPos for us
|
records.remove(rec); // this updates XfPos for us
|
||||||
numxfs--;
|
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--;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -252,13 +252,18 @@ public class HSSFOptimiser {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Zap the un-needed user style records
|
// Zap the un-needed user style records
|
||||||
for(int i=21; i<newPos.length; i++) {
|
// removing by index, because removing by object may delete
|
||||||
if(zapRecords[i]) {
|
// styles we did not intend to (the ones that _were_ duplicated and not the duplicates)
|
||||||
workbook.getWorkbook().removeExFormatRecord(
|
int max = newPos.length;
|
||||||
xfrs[i]
|
int removed = 0; // to adjust index after deletion
|
||||||
);
|
for(int i=21; i<max; i++) {
|
||||||
}
|
if(zapRecords[i + removed]) {
|
||||||
}
|
workbook.getWorkbook().removeExFormatRecord(i);
|
||||||
|
i--;
|
||||||
|
max--;
|
||||||
|
removed++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Finally, update the cells to point at their new extended format records
|
// Finally, update the cells to point at their new extended format records
|
||||||
for(int sheetNum=0; sheetNum<workbook.getNumberOfSheets(); sheetNum++) {
|
for(int sheetNum=0; sheetNum<workbook.getNumberOfSheets(); sheetNum++) {
|
||||||
|
@ -224,6 +224,7 @@ public final class TestHSSFOptimiser extends TestCase {
|
|||||||
assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex());
|
assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex());
|
||||||
// cs2 -> 22
|
// cs2 -> 22
|
||||||
assertEquals(22, r.getCell(1).getCellValueRecord().getXFIndex());
|
assertEquals(22, r.getCell(1).getCellValueRecord().getXFIndex());
|
||||||
|
assertEquals(22, r.getCell(1).getCellStyle().getFont(wb).getFontHeight());
|
||||||
// cs3 = cs1 -> 21
|
// cs3 = cs1 -> 21
|
||||||
assertEquals(21, r.getCell(2).getCellValueRecord().getXFIndex());
|
assertEquals(21, r.getCell(2).getCellValueRecord().getXFIndex());
|
||||||
// cs4 --> 24 -> 23
|
// cs4 --> 24 -> 23
|
||||||
@ -269,4 +270,44 @@ public final class TestHSSFOptimiser extends TestCase {
|
|||||||
// csD -> cs1 -> 21
|
// csD -> cs1 -> 21
|
||||||
assertEquals(21, r.getCell(8).getCellValueRecord().getXFIndex());
|
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());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user