mirror of https://github.com/apache/poi.git
Generalised API for adding ignored errors, e.g. number stored as text.
https://bz.apache.org/bugzilla/show_bug.cgi?id=56892 git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1724469 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
f1db033d6d
commit
11bee1ebf9
|
@ -0,0 +1,106 @@
|
||||||
|
/* ====================================================================
|
||||||
|
Licensed to the Apache Software Foundation (ASF) under one or more
|
||||||
|
contributor license agreements. See the NOTICE file distributed with
|
||||||
|
this work for additional information regarding copyright ownership.
|
||||||
|
The ASF licenses this file to You under the Apache License, Version 2.0
|
||||||
|
(the "License"); you may not use this file except in compliance with
|
||||||
|
the License. You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
==================================================================== */
|
||||||
|
|
||||||
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTIgnoredError;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Types of ignored error.
|
||||||
|
*/
|
||||||
|
public enum IgnoredErrorType {
|
||||||
|
|
||||||
|
CALCULATED_COLUMN,
|
||||||
|
|
||||||
|
EMPTY_CELL_REFERENCE,
|
||||||
|
|
||||||
|
EVALUATION_ERROR,
|
||||||
|
|
||||||
|
FORMULA,
|
||||||
|
|
||||||
|
FORMULA_RANGE,
|
||||||
|
|
||||||
|
LIST_DATA_VALIDATION,
|
||||||
|
|
||||||
|
NUMBER_STORED_AS_TEXT,
|
||||||
|
|
||||||
|
TWO_DIGIT_TEXT_YEAR,
|
||||||
|
|
||||||
|
UNLOCKED_FORMULA;
|
||||||
|
|
||||||
|
// Methods below are not part of the public API
|
||||||
|
|
||||||
|
boolean isSet(CTIgnoredError error) {
|
||||||
|
switch(this) {
|
||||||
|
case CALCULATED_COLUMN:
|
||||||
|
return error.isSetCalculatedColumn();
|
||||||
|
case EMPTY_CELL_REFERENCE:
|
||||||
|
return error.isSetEmptyCellReference();
|
||||||
|
case EVALUATION_ERROR:
|
||||||
|
return error.isSetEvalError();
|
||||||
|
case FORMULA:
|
||||||
|
return error.isSetFormula();
|
||||||
|
case FORMULA_RANGE:
|
||||||
|
return error.isSetFormulaRange();
|
||||||
|
case LIST_DATA_VALIDATION:
|
||||||
|
return error.isSetListDataValidation();
|
||||||
|
case NUMBER_STORED_AS_TEXT:
|
||||||
|
return error.isSetNumberStoredAsText();
|
||||||
|
case TWO_DIGIT_TEXT_YEAR:
|
||||||
|
return error.isSetTwoDigitTextYear();
|
||||||
|
case UNLOCKED_FORMULA:
|
||||||
|
return error.isSetUnlockedFormula();
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void set(CTIgnoredError error) {
|
||||||
|
switch(this) {
|
||||||
|
case CALCULATED_COLUMN:
|
||||||
|
error.setCalculatedColumn(true);
|
||||||
|
break;
|
||||||
|
case EMPTY_CELL_REFERENCE:
|
||||||
|
error.setEmptyCellReference(true);
|
||||||
|
break;
|
||||||
|
case EVALUATION_ERROR:
|
||||||
|
error.setEvalError(true);
|
||||||
|
break;
|
||||||
|
case FORMULA:
|
||||||
|
error.setFormula(true);
|
||||||
|
break;
|
||||||
|
case FORMULA_RANGE:
|
||||||
|
error.setFormulaRange(true);
|
||||||
|
break;
|
||||||
|
case LIST_DATA_VALIDATION:
|
||||||
|
error.setListDataValidation(true);
|
||||||
|
break;
|
||||||
|
case NUMBER_STORED_AS_TEXT:
|
||||||
|
error.setNumberStoredAsText(true);
|
||||||
|
break;
|
||||||
|
case TWO_DIGIT_TEXT_YEAR:
|
||||||
|
error.setTwoDigitTextYear(true);
|
||||||
|
break;
|
||||||
|
case UNLOCKED_FORMULA:
|
||||||
|
error.setUnlockedFormula(true);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new IllegalStateException();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
|
@ -31,8 +31,11 @@ import java.util.Collections;
|
||||||
import java.util.Comparator;
|
import java.util.Comparator;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
import java.util.LinkedHashMap;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
import java.util.SortedMap;
|
import java.util.SortedMap;
|
||||||
import java.util.TreeMap;
|
import java.util.TreeMap;
|
||||||
|
|
||||||
|
@ -78,47 +81,7 @@ import org.apache.poi.xssf.usermodel.helpers.ColumnHelper;
|
||||||
import org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter;
|
import org.apache.poi.xssf.usermodel.helpers.XSSFRowShifter;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTAutoFilter;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBreak;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCalcPr;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCellFormula;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTColor;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComment;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCommentList;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidation;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDataValidations;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTDrawing;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHeaderFooter;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTHyperlink;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTLegacyDrawing;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCell;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTMergeCells;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTOutlinePr;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageBreak;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageMargins;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPageSetUpPr;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPane;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTPrintOptions;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSelection;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetCalcPr;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetFormatPr;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetPr;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetView;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetViews;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTablePart;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTTableParts;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCalcMode;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STCellFormulaType;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPane;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.STPaneState;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* High level representation of a SpreadsheetML worksheet.
|
* High level representation of a SpreadsheetML worksheet.
|
||||||
|
@ -4051,4 +4014,69 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
|
||||||
}
|
}
|
||||||
return col.getOutlineLevel();
|
return col.getOutlineLevel();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Add ignored errors (usually to suppress them in the UI of a consuming
|
||||||
|
* application).
|
||||||
|
*
|
||||||
|
* @param cell Cell.
|
||||||
|
* @param ignoredErrorTypes Types of error to ignore there.
|
||||||
|
*/
|
||||||
|
public void addIgnoredErrors(CellReference cell, IgnoredErrorType... ignoredErrorTypes) {
|
||||||
|
addIgnoredErrors(cell.formatAsString(), ignoredErrorTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Ignore errors across a range of cells.
|
||||||
|
*
|
||||||
|
* @param region Range of cells.
|
||||||
|
* @param ignoredErrorTypes Types of error to ignore there.
|
||||||
|
*/
|
||||||
|
public void addIgnoredErrors(CellRangeAddress region, IgnoredErrorType... ignoredErrorTypes) {
|
||||||
|
region.validate(SpreadsheetVersion.EXCEL2007);
|
||||||
|
addIgnoredErrors(region.formatAsString(), ignoredErrorTypes);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the errors currently being ignored and the ranges
|
||||||
|
* where they are ignored.
|
||||||
|
*
|
||||||
|
* @return Map of error type to the range(s) where they are ignored.
|
||||||
|
*/
|
||||||
|
public Map<IgnoredErrorType, Set<CellRangeAddress>> getIgnoredErrors() {
|
||||||
|
Map<IgnoredErrorType, Set<CellRangeAddress>> result = new LinkedHashMap<IgnoredErrorType, Set<CellRangeAddress>>();
|
||||||
|
if (worksheet.isSetIgnoredErrors()) {
|
||||||
|
for (CTIgnoredError err : worksheet.getIgnoredErrors().getIgnoredErrorList()) {
|
||||||
|
for (IgnoredErrorType errType : getErrorTypes(err)) {
|
||||||
|
if (!result.containsKey(errType)) {
|
||||||
|
result.put(errType, new LinkedHashSet<CellRangeAddress>());
|
||||||
|
}
|
||||||
|
for (Object ref : err.getSqref()) {
|
||||||
|
result.get(errType).add(CellRangeAddress.valueOf(ref.toString()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
private void addIgnoredErrors(String ref, IgnoredErrorType... ignoredErrorTypes) {
|
||||||
|
CTIgnoredErrors ctIgnoredErrors = worksheet.isSetIgnoredErrors() ? worksheet.getIgnoredErrors() : worksheet.addNewIgnoredErrors();
|
||||||
|
CTIgnoredError ctIgnoredError = ctIgnoredErrors.addNewIgnoredError();
|
||||||
|
ctIgnoredError.setSqref(Arrays.asList(ref));
|
||||||
|
for (IgnoredErrorType errType : ignoredErrorTypes) {
|
||||||
|
errType.set(ctIgnoredError);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private Set<IgnoredErrorType> getErrorTypes(CTIgnoredError err) {
|
||||||
|
Set<IgnoredErrorType> result = new LinkedHashSet<IgnoredErrorType>();
|
||||||
|
for (IgnoredErrorType errType : IgnoredErrorType.values()) {
|
||||||
|
if (errType.isSet(err)) {
|
||||||
|
result.add(errType);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -33,6 +33,7 @@ import java.util.Calendar;
|
||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
import org.apache.poi.POIXMLException;
|
import org.apache.poi.POIXMLException;
|
||||||
|
@ -68,6 +69,7 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCell;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCol;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTCols;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComments;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTComments;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTIgnoredError;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTRow;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetData;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetData;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheetProtection;
|
||||||
|
@ -1828,4 +1830,75 @@ public final class TestXSSFSheet extends BaseTestSheet {
|
||||||
public void testCopyMultipleRows() throws IOException {
|
public void testCopyMultipleRows() throws IOException {
|
||||||
testCopyMultipleRows("XSSFSheet.copyRows.xlsx");
|
testCopyMultipleRows("XSSFSheet.copyRows.xlsx");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIgnoredErrors() throws IOException {
|
||||||
|
XSSFWorkbook workbook = new XSSFWorkbook();
|
||||||
|
XSSFSheet sheet = workbook.createSheet();
|
||||||
|
CellRangeAddress region = CellRangeAddress.valueOf("B2:D4");
|
||||||
|
sheet.addIgnoredErrors(region, IgnoredErrorType.NUMBER_STORED_AS_TEXT);
|
||||||
|
final CTIgnoredError ignoredError = sheet.getCTWorksheet().getIgnoredErrors().getIgnoredErrorArray(0);
|
||||||
|
assertEquals(1, ignoredError.getSqref().size());
|
||||||
|
assertEquals("B2:D4", ignoredError.getSqref().get(0));
|
||||||
|
assertTrue(ignoredError.getNumberStoredAsText());
|
||||||
|
|
||||||
|
Map<IgnoredErrorType, Set<CellRangeAddress>> ignoredErrors = sheet.getIgnoredErrors();
|
||||||
|
assertEquals(1, ignoredErrors.size());
|
||||||
|
assertEquals(1, ignoredErrors.get(IgnoredErrorType.NUMBER_STORED_AS_TEXT).size());
|
||||||
|
assertEquals("B2:D4", ignoredErrors.get(IgnoredErrorType.NUMBER_STORED_AS_TEXT).iterator().next().formatAsString());
|
||||||
|
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIgnoredErrorsMultipleTypes() throws IOException {
|
||||||
|
XSSFWorkbook workbook = new XSSFWorkbook();
|
||||||
|
XSSFSheet sheet = workbook.createSheet();
|
||||||
|
CellRangeAddress region = CellRangeAddress.valueOf("B2:D4");
|
||||||
|
sheet.addIgnoredErrors(region, IgnoredErrorType.FORMULA, IgnoredErrorType.EVALUATION_ERROR);
|
||||||
|
final CTIgnoredError ignoredError = sheet.getCTWorksheet().getIgnoredErrors().getIgnoredErrorArray(0);
|
||||||
|
assertEquals(1, ignoredError.getSqref().size());
|
||||||
|
assertEquals("B2:D4", ignoredError.getSqref().get(0));
|
||||||
|
assertFalse(ignoredError.getNumberStoredAsText());
|
||||||
|
assertTrue(ignoredError.getFormula());
|
||||||
|
assertTrue(ignoredError.getEvalError());
|
||||||
|
|
||||||
|
Map<IgnoredErrorType, Set<CellRangeAddress>> ignoredErrors = sheet.getIgnoredErrors();
|
||||||
|
assertEquals(2, ignoredErrors.size());
|
||||||
|
assertEquals(1, ignoredErrors.get(IgnoredErrorType.FORMULA).size());
|
||||||
|
assertEquals("B2:D4", ignoredErrors.get(IgnoredErrorType.FORMULA).iterator().next().formatAsString());
|
||||||
|
assertEquals(1, ignoredErrors.get(IgnoredErrorType.EVALUATION_ERROR).size());
|
||||||
|
assertEquals("B2:D4", ignoredErrors.get(IgnoredErrorType.EVALUATION_ERROR).iterator().next().formatAsString());
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testIgnoredErrorsMultipleCalls() throws IOException {
|
||||||
|
XSSFWorkbook workbook = new XSSFWorkbook();
|
||||||
|
XSSFSheet sheet = workbook.createSheet();
|
||||||
|
CellRangeAddress region = CellRangeAddress.valueOf("B2:D4");
|
||||||
|
// Two calls means two elements, no clever collapsing just yet.
|
||||||
|
sheet.addIgnoredErrors(region, IgnoredErrorType.EVALUATION_ERROR);
|
||||||
|
sheet.addIgnoredErrors(region, IgnoredErrorType.FORMULA);
|
||||||
|
|
||||||
|
CTIgnoredError ignoredError = sheet.getCTWorksheet().getIgnoredErrors().getIgnoredErrorArray(0);
|
||||||
|
assertEquals(1, ignoredError.getSqref().size());
|
||||||
|
assertEquals("B2:D4", ignoredError.getSqref().get(0));
|
||||||
|
assertFalse(ignoredError.getFormula());
|
||||||
|
assertTrue(ignoredError.getEvalError());
|
||||||
|
|
||||||
|
ignoredError = sheet.getCTWorksheet().getIgnoredErrors().getIgnoredErrorArray(1);
|
||||||
|
assertEquals(1, ignoredError.getSqref().size());
|
||||||
|
assertEquals("B2:D4", ignoredError.getSqref().get(0));
|
||||||
|
assertTrue(ignoredError.getFormula());
|
||||||
|
assertFalse(ignoredError.getEvalError());
|
||||||
|
|
||||||
|
Map<IgnoredErrorType, Set<CellRangeAddress>> ignoredErrors = sheet.getIgnoredErrors();
|
||||||
|
assertEquals(2, ignoredErrors.size());
|
||||||
|
assertEquals(1, ignoredErrors.get(IgnoredErrorType.FORMULA).size());
|
||||||
|
assertEquals("B2:D4", ignoredErrors.get(IgnoredErrorType.FORMULA).iterator().next().formatAsString());
|
||||||
|
assertEquals(1, ignoredErrors.get(IgnoredErrorType.EVALUATION_ERROR).size());
|
||||||
|
assertEquals("B2:D4", ignoredErrors.get(IgnoredErrorType.EVALUATION_ERROR).iterator().next().formatAsString());
|
||||||
|
workbook.close();
|
||||||
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue