git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1397548 13f79535-47bb-0310-9956-ffa450edef68tags/3.10-beta1
<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" > |
<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> |
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; | ||||
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--; | |||||
} | |||||
/** | /** |
} | } | ||||
// Zap the un-needed user style records | // Zap the un-needed user style records | ||||
for(int i=21; i<newPos.length; i++) { | |||||
if(zapRecords[i]) { | |||||
workbook.getWorkbook().removeExFormatRecord( | |||||
xfrs[i] | |||||
); | |||||
} | |||||
} | |||||
// removing by index, because removing by object may delete | |||||
// styles we did not intend to (the ones that _were_ duplicated and not the duplicates) | |||||
int max = newPos.length; | |||||
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++) { |
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 | ||||
// 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()); | |||||
} | |||||
} | } |