mirror of https://github.com/apache/poi.git
Excel 2007 and later allows for more than 3 Conditional Formatting rules per sheet, so change our hard limit to logging a compatibility warning. Test file from Pau Coma Ramirez from bug #56482
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1591959 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
aef0863d26
commit
1bf21ef3f9
|
@ -29,15 +29,21 @@ import org.apache.poi.ss.formula.ptg.AreaErrPtg;
|
||||||
import org.apache.poi.ss.formula.ptg.AreaPtg;
|
import org.apache.poi.ss.formula.ptg.AreaPtg;
|
||||||
import org.apache.poi.ss.formula.ptg.Ptg;
|
import org.apache.poi.ss.formula.ptg.Ptg;
|
||||||
import org.apache.poi.ss.util.CellRangeAddress;
|
import org.apache.poi.ss.util.CellRangeAddress;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* CFRecordsAggregate - aggregates Conditional Formatting records CFHeaderRecord
|
* <p>CFRecordsAggregate - aggregates Conditional Formatting records CFHeaderRecord
|
||||||
* and number of up to three CFRuleRecord records together to simplify
|
* and number of up CFRuleRecord records together to simplify access to them.</p>
|
||||||
* access to them.
|
* <p>Note that Excel versions before 2007 can only cope with a maximum of 3
|
||||||
|
* Conditional Formatting rules per sheet. Excel 2007 or newer can cope with
|
||||||
|
* unlimited numbers, as can Apache OpenOffice. This is an Excel limitation,
|
||||||
|
* not a file format one.</p>
|
||||||
*/
|
*/
|
||||||
public final class CFRecordsAggregate extends RecordAggregate {
|
public final class CFRecordsAggregate extends RecordAggregate {
|
||||||
/** Excel allows up to 3 conditional formating rules */
|
/** Excel 97-2003 allows up to 3 conditional formating rules */
|
||||||
private static final int MAX_CONDTIONAL_FORMAT_RULES = 3;
|
private static final int MAX_97_2003_CONDTIONAL_FORMAT_RULES = 3;
|
||||||
|
private static final POILogger logger = POILogFactory.getLogger(CFRecordsAggregate.class);
|
||||||
|
|
||||||
private final CFHeaderRecord header;
|
private final CFHeaderRecord header;
|
||||||
|
|
||||||
|
@ -51,9 +57,11 @@ public final class CFRecordsAggregate extends RecordAggregate {
|
||||||
if(pRules == null) {
|
if(pRules == null) {
|
||||||
throw new IllegalArgumentException("rules must not be null");
|
throw new IllegalArgumentException("rules must not be null");
|
||||||
}
|
}
|
||||||
if(pRules.length > MAX_CONDTIONAL_FORMAT_RULES) {
|
if(pRules.length > MAX_97_2003_CONDTIONAL_FORMAT_RULES) {
|
||||||
throw new IllegalArgumentException("No more than "
|
logger.log(POILogger.WARN, "Excel versions before 2007 require that "
|
||||||
+ MAX_CONDTIONAL_FORMAT_RULES + " rules may be specified");
|
+ "No more than " + MAX_97_2003_CONDTIONAL_FORMAT_RULES
|
||||||
|
+ " rules may be specified, " + pRules.length + " were found,"
|
||||||
|
+ " this file will cause problems with old Excel versions");
|
||||||
}
|
}
|
||||||
if (pRules.length != pHeader.getNumberOfConditionalFormats()) {
|
if (pRules.length != pHeader.getNumberOfConditionalFormats()) {
|
||||||
throw new RuntimeException("Mismatch number of rules");
|
throw new RuntimeException("Mismatch number of rules");
|
||||||
|
@ -134,9 +142,10 @@ public final class CFRecordsAggregate extends RecordAggregate {
|
||||||
if (r == null) {
|
if (r == null) {
|
||||||
throw new IllegalArgumentException("r must not be null");
|
throw new IllegalArgumentException("r must not be null");
|
||||||
}
|
}
|
||||||
if(rules.size() >= MAX_CONDTIONAL_FORMAT_RULES) {
|
if(rules.size() >= MAX_97_2003_CONDTIONAL_FORMAT_RULES) {
|
||||||
throw new IllegalStateException("Cannot have more than "
|
logger.log(POILogger.WARN, "Excel versions before 2007 cannot cope with"
|
||||||
+ MAX_CONDTIONAL_FORMAT_RULES + " conditional format rules");
|
+ " any more than " + MAX_97_2003_CONDTIONAL_FORMAT_RULES
|
||||||
|
+ " - this file will cause problems with old Excel versions");
|
||||||
}
|
}
|
||||||
rules.add(r);
|
rules.add(r);
|
||||||
header.setNumberOfConditionalFormats(rules.size());
|
header.setNumberOfConditionalFormats(rules.size());
|
||||||
|
|
|
@ -2565,4 +2565,18 @@ public final class TestBugs extends BaseTestBugzillaIssues {
|
||||||
}
|
}
|
||||||
assertEquals(0, comments);
|
assertEquals(0, comments);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Files initially created with Excel 2010 can have >3 CF rules
|
||||||
|
*/
|
||||||
|
@Test
|
||||||
|
public void bug56482() {
|
||||||
|
HSSFWorkbook wb = openSample("56482.xls");
|
||||||
|
assertEquals(1, wb.getNumberOfSheets());
|
||||||
|
|
||||||
|
HSSFSheet sheet = wb.getSheetAt(0);
|
||||||
|
HSSFSheetConditionalFormatting cf = sheet.getSheetConditionalFormatting();
|
||||||
|
|
||||||
|
assertEquals(5, cf.getNumConditionalFormattings());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
Binary file not shown.
Loading…
Reference in New Issue