Add details of the ignored errors where the HSSF spec provides a good description, and a bit more refactoring. #56892

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1730543 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Nick Burch 2016-02-15 14:58:16 +00:00
parent 3b5586ea79
commit 8c203f1366
5 changed files with 68 additions and 21 deletions

View File

@ -32,7 +32,8 @@ import org.apache.poi.util.LittleEndianOutput;
* for a sheet, stored as part of a Shared Feature. It can be found in * for a sheet, stored as part of a Shared Feature. It can be found in
* records such as {@link FeatRecord}. * records such as {@link FeatRecord}.
* For the full meanings of the flags, see pages 669 and 670 * For the full meanings of the flags, see pages 669 and 670
* of the Excel binary file format documentation. * of the Excel binary file format documentation and/or
* https://msdn.microsoft.com/en-us/library/dd924991%28v=office.12%29.aspx
*/ */
public final class FeatFormulaErr2 implements SharedFeature { public final class FeatFormulaErr2 implements SharedFeature {
static BitField checkCalculationErrors = static BitField checkCalculationErrors =

View File

@ -17,29 +17,67 @@
package org.apache.poi.ss.usermodel; package org.apache.poi.ss.usermodel;
/** /**
* Types of ignored workbook and worksheet error. * Types of ignored workbook and worksheet error.
* *
* TODO Give more details on what these mean * TODO Implement these for HSSF too, using FeatFormulaErr2,
* see bugzilla bug #46136 for details
*/ */
public enum IgnoredErrorType { public enum IgnoredErrorType {
/**
* ????. Probably XSSF-only.
*/
CALCULATED_COLUMN, CALCULATED_COLUMN,
/**
* Whether to check for references to empty cells.
* HSSF + XSSF.
*/
EMPTY_CELL_REFERENCE, EMPTY_CELL_REFERENCE,
/**
* Whether to check for calculation/evaluation errors.
* HSSF + XSSF.
*/
EVALUATION_ERROR, EVALUATION_ERROR,
/**
* Whether to check formulas in the range of the shared feature
* that are inconsistent with formulas in neighbouring cells.
* HSSF + XSSF.
*/
FORMULA, FORMULA,
/**
* Whether to check formulas in the range of the shared feature
* with references to less than the entirety of a range containing
* continuous data.
* HSSF + XSSF.
*/
FORMULA_RANGE, FORMULA_RANGE,
/**
* ????. Is this XSSF-specific the same as performDataValidation
* in HSSF?
*/
LIST_DATA_VALIDATION, LIST_DATA_VALIDATION,
/**
* Whether to check the format of string values and warn
* if they look to actually be numeric values.
* HSSF + XSSF.
*/
NUMBER_STORED_AS_TEXT, NUMBER_STORED_AS_TEXT,
/**
* ????. Is this XSSF-specific the same as checkDateTimeFormats
* in HSSF?
*/
TWO_DIGIT_TEXT_YEAR, TWO_DIGIT_TEXT_YEAR,
/**
* Whether to check for unprotected formulas.
* HSSF + XSSF.
*/
UNLOCKED_FORMULA; UNLOCKED_FORMULA;
} }

View File

@ -4133,7 +4133,7 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
Map<IgnoredErrorType, Set<CellRangeAddress>> result = new LinkedHashMap<IgnoredErrorType, Set<CellRangeAddress>>(); Map<IgnoredErrorType, Set<CellRangeAddress>> result = new LinkedHashMap<IgnoredErrorType, Set<CellRangeAddress>>();
if (worksheet.isSetIgnoredErrors()) { if (worksheet.isSetIgnoredErrors()) {
for (CTIgnoredError err : worksheet.getIgnoredErrors().getIgnoredErrorList()) { for (CTIgnoredError err : worksheet.getIgnoredErrors().getIgnoredErrorList()) {
for (IgnoredErrorType errType : getErrorTypes(err)) { for (IgnoredErrorType errType : XSSFIgnoredErrorHelper.getErrorTypes(err)) {
if (!result.containsKey(errType)) { if (!result.containsKey(errType)) {
result.put(errType, new LinkedHashSet<CellRangeAddress>()); result.put(errType, new LinkedHashSet<CellRangeAddress>());
} }
@ -4149,20 +4149,6 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
private void addIgnoredErrors(String ref, IgnoredErrorType... ignoredErrorTypes) { private void addIgnoredErrors(String ref, IgnoredErrorType... ignoredErrorTypes) {
CTIgnoredErrors ctIgnoredErrors = worksheet.isSetIgnoredErrors() ? worksheet.getIgnoredErrors() : worksheet.addNewIgnoredErrors(); CTIgnoredErrors ctIgnoredErrors = worksheet.isSetIgnoredErrors() ? worksheet.getIgnoredErrors() : worksheet.addNewIgnoredErrors();
CTIgnoredError ctIgnoredError = ctIgnoredErrors.addNewIgnoredError(); CTIgnoredError ctIgnoredError = ctIgnoredErrors.addNewIgnoredError();
ctIgnoredError.setSqref(Arrays.asList(ref)); XSSFIgnoredErrorHelper.addIgnoredErrors(ctIgnoredError, ref, ignoredErrorTypes);
for (IgnoredErrorType errType : ignoredErrorTypes) {
XSSFIgnoredErrorHelper.set(errType, ctIgnoredError);
} }
} }
private Set<IgnoredErrorType> getErrorTypes(CTIgnoredError err) {
Set<IgnoredErrorType> result = new LinkedHashSet<IgnoredErrorType>();
for (IgnoredErrorType errType : IgnoredErrorType.values()) {
if (XSSFIgnoredErrorHelper.isSet(errType, err)) {
result.add(errType);
}
}
return result;
}
}

View File

@ -17,8 +17,12 @@
package org.apache.poi.xssf.usermodel.helpers; package org.apache.poi.xssf.usermodel.helpers;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTIgnoredError; import java.util.Arrays;
import java.util.LinkedHashSet;
import java.util.Set;
import org.apache.poi.ss.usermodel.IgnoredErrorType; import org.apache.poi.ss.usermodel.IgnoredErrorType;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTIgnoredError;
/** /**
* XSSF-specific code for working with ignored errors * XSSF-specific code for working with ignored errors
@ -82,4 +86,21 @@ public class XSSFIgnoredErrorHelper {
throw new IllegalStateException(); throw new IllegalStateException();
} }
} }
public static void addIgnoredErrors(CTIgnoredError err, String ref, IgnoredErrorType... ignoredErrorTypes) {
err.setSqref(Arrays.asList(ref));
for (IgnoredErrorType errType : ignoredErrorTypes) {
XSSFIgnoredErrorHelper.set(errType, err);
}
}
public static Set<IgnoredErrorType> getErrorTypes(CTIgnoredError err) {
Set<IgnoredErrorType> result = new LinkedHashSet<IgnoredErrorType>();
for (IgnoredErrorType errType : IgnoredErrorType.values()) {
if (XSSFIgnoredErrorHelper.isSet(errType, err)) {
result.add(errType);
}
}
return result;
}
} }

View File

@ -49,6 +49,7 @@ import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellCopyPolicy; import org.apache.poi.ss.usermodel.CellCopyPolicy;
import org.apache.poi.ss.usermodel.ClientAnchor; import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.FormulaError; import org.apache.poi.ss.usermodel.FormulaError;
import org.apache.poi.ss.usermodel.IgnoredErrorType;
import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook; import org.apache.poi.ss.usermodel.Workbook;