From 6acad091984fe947d5f10b9f0473874a48b2618f Mon Sep 17 00:00:00 2001 From: Yegor Kozlov Date: Fri, 25 Jan 2008 15:48:14 +0000 Subject: [PATCH] merge BETA3 with trunk r615229. OOXML is excluded git-svn-id: https://svn.apache.org/repos/asf/poi/tags/REL_3_0_2_BETA3@615249 13f79535-47bb-0310-9956-ffa450edef68 --- build.xml | 16 +- src/documentation/content/xdocs/changes.xml | 22 +- src/documentation/content/xdocs/hssf/eval.xml | 103 +++++- .../content/xdocs/hssf/quick-guide.xml | 31 +- src/documentation/content/xdocs/index.xml | 8 +- src/documentation/content/xdocs/status.xml | 21 ++ .../apache/poi/ddf/EscherContainerRecord.java | 68 +++- .../org/apache/poi/ddf/EscherOptRecord.java | 11 +- .../poi/hssf/model/DrawingManager2.java | 13 +- .../apache/poi/hssf/model/FormulaParser.java | 27 +- src/java/org/apache/poi/hssf/model/Sheet.java | 66 +++- .../org/apache/poi/hssf/model/Workbook.java | 83 ++++- .../record/AbstractEscherHolderRecord.java | 64 +++- .../poi/hssf/record/BoundSheetRecord.java | 10 + .../apache/poi/hssf/record/DVALRecord.java | 124 +++++-- .../org/apache/poi/hssf/record/DVRecord.java | 29 +- .../poi/hssf/record/DrawingGroupRecord.java | 10 + .../apache/poi/hssf/record/DrawingRecord.java | 16 +- .../poi/hssf/record/EscherAggregate.java | 144 +++++++- .../apache/poi/hssf/record/FormulaRecord.java | 22 +- .../apache/poi/hssf/record/NameRecord.java | 127 +++++-- .../apache/poi/hssf/record/NoteRecord.java | 11 + .../hssf/record/NoteStructureSubRecord.java | 9 + .../org/apache/poi/hssf/record/Record.java | 28 ++ .../apache/poi/hssf/record/RecordFactory.java | 2 +- .../poi/hssf/record/RecordInputStream.java | 23 +- .../poi/hssf/record/SharedFormulaRecord.java | 71 ++-- .../poi/hssf/record/TextObjectRecord.java | 17 + .../poi/hssf/record/UncalcedRecord.java | 82 +++++ .../aggregates/FormulaRecordAggregate.java | 4 +- .../aggregates/ValueRecordsAggregate.java | 21 +- .../poi/hssf/record/formula/Area3DPtg.java | 24 +- .../poi/hssf/record/formula/ErrPtg.java | 2 +- .../poi/hssf/record/formula/ExpPtg.java | 2 +- .../apache/poi/hssf/usermodel/HSSFCell.java | 48 ++- .../poi/hssf/usermodel/HSSFPatriarch.java | 58 ++- .../apache/poi/hssf/usermodel/HSSFRow.java | 56 ++- .../poi/hssf/usermodel/HSSFShapeGroup.java | 5 +- .../apache/poi/hssf/usermodel/HSSFSheet.java | 198 ++++++++-- .../poi/hssf/usermodel/HSSFWorkbook.java | 29 ++ .../apache/poi/hssf/util/AreaReference.java | 70 +++- .../apache/poi/hssf/util/CellReference.java | 4 + .../poi/poifs/common/POIFSConstants.java | 3 + .../poi/poifs/filesystem/POIFSFileSystem.java | 49 ++- .../poi/poifs/storage/HeaderBlockReader.java | 7 +- .../poi/poifs/storage/RawDataBlock.java | 46 ++- src/java/org/apache/poi/util/IOUtils.java | 16 +- .../hslf/extractor/PowerPointExtractor.java | 49 ++- .../org/apache/poi/hslf/model/TextRun.java | 70 +++- .../poi/hslf/record/StyleTextPropAtom.java | 52 ++- .../poi/hslf/usermodel/RichTextRun.java | 25 +- .../hssf/usermodel/HSSFFormulaEvaluator.java | 60 ++- .../apache/poi/hwpf/usermodel/TableRow.java | 2 +- .../org/apache/poi/hslf/data/SampleShow.ppt | Bin 0 -> 124416 bytes .../org/apache/poi/hslf/data/SampleShow.pptx | Bin 0 -> 48008 bytes .../org/apache/poi/hslf/data/SampleShow.txt | 26 ++ .../poi/hslf/extractor/TextExtractor.java | 23 ++ .../poi/hslf/usermodel/TestRichTextRun.java | 87 ++++- .../apache/poi/hssf/data/42464-ExpPtg-bad.xls | Bin 0 -> 141824 bytes .../apache/poi/hssf/data/42464-ExpPtg-ok.xls | Bin 0 -> 143872 bytes .../poi/hssf/model/TestFormulaParserSP.java | 83 +++++ .../poi/hssf/usermodel/TestBug42464.java | 93 +++++ .../usermodel/TestFormulaEvaluatorDocs.java | 117 ++++++ .../org/apache/poi/hwpf/data/Bug44292.doc | Bin 0 -> 24064 bytes .../org/apache/poi/hwpf/data/SampleDoc.doc | Bin 0 -> 27136 bytes .../org/apache/poi/hwpf/data/SampleDoc.docx | Bin 0 -> 11611 bytes .../org/apache/poi/hwpf/data/SampleDoc.txt | 14 + .../poi/hwpf/usermodel/TestProblems.java | 30 ++ .../poi/ddf/TestEscherContainerRecord.java | 48 ++- .../org/apache/poi/hssf/HSSFTests.java | 4 +- .../org/apache/poi/hssf/data/37684-1.xls | Bin 0 -> 32768 bytes .../org/apache/poi/hssf/data/37684-2.xls | Bin 0 -> 82944 bytes .../apache/poi/hssf/data/42464-ExpPtg-bad.xls | Bin 0 -> 141824 bytes .../apache/poi/hssf/data/42464-ExpPtg-ok.xls | Bin 0 -> 143872 bytes .../org/apache/poi/hssf/data/43493.xls | Bin 0 -> 66048 bytes .../org/apache/poi/hssf/data/43902.xls | Bin 0 -> 83456 bytes .../poi/hssf/data/44010-SingleChart.xls | Bin 0 -> 28672 bytes .../apache/poi/hssf/data/44010-TwoCharts.xls | Bin 0 -> 29696 bytes .../org/apache/poi/hssf/data/44167.xls | Bin 0 -> 14336 bytes .../org/apache/poi/hssf/data/44200.xls | Bin 0 -> 13824 bytes .../org/apache/poi/hssf/data/44201.xls | Bin 0 -> 13824 bytes .../org/apache/poi/hssf/data/Booleans.xlsx | Bin 0 -> 8612 bytes .../org/apache/poi/hssf/data/ForShifting.xls | Bin 0 -> 18432 bytes .../apache/poi/hssf/data/NoGutsRecords.xls | Bin 0 -> 35328 bytes .../org/apache/poi/hssf/data/SampleSS.txt | 21 ++ .../org/apache/poi/hssf/data/SampleSS.xls | Bin 0 -> 17408 bytes .../org/apache/poi/hssf/data/SampleSS.xlsx | Bin 0 -> 9112 bytes .../poi/hssf/data/SharedFormulaTest.xls | Bin 0 -> 31232 bytes .../apache/poi/hssf/data/SheetWithDrawing.xls | Bin 0 -> 17408 bytes .../apache/poi/hssf/data/UncalcedRecord.xls | Bin 0 -> 18432 bytes .../org/apache/poi/hssf/data/WithChart.xls | Bin 0 -> 20992 bytes .../org/apache/poi/hssf/data/WithChart.xlsx | Bin 0 -> 10138 bytes .../apache/poi/hssf/data/WithTwoCharts.xls | Bin 0 -> 25600 bytes .../apache/poi/hssf/data/WithTwoCharts.xlsx | Bin 0 -> 12810 bytes .../org/apache/poi/hssf/data/comments.xls | Bin 0 -> 14336 bytes .../poi/hssf/model/TestFormulaParser.java | 6 +- .../poi/hssf/record/TestNoteRecord.java | 23 ++ .../record/TestNoteStructureSubRecord.java | 12 + .../poi/hssf/record/TestTextObjectRecord.java | 40 ++ .../apache/poi/hssf/usermodel/TestBugs.java | 99 ++++- .../hssf/usermodel/TestEscherGraphics.java | 216 ++++++++++- .../poi/hssf/usermodel/TestFormulas.java | 11 + .../poi/hssf/usermodel/TestHSSFRow.java | 50 ++- .../poi/hssf/usermodel/TestHSSFSheet.java | 342 +++++++++++++++++- .../poi/hssf/usermodel/TestHSSFWorkbook.java | 114 +++++- .../poi/hssf/usermodel/TestNamedRange.java | 20 +- .../poi/hssf/usermodel/TestSheetHiding.java | 67 ++-- .../hssf/usermodel/TestSheetShiftRows.java | 110 ++++++ .../poi/hssf/usermodel/TestUnfixedBugs.java | 75 +--- .../poi/hssf/util/TestAreaReference.java | 226 +++++++++++- .../TestOffice2007XMLException.java | 22 ++ .../poi/poifs/storage/TestRawDataBlock.java | 113 ++++++ 112 files changed, 3797 insertions(+), 453 deletions(-) create mode 100644 src/java/org/apache/poi/hssf/record/UncalcedRecord.java create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.ppt create mode 100755 src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.pptx create mode 100644 src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.txt create mode 100644 src/scratchpad/testcases/org/apache/poi/hssf/data/42464-ExpPtg-bad.xls create mode 100644 src/scratchpad/testcases/org/apache/poi/hssf/data/42464-ExpPtg-ok.xls create mode 100644 src/scratchpad/testcases/org/apache/poi/hssf/model/TestFormulaParserSP.java create mode 100644 src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java create mode 100644 src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorDocs.java create mode 100644 src/scratchpad/testcases/org/apache/poi/hwpf/data/Bug44292.doc create mode 100755 src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.doc create mode 100755 src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.docx create mode 100644 src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.txt create mode 100755 src/testcases/org/apache/poi/hssf/data/37684-1.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/37684-2.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/42464-ExpPtg-bad.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/42464-ExpPtg-ok.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/43493.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/43902.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/44010-SingleChart.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/44010-TwoCharts.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/44167.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/44200.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/44201.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/Booleans.xlsx create mode 100755 src/testcases/org/apache/poi/hssf/data/ForShifting.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/NoGutsRecords.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/SampleSS.txt create mode 100755 src/testcases/org/apache/poi/hssf/data/SampleSS.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/SampleSS.xlsx create mode 100644 src/testcases/org/apache/poi/hssf/data/SharedFormulaTest.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/SheetWithDrawing.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/UncalcedRecord.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/WithChart.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/WithChart.xlsx create mode 100755 src/testcases/org/apache/poi/hssf/data/WithTwoCharts.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/WithTwoCharts.xlsx create mode 100644 src/testcases/org/apache/poi/hssf/data/comments.xls diff --git a/build.xml b/build.xml index 8661595b8d..9be4a793fe 100644 --- a/build.xml +++ b/build.xml @@ -137,7 +137,7 @@ under the License. - + @@ -159,7 +159,7 @@ under the License. - + @@ -368,6 +368,8 @@ under the License. destfile="${ooxml.xsds.jar}" javasource="1.4" failonerror="false" + fork="true" + memoryMaximumSize="512m" > @@ -461,6 +463,16 @@ under the License. destdir="${ooxml.output.dir}" debug="on" srcdir="${ooxml.src}"> + + + + + + + + + 44292 - Correctly process the last paragraph in a word file + 44254 - Avoid some unread byte warnings, and properly understand DVALRecord + Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself. + 41726 - Fix how we handle signed cell offsets in relative areas and references + 44233 - Support for getting and setting a flag on the sheet, which tells excel to re-calculate all formulas on it at next reload + 44201 - Enable cloning of sheets with data validation rules + 44200 - Enable cloning of sheets with notes + 43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly + 43058 - Support setting row grouping on files from CR IX, which lack GutsRecords + 31795 - Support cloning of sheets with certain drawing objects on them + 43902 - Don't consider merged regions when auto-sizing columns + 42464 - Avoid "Expected ExpPtg to be converted from Shared to Non-Shared Formula" on large, formula heavy worksheets + 42033 - Add support for named ranges with unicode names + 34023 - When shifting rows, update formulas on that sheet to point to the new location of those rows + Support getting all the cells referenced by an AreaReference, not just the corner ones + 43510 - Add support for named ranges in formulas, including non-contiguous named ranges + 43937 - Add support for hiding and un-hiding sheets, and checking their current hidden status + 44167 - Fix for non-contiguous named ranges + 44070 - Fix for shifting comments when shifting rows + + Support for tables in HSLF 43781 - Fix for extracting text from TextBoxes HSLF in Improve JavaDocs relating to hssf font and fill colourings @@ -45,7 +66,6 @@ 41064 - [PATCH] Support for String continue records 27511 - [PATCH] Support for data validation, via DVRecord and DVALRecord - 43877 and 39512 - Fix for handling mixed OBJ and CONTINUE records. 43807 - Throw an IllegalArgumentException if asked to create a merged region with invalid columns or rows, rather than writing out a corrupt file diff --git a/src/documentation/content/xdocs/hssf/eval.xml b/src/documentation/content/xdocs/hssf/eval.xml index d697eb082b..8d63512173 100644 --- a/src/documentation/content/xdocs/hssf/eval.xml +++ b/src/documentation/content/xdocs/hssf/eval.xml @@ -32,14 +32,18 @@ formulas in Excels sheets read-in, or created in POI. This document explains how to use the API to evaluate your formulas.

- This code currently lives the scratchpad area of the POI CVS repository. + This code currently lives the scratchpad area of the POI SVN repository. Ensure that you have the scratchpad jar or the scratchpad build area in your - classpath before experimenting with this code. + classpath before experimenting with this code. You are advised + to make use of a recent SVN checkout, as new functions are + being supported fairly frequently. + +
Status

The code currently provides implementations for all the arithmatic operators. - It also provides implementations for approx. 20 built in + It also provides implementations for approx. 100 built in functions in Excel. The framework however makes is easy to add implementation of new functions. See the Formula evaluation development guide for details.

@@ -51,8 +55,12 @@

The following code demonstrates how to use the HSSFFormulaEvaluator in the context of other POI excel reading code.

-

There are two ways in which you can use the HSSFFormulaEvalutator API.

+

There are several ways in which you can use the HSSFFormulaEvalutator API.

+ +
Using HSSFFormulaEvaluator.<strong>evaluate</strong>(HSSFCell cell) +

This evaluates a given cell, and returns the new value, + without affecting the cell

FileInputStream fis = new FileInputStream("c:/temp/test.xls"); HSSFWorkbook wb = new HSSFWorkbook(fis); @@ -94,10 +102,62 @@ switch (cellValue.getCellType()) { a simple value object and does not maintain reference to the original cell.

-
-
Using HSSFFormulaEvaluator.<strong>evaluateInCell</strong>(HSSFCell cell) - + + +
Using HSSFFormulaEvaluator.<strong>evaluateFormulaCell</strong>(HSSFCell cell) +

evaluateFormulaCell(HSSFCell cell) + will check to see if the supplied cell is a formula cell. + If it isn't, then no changes will be made to it. If it is, + then the formula is evaluated. The value for the formula + is saved alongside it, to be displayed in excel. The + formula remains in the cell, just with a new value

+

The return of the function is the type of the + formula result, such as HSSFCell.CELL_TYPE_BOOLEAN

+ +FileInputStream fis = new FileInputStream("/somepath/test.xls"); +HSSFWorkbook wb = new HSSFWorkbook(fis); +HSSFSheet sheet = wb.getSheetAt(0); +HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb); + +// suppose your formula is in B3 +CellReference cellReference = new CellReference("B3"); +HSSFRow row = sheet.getRow(cellReference.getRow()); +HSSFCell cell = row.getCell(cellReference.getCol()); +evaluator.setCurrentRow(row); + +if (cell!=null) { + switch (evaluator.evaluateFormulaCell(cell)) { + case HSSFCell.CELL_TYPE_BOOLEAN: + System.out.println(cell.getBooleanCellValue()); + break; + case HSSFCell.CELL_TYPE_NUMERIC: + System.out.println(cell.getNumberCellValue()); + break; + case HSSFCell.CELL_TYPE_STRING: + System.out.println(cell.getStringCellValue()); + break; + case HSSFCell.CELL_TYPE_BLANK: + break; + case HSSFCell.CELL_TYPE_ERROR: + System.out.println(cell.getErrorCellValue()); + break; + + // CELL_TYPE_FORMULA will never occur + case HSSFCell.CELL_TYPE_FORMULA: + break; + } +} + +
+ + +
Using HSSFFormulaEvaluator.<strong>evaluateInCell</strong>(HSSFCell cell) +

evaluateInCell(HSSFCell cell) will check to + see if the supplied cell is a formula cell. If it isn't, + then no changes will be made to it. If it is, then the + formula is evaluated, and the new value saved into the cell, + in place of the old formula.

FileInputStream fis = new FileInputStream("/somepath/test.xls"); HSSFWorkbook wb = new HSSFWorkbook(fis); @@ -132,11 +192,36 @@ if (cell!=null) { break; } } - + +
+ + +
Re-calculating all formulas in a Workbook + +FileInputStream fis = new FileInputStream("/somepath/test.xls"); +HSSFWorkbook wb = new HSSFWorkbook(fis); +for(int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) { + HSSFSheet sheet = wb.getSheetAt(sheetNum); + HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb); + + for(Iterator rit = sheet.rowIterator(); rit.hasNext();) { + HSSFRow r = (HSSFRow)rit.next(); + evaluator.setCurrentRow(r); -
+ for(Iterator cit = r.cellIterator(); cit.hasNext();) { + HSSFCell c = (HSSFCell)cit.next(); + if(c.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { + evaluator.evaluateFormulaCell(c); + } + } + } +} +wb.write(new FileOutputStream("/somepath/changed.xls")); + +
+
Performance Notes
  • Generally you should have to create only one HSSFFormulaEvaluator diff --git a/src/documentation/content/xdocs/hssf/quick-guide.xml b/src/documentation/content/xdocs/hssf/quick-guide.xml index ddbd447fd1..b2f729fedc 100644 --- a/src/documentation/content/xdocs/hssf/quick-guide.xml +++ b/src/documentation/content/xdocs/hssf/quick-guide.xml @@ -1151,7 +1151,7 @@ Examples: // retrieve the cell at the named range and test its contents AreaReference aref = new AreaReference(aNamedCell.getReference()); - CellReference[] crefs = aref.getCells(); + CellReference[] crefs = aref.getAllReferencedCells(); for (int i=0; i<crefs.length; i++) { HSSFSheet s = wb.getSheet(crefs[i].getSheetName()); HSSFRow r = sheet.getRow(crefs[i].getRow()); @@ -1159,7 +1159,36 @@ Examples: // extract the cell contents based on cell type etc. } +

    + Reading from non-contiguous Named Ranges +

    + + // Setup code + String cname = "TestName"; + HSSFWorkbook wb = getMyWorkbook(); // retrieve workbook + // Retrieve the named range + // Will be something like "$C$10,$D$12:$D$14"; + int namedCellIdx = wb.getNameIndex(cellName); + HSSFName aNamedCell = wb.getNameAt(namedCellIdx); + + // Retrieve the cell at the named range and test its contents + // Will get back one AreaReference for C10, and + // another for D12 to D14 + AreaReference[] arefs = AreaReference.generateContiguous(aNamedCell.getReference()); + for (int i=0; i<arefs.length; i++) { + // Only get the corners of the Area + // (use arefs[i].getAllReferencedCells() to get all cells) + CellReference[] crefs = arefs[i].getCells(); + for (int j=0; j<crefs.length; j++) { + // Check it turns into real stuff + HSSFSheet s = wb.getSheet(crefs[j].getSheetName()); + HSSFRow r = s.getRow(crefs[j].getRow()); + HSSFCell c = r.getCell(crefs[j].getCol()); + // Do something with this corner cell + } + } +
Cell Comments diff --git a/src/documentation/content/xdocs/index.xml b/src/documentation/content/xdocs/index.xml index 45b27b0b09..ba019eb984 100644 --- a/src/documentation/content/xdocs/index.xml +++ b/src/documentation/content/xdocs/index.xml @@ -31,14 +31,14 @@ -
POI 3.0.2 BETA1 Release -

The latest release of Apache POI is 3.0.2 BETA1 which was promoted to "Beta" on 04 December 2007. It contains a mixture of +

POI 3.0.2 BETA2 Release +

The latest release of Apache POI is 3.0.2 BETA2 which was promoted to "Beta" on 12 January 2008. It contains a mixture of new features and bug fixes, compared to 3.0.1. A full list of changes is available in the changelog, and - download + download the source and binaries from your - local mirror. + local mirror. The release is also available from the central Maven repository under Group ID "org.apache.poi".

diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 72761cf9c0..73375a336e 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -33,6 +33,27 @@ + 44292 - Correctly process the last paragraph in a word file + 44254 - Avoid some unread byte warnings, and properly understand DVALRecord + Add another formula evaluation method, evaluateFormulaCell(cell), which will re-calculate the value for a formula, without affecting the formula itself. + 41726 - Fix how we handle signed cell offsets in relative areas and references + 44233 - Support for getting and setting a flag on the sheet, which tells excel to re-calculate all formulas on it at next reload + 44201 - Enable cloning of sheets with data validation rules + 44200 - Enable cloning of sheets with notes + 43008 - Add a moveCell method to HSSFRow, and deprecate setCellNum(), which didn't update things properly + 43058 - Support setting row grouping on files from CR IX, which lack GutsRecords + 31795 - Support cloning of sheets with certain drawing objects on them + 43902 - Don't consider merged regions when auto-sizing columns + 42464 - Avoid "Expected ExpPtg to be converted from Shared to Non-Shared Formula" on large, formula heavy worksheets + 42033 - Add support for named ranges with unicode names + 34023 - When shifting rows, update formulas on that sheet to point to the new location of those rows + Support getting all the cells referenced by an AreaReference, not just the corner ones + 43510 - Add support for named ranges in formulas, including non-contiguous named ranges + 43937 - Add support for hiding and un-hiding sheets, and checking their current hidden status + 44167 - Fix for non-contiguous named ranges + 44070 - Fix for shifting comments when shifting rows + + Support for tables in HSLF 43781 - Fix for extracting text from TextBoxes HSLF in Improve JavaDocs relating to hssf font and fill colourings diff --git a/src/java/org/apache/poi/ddf/EscherContainerRecord.java b/src/java/org/apache/poi/ddf/EscherContainerRecord.java index 05ee6b096f..28b4a976c3 100644 --- a/src/java/org/apache/poi/ddf/EscherContainerRecord.java +++ b/src/java/org/apache/poi/ddf/EscherContainerRecord.java @@ -100,11 +100,47 @@ public class EscherContainerRecord extends EscherRecord } return 8 + childRecordsSize; } + + /** + * Do any of our (top level) children have the + * given recordId? + */ + public boolean hasChildOfType(short recordId) { + for ( Iterator iterator = getChildRecords().iterator(); iterator.hasNext(); ) + { + EscherRecord r = (EscherRecord) iterator.next(); + if(r.getRecordId() == recordId) { + return true; + } + } + return false; + } + /** + * Returns a list of all the child (escher) records + * of the container. + */ public List getChildRecords() { return childRecords; } + + /** + * Returns all of our children which are also + * EscherContainers (may be 0, 1, or vary rarely + * 2 or 3) + */ + public List getChildContainers() { + List containers = new ArrayList(); + for ( Iterator iterator = getChildRecords().iterator(); iterator.hasNext(); ) + { + EscherRecord r = (EscherRecord) iterator.next(); + if(r instanceof EscherContainerRecord) { + containers.add(r); + } + } + return containers; + } public void setChildRecords( List childRecords ) { @@ -148,6 +184,10 @@ public class EscherContainerRecord extends EscherRecord } public String toString() + { + return toString(""); + } + public String toString(String indent) { String nl = System.getProperty( "line.separator" ); @@ -155,20 +195,32 @@ public class EscherContainerRecord extends EscherRecord if ( getChildRecords().size() > 0 ) { children.append( " children: " + nl ); + + int count = 0; for ( Iterator iterator = getChildRecords().iterator(); iterator.hasNext(); ) { + String newIndent = indent + " "; + EscherRecord record = (EscherRecord) iterator.next(); - children.append( record.toString() ); -// children.append( nl ); + children.append(newIndent + "Child " + count + ":" + nl); + + if(record instanceof EscherContainerRecord) { + EscherContainerRecord ecr = (EscherContainerRecord)record; + children.append( ecr.toString(newIndent)); + } else { + children.append( record.toString() ); + } + count++; } } - return getClass().getName() + " (" + getRecordName() + "):" + nl + - " isContainer: " + isContainerRecord() + nl + - " options: 0x" + HexDump.toHex( getOptions() ) + nl + - " recordId: 0x" + HexDump.toHex( getRecordId() ) + nl + - " numchildren: " + getChildRecords().size() + nl + - children.toString(); + return + indent + getClass().getName() + " (" + getRecordName() + "):" + nl + + indent + " isContainer: " + isContainerRecord() + nl + + indent + " options: 0x" + HexDump.toHex( getOptions() ) + nl + + indent + " recordId: 0x" + HexDump.toHex( getRecordId() ) + nl + + indent + " numchildren: " + getChildRecords().size() + nl + + indent + children.toString(); } diff --git a/src/java/org/apache/poi/ddf/EscherOptRecord.java b/src/java/org/apache/poi/ddf/EscherOptRecord.java index f18e38f03c..d7de48edaf 100644 --- a/src/java/org/apache/poi/ddf/EscherOptRecord.java +++ b/src/java/org/apache/poi/ddf/EscherOptRecord.java @@ -18,11 +18,14 @@ package org.apache.poi.ddf; -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.HexDump; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Iterator; +import java.util.List; -import java.util.*; -import java.io.IOException; +import org.apache.poi.util.HexDump; +import org.apache.poi.util.LittleEndian; /** * The opt record is used to store property values for a shape. It is the key to determining diff --git a/src/java/org/apache/poi/hssf/model/DrawingManager2.java b/src/java/org/apache/poi/hssf/model/DrawingManager2.java index f14d62ff31..dee95fb4fc 100644 --- a/src/java/org/apache/poi/hssf/model/DrawingManager2.java +++ b/src/java/org/apache/poi/hssf/model/DrawingManager2.java @@ -39,6 +39,13 @@ public class DrawingManager2 { this.dgg = dgg; } + + /** + * Clears the cached list of drawing groups + */ + public void clearDrawingGroups() { + drawingGroups.clear(); + } public EscherDgRecord createDgRecord() { @@ -93,9 +100,13 @@ public class DrawingManager2 } //////////// Non-public methods ///////////// + + /** + * Finds the next available (1 based) drawing group id + */ short findNewDrawingGroupId() { - short dgId = 1; + short dgId = 1; while ( drawingGroupExists( dgId ) ) dgId++; return dgId; diff --git a/src/java/org/apache/poi/hssf/model/FormulaParser.java b/src/java/org/apache/poi/hssf/model/FormulaParser.java index 9697dadafd..832dbdef7a 100644 --- a/src/java/org/apache/poi/hssf/model/FormulaParser.java +++ b/src/java/org/apache/poi/hssf/model/FormulaParser.java @@ -24,6 +24,7 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.LinkedList; import java.util.List; +import java.util.regex.Pattern; //import PTG's .. since we need everything, import * import org.apache.poi.hssf.record.formula.*; @@ -65,6 +66,12 @@ public class FormulaParser { * Using an unsynchronized linkedlist to implement a stack since we're not multi-threaded. */ private List functionTokens = new LinkedList(); + + /** + * Used for spotting if we have a cell reference, + * or a named range + */ + private final static Pattern CELL_REFERENCE_PATTERN = Pattern.compile("(?:('?)[^:\\\\/\\?\\*\\[\\]]+\\1!)?\\$?[A-Za-z]+\\$?[\\d]+"); private static char TAB = '\t'; private static char CR = '\n'; @@ -306,15 +313,27 @@ public class FormulaParser { tokens.add(new Ref3DPtg(first,externIdx)); } } else { - //this can be either a cell ref or a named range !! - boolean cellRef = true ; //we should probably do it with reg exp?? + // This can be either a cell ref or a named range + // Try to spot which it is + boolean cellRef = CELL_REFERENCE_PATTERN.matcher(name).matches(); boolean boolLit = (name.equals("TRUE") || name.equals("FALSE")); + if (boolLit) { tokens.add(new BoolPtg(name)); } else if (cellRef) { tokens.add(new ReferencePtg(name)); - }else { - //handle after named range is integrated!! + } else { + boolean nameRecordExists = false; + for(int i = 0; i < book.getNumNames(); i++) { + // Our formula will by now contain an upper-cased + // version of any named range names + if(book.getNameRecord(i).getNameText().toUpperCase().equals(name)) { + nameRecordExists = true; + } + } + if(!nameRecordExists) + Abort("Found reference to named range \"" + name + "\", but that named range wasn't defined!"); + tokens.add(new NamePtg(name, book)); } } } diff --git a/src/java/org/apache/poi/hssf/model/Sheet.java b/src/java/org/apache/poi/hssf/model/Sheet.java index ff18f4636b..f3f7deba07 100644 --- a/src/java/org/apache/poi/hssf/model/Sheet.java +++ b/src/java/org/apache/poi/hssf/model/Sheet.java @@ -97,6 +97,8 @@ public class Sheet implements Model protected ScenarioProtectRecord scenprotect = null; protected PasswordRecord password = null; + /** Add an UncalcedRecord if not true indicating formulas have not been calculated */ + protected boolean uncalced = false; public static final byte PANE_LOWER_RIGHT = (byte)0; public static final byte PANE_UPPER_RIGHT = (byte)1; @@ -161,6 +163,9 @@ public class Sheet implements Model break; } } + else if (rec.getSid() == UncalcedRecord.sid) { + retval.uncalced = true; + } else if (rec.getSid() == DimensionsRecord.sid) { // Make a columns aggregate if one hasn't ready been created. @@ -736,8 +741,14 @@ public class Sheet implements Model { Record record = (( Record ) records.get(k)); - //Once the rows have been found in the list of records, start - //writing out the blocked row information. This includes the DBCell references + // Don't write out UncalcedRecord entries, as + // we handle those specially just below + if (record instanceof UncalcedRecord) { + continue; + } + + // Once the rows have been found in the list of records, start + // writing out the blocked row information. This includes the DBCell references if (record instanceof RowRecordsAggregate) { pos += ((RowRecordsAggregate)record).serialize(pos, data, cells); // rec.length; } else if (record instanceof ValueRecordsAggregate) { @@ -745,8 +756,14 @@ public class Sheet implements Model } else { pos += record.serialize(pos, data ); // rec.length; } - //If the BOF record was just serialized then add the IndexRecord + + // If the BOF record was just serialized then add the IndexRecord if (record.getSid() == BOFRecord.sid) { + // Add an optional UncalcedRecord + if (uncalced) { + UncalcedRecord rec = new UncalcedRecord(); + pos += rec.serialize(pos, data); + } //Can there be more than one BOF for a sheet? If not then we can //remove this guard. So be safe it is left here. if (rows != null && !haveSerializedIndex) { @@ -2184,6 +2201,11 @@ public class Sheet implements Model retval += 2; } } + // Add space for UncalcedRecord + if (uncalced) { + retval += UncalcedRecord.getStaticRecordSize(); + } + return retval; } @@ -2651,8 +2673,22 @@ public class Sheet implements Model public boolean isDisplayRowColHeadings() { return windowTwo.getDisplayRowColHeadings(); } + /** + * @return whether an uncalced record must be inserted or not at generation + */ + public boolean getUncalced() { + return uncalced; + } + /** + * @param uncalced whether an uncalced record must be inserted or not at generation + */ + public void setUncalced(boolean uncalced) { + this.uncalced = uncalced; + } + + /** * Returns the array of margins. If not created, will create. * * @return the array of marings. @@ -2663,12 +2699,26 @@ public class Sheet implements Model return margins; } - public int aggregateDrawingRecords(DrawingManager2 drawingManager) + /** + * Finds the DrawingRecord for our sheet, and + * attaches it to the DrawingManager (which knows about + * the overall DrawingGroup for our workbook). + * If requested, will create a new DrawRecord + * if none currently exist + * @param drawingManager The DrawingManager2 for our workbook + * @param createIfMissing Should one be created if missing? + */ + public int aggregateDrawingRecords(DrawingManager2 drawingManager, boolean createIfMissing) { int loc = findFirstRecordLocBySid(DrawingRecord.sid); - boolean noDrawingRecordsFound = loc == -1; + boolean noDrawingRecordsFound = (loc == -1); if (noDrawingRecordsFound) { + if(!createIfMissing) { + // None found, and not allowed to add in + return -1; + } + EscherAggregate aggregate = new EscherAggregate( drawingManager ); loc = findFirstRecordLocBySid(EscherAggregate.sid); if (loc == -1) @@ -3144,7 +3194,13 @@ public class Sheet implements Model maxLevel = Math.max(rowRecord.getOutlineLevel(), maxLevel); } + // Grab the guts record, adding if needed GutsRecord guts = (GutsRecord) findFirstRecordBySid( GutsRecord.sid ); + if(guts == null) { + guts = new GutsRecord(); + records.add(guts); + } + // Set the levels onto it guts.setRowLevelMax( (short) ( maxLevel + 1 ) ); guts.setLeftRowGutter( (short) ( 29 + (12 * (maxLevel)) ) ); } diff --git a/src/java/org/apache/poi/hssf/model/Workbook.java b/src/java/org/apache/poi/hssf/model/Workbook.java index 972aa09015..08c236cda1 100644 --- a/src/java/org/apache/poi/hssf/model/Workbook.java +++ b/src/java/org/apache/poi/hssf/model/Workbook.java @@ -542,6 +542,29 @@ public class Workbook implements Model .getSheetname(); } + /** + * gets the hidden flag for a given sheet. + * + * @param sheetnum the sheet number (0 based) + * @return True if sheet is hidden + */ + + public boolean isSheetHidden(int sheetnum) { + BoundSheetRecord bsr = ( BoundSheetRecord ) boundsheets.get(sheetnum); + return bsr.isHidden(); + } + + /** + * Hide or unhide a sheet + * + * @param sheetnum The sheet number + * @param hidden True to mark the sheet as hidden, false otherwise + */ + + public void setSheetHidden(int sheetnum, boolean hidden) { + BoundSheetRecord bsr = ( BoundSheetRecord ) boundsheets.get(sheetnum); + bsr.setHidden(hidden); + } /** * get the sheet's index * @param name sheet name @@ -2142,13 +2165,68 @@ public class Workbook implements Model } return palette; } + + /** + * Finds the primary drawing group, if one already exists + */ + public void findDrawingGroup() { + // Need to find a DrawingGroupRecord that + // contains a EscherDggRecord + for(Iterator rit = records.iterator(); rit.hasNext();) { + Record r = (Record)rit.next(); + + if(r instanceof DrawingGroupRecord) { + DrawingGroupRecord dg = (DrawingGroupRecord)r; + dg.processChildRecords(); + + EscherContainerRecord cr = + dg.getEscherContainer(); + if(cr == null) { + continue; + } + + EscherDggRecord dgg = null; + for(Iterator it = cr.getChildRecords().iterator(); it.hasNext();) { + Object er = it.next(); + if(er instanceof EscherDggRecord) { + dgg = (EscherDggRecord)er; + } + } + + if(dgg != null) { + drawingManager = new DrawingManager2(dgg); + return; + } + } + } + + // Look for the DrawingGroup record + int dgLoc = findFirstRecordLocBySid(DrawingGroupRecord.sid); + + // If there is one, does it have a EscherDggRecord? + if(dgLoc != -1) { + DrawingGroupRecord dg = + (DrawingGroupRecord)records.get(dgLoc); + EscherDggRecord dgg = null; + for(Iterator it = dg.getEscherRecords().iterator(); it.hasNext();) { + Object er = it.next(); + if(er instanceof EscherDggRecord) { + dgg = (EscherDggRecord)er; + } + } + + if(dgg != null) { + drawingManager = new DrawingManager2(dgg); + } + } + } /** - * Creates a drawing group record. If it already exists then it's modified. + * Creates a primary drawing group record. If it already + * exists then it's modified. */ public void createDrawingGroup() { - if (drawingManager == null) { EscherContainerRecord dggContainer = new EscherContainerRecord(); @@ -2212,7 +2290,6 @@ public class Workbook implements Model } } - } public WindowOneRecord getWindowOne() { diff --git a/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java b/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java index efa83ca330..c5fae27ae3 100644 --- a/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java +++ b/src/java/org/apache/poi/hssf/record/AbstractEscherHolderRecord.java @@ -18,16 +18,17 @@ package org.apache.poi.hssf.record; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + import org.apache.poi.ddf.DefaultEscherRecordFactory; +import org.apache.poi.ddf.EscherContainerRecord; import org.apache.poi.ddf.EscherRecord; import org.apache.poi.ddf.EscherRecordFactory; import org.apache.poi.ddf.NullEscherSerializationListener; import org.apache.poi.util.LittleEndian; -import java.util.ArrayList; -import java.util.Iterator; -import java.util.List; - /** * The escher container record is used to hold escher records. It is abstract and * must be subclassed for maximum benefit. @@ -76,7 +77,7 @@ public abstract class AbstractEscherHolderRecord { if (id != getSid()) { - throw new RecordFormatException("Not an escher record"); + throw new RecordFormatException("Not an escher record! (sid was " + id + ", expecting " + getSid() + ")"); } } @@ -94,6 +95,9 @@ public abstract class AbstractEscherHolderRecord } } + protected void convertRawBytesToEscherRecords() { + convertToEscherRecords(0, rawData.length, rawData); + } private void convertToEscherRecords( int offset, int size, byte[] data ) { EscherRecordFactory recordFactory = new DefaultEscherRecordFactory(); @@ -227,7 +231,7 @@ public abstract class AbstractEscherHolderRecord public Object clone() { - throw new IllegalStateException("Not implemented yet."); + return cloneViaReserialise(); } public void addEscherRecord(int index, EscherRecord element) @@ -249,6 +253,54 @@ public abstract class AbstractEscherHolderRecord { escherRecords.clear(); } + + /** + * If we have a EscherContainerRecord as one of our + * children (and most top level escher holders do), + * then return that. + */ + public EscherContainerRecord getEscherContainer() { + for(Iterator it = escherRecords.iterator(); it.hasNext();) { + Object er = it.next(); + if(er instanceof EscherContainerRecord) { + return (EscherContainerRecord)er; + } + } + return null; + } + + /** + * Descends into all our children, returning the + * first EscherRecord with the given id, or null + * if none found + */ + public EscherRecord findFirstWithId(short id) { + return findFirstWithId(id, getEscherRecords()); + } + private EscherRecord findFirstWithId(short id, List records) { + // Check at our level + for(Iterator it = records.iterator(); it.hasNext();) { + EscherRecord r = (EscherRecord)it.next(); + if(r.getRecordId() == id) { + return r; + } + } + + // Then check our children in turn + for(Iterator it = records.iterator(); it.hasNext();) { + EscherRecord r = (EscherRecord)it.next(); + if(r.isContainerRecord()) { + EscherRecord found = + findFirstWithId(id, r.getChildRecords()); + if(found != null) { + return found; + } + } + } + + // Not found in this lot + return null; + } public EscherRecord getEscherRecord(int index) diff --git a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java index bf264bf02a..78daff2ebb 100644 --- a/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java +++ b/src/java/org/apache/poi/hssf/record/BoundSheetRecord.java @@ -19,6 +19,7 @@ package org.apache.poi.hssf.record; +import org.apache.poi.util.BitFieldFactory; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.StringUtil; @@ -36,6 +37,7 @@ import org.apache.poi.util.StringUtil; public class BoundSheetRecord extends Record { + private static final short HIDDEN_FLAG_MASK = 0x01; public final static short sid = 0x85; private int field_1_position_of_BOF; private short field_2_option_flags; @@ -301,4 +303,12 @@ public class BoundSheetRecord { return sid; } + + public boolean isHidden() { + return BitFieldFactory.getInstance(HIDDEN_FLAG_MASK).isSet(field_2_option_flags); + } + + public void setHidden(boolean hidden) { + field_2_option_flags = BitFieldFactory.getInstance(HIDDEN_FLAG_MASK).setShortBoolean(field_2_option_flags, hidden); + } } diff --git a/src/java/org/apache/poi/hssf/record/DVALRecord.java b/src/java/org/apache/poi/hssf/record/DVALRecord.java index 858f525ca0..2846f5066c 100644 --- a/src/java/org/apache/poi/hssf/record/DVALRecord.java +++ b/src/java/org/apache/poi/hssf/record/DVALRecord.java @@ -29,19 +29,22 @@ import org.apache.poi.util.LittleEndian; public class DVALRecord extends Record { - public final static short sid = 0x01B2; + public final static short sid = 0x01B2; - //unknown field ; it's size should be 10 - private short field_unknown = 0x0000; + /** Options of the DVAL */ + private short field_1_options; + /** Horizontal position of the dialog */ + private int field_2_horiz_pos; + /** Vertical position of the dialog */ + private int field_3_vert_pos; - //Object ID of the drop down arrow object for list boxes ; - //in our case this will be always FFFF , until - //MSODrawingGroup and MSODrawing records are implemented - private int field_cbo_id = 0xFFFFFFFF; + /** Object ID of the drop down arrow object for list boxes ; + * in our case this will be always FFFF , until + * MSODrawingGroup and MSODrawing records are implemented */ + private int field_cbo_id = 0xFFFFFFFF; - //Number of following DV records - //Default value is 1 - private int field_3_dv_no = 0x00000000; + /** Number of following DV Records */ + private int field_5_dv_no = 0x00000000; public DVALRecord() { @@ -66,17 +69,38 @@ public class DVALRecord extends Record } } - protected void fillFields(RecordInputStream in) - { - for ( int i=0; i<5; i++) - { - this.field_unknown = in.readShort(); - } + protected void fillFields(RecordInputStream in) + { + this.field_1_options = in.readShort(); + this.field_2_horiz_pos = in.readInt(); + this.field_3_vert_pos = in.readInt(); this.field_cbo_id = in.readInt(); - this.field_3_dv_no = in.readInt(); - } + this.field_5_dv_no = in.readInt(); + } + /** + * @param field_1_options the options of the dialog + */ + public void setOptions(short field_1_options) { + this.field_1_options = field_1_options; + } + + /** + * @param field_2_horiz_pos the Horizontal position of the dialog + */ + public void setHorizontalPos(int field_2_horiz_pos) { + this.field_2_horiz_pos = field_2_horiz_pos; + } + + /** + * @param field_3_vert_pos the Vertical position of the dialog + */ + public void setVerticalPos(int field_3_vert_pos) { + this.field_3_vert_pos = field_3_vert_pos; + } + + /** * set the object ID of the drop down arrow object for list boxes * @param cboID - Object ID */ @@ -91,10 +115,33 @@ public class DVALRecord extends Record */ public void setDVRecNo(int dvNo) { - this.field_3_dv_no = dvNo; + this.field_5_dv_no = dvNo; } + + /** + * @return the field_1_options + */ + public short getOptions() { + return field_1_options; + } + + /** + * @return the Horizontal position of the dialog + */ + public int getHorizontalPos() { + return field_2_horiz_pos; + } + + /** + * @return the the Vertical position of the dialog + */ + public int getVerticalPos() { + return field_3_vert_pos; + } + + /** * get Object ID of the drop down arrow object for list boxes */ public int getObjectID( ) @@ -107,29 +154,32 @@ public class DVALRecord extends Record */ public int getDVRecNo( ) { - return this.field_3_dv_no; + return this.field_5_dv_no; } - public String toString() - { - StringBuffer buffer = new StringBuffer(); + public String toString() + { + StringBuffer buffer = new StringBuffer(); - buffer.append("[DVAL]\n"); - buffer.append(" .comboObjectID = ").append(Integer.toHexString(this.getObjectID())).append("\n"); - buffer.append(" .DVRecordsNumber = ").append(Integer.toHexString(this.getDVRecNo())).append("\n"); - buffer.append("[/DVAL]\n"); - return buffer.toString(); - } + buffer.append("[DVAL]\n"); + buffer.append(" .options = ").append(this.getOptions()).append('\n'); + buffer.append(" .horizPos = ").append(this.getHorizontalPos()).append('\n'); + buffer.append(" .vertPos = ").append(this.getVerticalPos()).append('\n'); + buffer.append(" .comboObjectID = ").append(Integer.toHexString(this.getObjectID())).append("\n"); + buffer.append(" .DVRecordsNumber = ").append(Integer.toHexString(this.getDVRecNo())).append("\n"); + buffer.append("[/DVAL]\n"); + return buffer.toString(); + } public int serialize(int offset, byte [] data) { LittleEndian.putShort(data, 0 + offset, this.sid); LittleEndian.putShort(data, 2 + offset, ( short)(this.getRecordSize()-4)); - for ( int i=0; i<5; i++) - { - LittleEndian.putShort(data, 4 + i*2 + offset, (short)this.field_unknown); - } + + LittleEndian.putShort(data, 4 + offset, this.getOptions()); + LittleEndian.putInt(data, 6 + offset, this.getHorizontalPos()); + LittleEndian.putInt(data, 10 + offset, this.getVerticalPos()); LittleEndian.putInt(data, 14 + offset, this.getObjectID()); LittleEndian.putInt(data, 18 + offset, this.getDVRecNo()); return getRecordSize(); @@ -149,9 +199,11 @@ public class DVALRecord extends Record public Object clone() { DVALRecord rec = new DVALRecord(); - rec.field_unknown = this.field_unknown; + rec.field_1_options = field_1_options; + rec.field_2_horiz_pos = field_2_horiz_pos; + rec.field_3_vert_pos = field_3_vert_pos; rec.field_cbo_id = this.field_cbo_id; - rec.field_3_dv_no = this.field_3_dv_no; + rec.field_5_dv_no = this.field_5_dv_no; return rec; } -} \ No newline at end of file +} diff --git a/src/java/org/apache/poi/hssf/record/DVRecord.java b/src/java/org/apache/poi/hssf/record/DVRecord.java index 0bae009bd3..a7b68a1743 100644 --- a/src/java/org/apache/poi/hssf/record/DVRecord.java +++ b/src/java/org/apache/poi/hssf/record/DVRecord.java @@ -16,16 +16,16 @@ package org.apache.poi.hssf.record; +import java.io.IOException; +import java.util.Enumeration; +import java.util.Hashtable; +import java.util.Stack; + +import org.apache.poi.hssf.record.formula.Ptg; +import org.apache.poi.hssf.util.HSSFCellRangeAddress; import org.apache.poi.util.BitField; import org.apache.poi.util.LittleEndian; import org.apache.poi.util.StringUtil; -import org.apache.poi.hssf.util.HSSFCellRangeAddress; -import org.apache.poi.hssf.record.formula.Ptg; - -import java.io.IOException; -import java.util.Stack; -import java.util.Hashtable; -import java.util.Enumeration; /** * Title: DV Record

@@ -187,10 +187,13 @@ public class DVRecord extends Record this.field_not_used_2 = in.readShort(); //read sec formula data condition - // Not sure if this was needed or not... + //Not sure if this was needed or not... try { in.skip(this.field_size_sec_formula); - } catch(IOException e) { throw new IllegalStateException(e); } + } catch(IOException e) { + e.printStackTrace(); + throw new IllegalStateException(e.getMessage()); + } token_pos = 0; while (token_pos < this.field_size_sec_formula) @@ -502,6 +505,14 @@ public class DVRecord extends Record { return this.sid; } + + /** + * Clones the object. Uses serialisation, as the + * contents are somewhat complex + */ + public Object clone() { + return cloneViaReserialise(); + } /**@todo DVRecord = Serializare */ diff --git a/src/java/org/apache/poi/hssf/record/DrawingGroupRecord.java b/src/java/org/apache/poi/hssf/record/DrawingGroupRecord.java index 3782273a5d..ea083ee1e3 100644 --- a/src/java/org/apache/poi/hssf/record/DrawingGroupRecord.java +++ b/src/java/org/apache/poi/hssf/record/DrawingGroupRecord.java @@ -72,6 +72,16 @@ public class DrawingGroupRecord extends AbstractEscherHolderRecord return writeData( offset, data, buffer ); } } + + /** + * Process the bytes into escher records. + * (Not done by default in case we break things, + * unless you set the "poi.deserialize.escher" + * system property) + */ + public void processChildRecords() { + convertRawBytesToEscherRecords(); + } /** * Size of record (including 4 byte headers for all sections) diff --git a/src/java/org/apache/poi/hssf/record/DrawingRecord.java b/src/java/org/apache/poi/hssf/record/DrawingRecord.java index d73702b6a2..009bc31bce 100644 --- a/src/java/org/apache/poi/hssf/record/DrawingRecord.java +++ b/src/java/org/apache/poi/hssf/record/DrawingRecord.java @@ -106,4 +106,18 @@ public class DrawingRecord extends Record this.recordData = thedata; } -} + public Object clone() { + DrawingRecord rec = new DrawingRecord(); + + if (recordData != null) { + rec.recordData = new byte[ recordData.length ]; + System.arraycopy(recordData, 0, rec.recordData, 0, recordData.length); + } + if (contd != null) { + System.arraycopy(contd, 0, rec.contd, 0, contd.length); + rec.contd = new byte[ contd.length ]; + } + + return rec; + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/hssf/record/EscherAggregate.java b/src/java/org/apache/poi/hssf/record/EscherAggregate.java index 28a717682a..d62b59adbb 100644 --- a/src/java/org/apache/poi/hssf/record/EscherAggregate.java +++ b/src/java/org/apache/poi/hssf/record/EscherAggregate.java @@ -24,6 +24,8 @@ import org.apache.poi.hssf.model.TextboxShape; import org.apache.poi.hssf.model.DrawingManager2; import org.apache.poi.hssf.model.ConvertAnchor; import org.apache.poi.hssf.model.CommentShape; +import org.apache.poi.util.POILogFactory; +import org.apache.poi.util.POILogger; import java.util.*; @@ -47,6 +49,7 @@ import java.util.*; public class EscherAggregate extends AbstractEscherHolderRecord { public static final short sid = 9876; + private static POILogger log = POILogFactory.getLogger(EscherAggregate.class); public static final short ST_MIN = (short) 0; public static final short ST_NOT_PRIMATIVE = ST_MIN; @@ -523,7 +526,146 @@ public class EscherAggregate extends AbstractEscherHolderRecord { this.patriarch = patriarch; } - + + /** + * Converts the Records into UserModel + * objects on the bound HSSFPatriarch + */ + public void convertRecordsToUserModel() { + if(patriarch == null) { + throw new IllegalStateException("Must call setPatriarch() first"); + } + + // The top level container ought to have + // the DgRecord and the container of one container + // per shape group (patriach overall first) + EscherContainerRecord topContainer = + (EscherContainerRecord)getEscherContainer(); + if(topContainer == null) { + return; + } + topContainer = (EscherContainerRecord) + topContainer.getChildContainers().get(0); + + List tcc = topContainer.getChildContainers(); + if(tcc.size() == 0) { + throw new IllegalStateException("No child escher containers at the point that should hold the patriach data, and one container per top level shape!"); + } + + // First up, get the patriach position + // This is in the first EscherSpgrRecord, in + // the first container, with a EscherSRecord too + EscherContainerRecord patriachContainer = + (EscherContainerRecord)tcc.get(0); + EscherSpgrRecord spgr = null; + for(Iterator it = patriachContainer.getChildRecords().iterator(); it.hasNext();) { + EscherRecord r = (EscherRecord)it.next(); + if(r instanceof EscherSpgrRecord) { + spgr = (EscherSpgrRecord)r; + break; + } + } + if(spgr != null) { + patriarch.setCoordinates( + spgr.getRectX1(), spgr.getRectY1(), + spgr.getRectX2(), spgr.getRectY2() + ); + } + + // Now process the containers for each group + // and objects + for(int i=1; i 0) { + // Add a comma to the end if needed + if(result.length() > 0 && !result.endsWith(",")) { + result += ","; + } + // And add the string it corresponds to + result += thisRes; + } + } + } else { + // Otherwise just get the string + result = getAreaRefString(ptg, book); + } + + return result; + } + /** + * Turn the given ptg into a string, or + * return an empty string if nothing is possible + * for it. + */ + private String getAreaRefString(Ptg ptg,Workbook book) { + if (ptg.getClass() == Area3DPtg.class){ + return ptg.toFormulaString(book); } else if (ptg.getClass() == Ref3DPtg.class){ - result = ptg.toFormulaString(book); + return ptg.toFormulaString(book); } else if (ptg.getClass() == DeletedArea3DPtg.class || ptg.getClass() == DeletedRef3DPtg.class) { - result = "#REF!" ; } - - return result; + return "#REF!"; + } + return ""; } /** sets the reference , the area only (range) @@ -686,19 +717,32 @@ public class NameRecord extends Record { } if (ra.hasRange()) { - ptg = new Area3DPtg(); - ((Area3DPtg) ptg).setExternSheetIndex(externSheetIndex); - ((Area3DPtg) ptg).setArea(ref); - this.setDefinitionTextLength((short)ptg.getSize()); + // Is it contiguous or not? + AreaReference[] refs = + AreaReference.generateContiguous(ref); + this.setDefinitionTextLength((short)0); + + // Add the area reference(s) + for(int i=0; i 1) { + ptg = new UnionPtg(); + field_13_name_definition.push(ptg); + this.setDefinitionTextLength( (short)(getDefinitionLength() + ptg.getSize()) ); + } } else { ptg = new Ref3DPtg(); ((Ref3DPtg) ptg).setExternSheetIndex(externSheetIndex); ((Ref3DPtg) ptg).setArea(ref); + field_13_name_definition.push(ptg); this.setDefinitionTextLength((short)ptg.getSize()); } - - field_13_name_definition.push(ptg); - } /** @@ -832,6 +876,15 @@ public class NameRecord extends Record { .append("\n"); buffer.append(" .Name (Unicode text) = ").append( getNameText() ) .append("\n"); + + buffer.append(" .Parts (" + field_13_name_definition.size() +"):") + .append("\n"); + Iterator it = field_13_name_definition.iterator(); + while(it.hasNext()) { + Ptg ptg = (Ptg)it.next(); + buffer.append(" " + ptg.toString()).append("\n"); + } + buffer.append(" .Menu text (Unicode string without length field) = ").append( field_14_custom_menu_text ) .append("\n"); buffer.append(" .Description text (Unicode string without length field) = ").append( field_15_description_text ) diff --git a/src/java/org/apache/poi/hssf/record/NoteRecord.java b/src/java/org/apache/poi/hssf/record/NoteRecord.java index 63c0b1d7dc..a9e83806f8 100644 --- a/src/java/org/apache/poi/hssf/record/NoteRecord.java +++ b/src/java/org/apache/poi/hssf/record/NoteRecord.java @@ -243,4 +243,15 @@ public class NoteRecord extends Record { public void setAuthor(String author){ field_5_author = author; } + + public Object clone() { + NoteRecord rec = new NoteRecord(); + rec.field_1_row = field_1_row; + rec.field_2_col = field_2_col; + rec.field_3_flags = field_3_flags; + rec.field_4_shapeid = field_4_shapeid; + rec.field_5_author = field_5_author; + return rec; + } + } diff --git a/src/java/org/apache/poi/hssf/record/NoteStructureSubRecord.java b/src/java/org/apache/poi/hssf/record/NoteStructureSubRecord.java index 6ad3f8eb63..c99f29be35 100644 --- a/src/java/org/apache/poi/hssf/record/NoteStructureSubRecord.java +++ b/src/java/org/apache/poi/hssf/record/NoteStructureSubRecord.java @@ -125,6 +125,15 @@ public class NoteStructureSubRecord { return sid; } + + public Object clone() { + NoteStructureSubRecord rec = new NoteStructureSubRecord(); + byte[] recdata = new byte[reserved.length]; + System.arraycopy(reserved, 0, recdata, 0, recdata.length); + rec.reserved = recdata; + return rec; + } + } diff --git a/src/java/org/apache/poi/hssf/record/Record.java b/src/java/org/apache/poi/hssf/record/Record.java index 3205c57740..c1b8a0cfda 100644 --- a/src/java/org/apache/poi/hssf/record/Record.java +++ b/src/java/org/apache/poi/hssf/record/Record.java @@ -19,6 +19,8 @@ package org.apache.poi.hssf.record; +import java.io.ByteArrayInputStream; + /** * Title: Record * Description: All HSSF Records inherit from this class. It @@ -147,4 +149,30 @@ public abstract class Record public Object clone() { throw new RuntimeException("The class "+getClass().getName()+" needs to define a clone method"); } + + /** + * Clone the current record, via a call to serialise + * it, and another to create a new record from the + * bytes. + * May only be used for classes which don't have + * internal counts / ids in them. For those which + * do, a full record-aware serialise is needed, which + * allocates new ids / counts as needed. + */ + public Record cloneViaReserialise() + { + // Do it via a re-serialise + // It's a cheat, but it works... + byte[] b = serialize(); + RecordInputStream rinp = new RecordInputStream( + new ByteArrayInputStream(b) + ); + rinp.nextRecord(); + + Record[] r = RecordFactory.createRecord(rinp); + if(r.length != 1) { + throw new IllegalStateException("Re-serialised a record to clone it, but got " + r.length + " records back!"); + } + return r[0]; + } } diff --git a/src/java/org/apache/poi/hssf/record/RecordFactory.java b/src/java/org/apache/poi/hssf/record/RecordFactory.java index cf705a316d..20e8ba788a 100644 --- a/src/java/org/apache/poi/hssf/record/RecordFactory.java +++ b/src/java/org/apache/poi/hssf/record/RecordFactory.java @@ -76,7 +76,7 @@ public class RecordFactory WriteProtectRecord.class, FilePassRecord.class, PaneRecord.class, NoteRecord.class, ObjectProtectRecord.class, ScenarioProtectRecord.class, FileSharingRecord.class, ChartTitleFormatRecord.class, - DVRecord.class, DVALRecord.class + DVRecord.class, DVALRecord.class, UncalcedRecord.class }; } private static Map recordsMap = recordsToMap(records); diff --git a/src/java/org/apache/poi/hssf/record/RecordInputStream.java b/src/java/org/apache/poi/hssf/record/RecordInputStream.java index 399e0f566d..dd853f2463 100755 --- a/src/java/org/apache/poi/hssf/record/RecordInputStream.java +++ b/src/java/org/apache/poi/hssf/record/RecordInputStream.java @@ -133,6 +133,9 @@ public class RecordInputStream extends InputStream } } + /** + * Reads an 8 bit, signed value + */ public byte readByte() { checkRecordPosition(); @@ -141,7 +144,10 @@ public class RecordInputStream extends InputStream pos += 1; return result; } - + + /** + * Reads a 16 bit, signed value + */ public short readShort() { checkRecordPosition(); @@ -169,6 +175,21 @@ public class RecordInputStream extends InputStream return result; } + /** + * Reads an 8 bit, unsigned value + */ + public short readUByte() { + short s = readByte(); + if(s < 0) { + s += 256; + } + return s; + } + + /** + * Reads a 16 bit,un- signed value. + * @return + */ public int readUShort() { checkRecordPosition(); diff --git a/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java b/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java index c0f77cb558..ae250246d3 100755 --- a/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java +++ b/src/java/org/apache/poi/hssf/record/SharedFormulaRecord.java @@ -20,10 +20,8 @@ package org.apache.poi.hssf.record; import java.util.Stack; -import java.util.List; import org.apache.poi.hssf.record.formula.*; -import org.apache.poi.util.LittleEndian; /** * Title: SharedFormulaRecord @@ -156,15 +154,12 @@ public class SharedFormulaRecord return sid; } - /** - * Shared formulas are to treated like unknown records, and as a result d - */ protected void fillFields(RecordInputStream in) { - field_1_first_row = in.readShort(); - field_2_last_row = in.readShort(); - field_3_first_column = in.readByte(); - field_4_last_column = in.readByte(); + field_1_first_row = in.readUShort(); + field_2_last_row = in.readUShort(); + field_3_first_column = in.readUByte(); + field_4_last_column = in.readUByte(); field_5_reserved = in.readShort(); field_6_expression_len = in.readShort(); field_7_parsed_expr = getParsedExpressionTokens(in); @@ -181,6 +176,9 @@ public class SharedFormulaRecord return stack; } + /** + * Are we shared by the supplied formula record? + */ public boolean isFormulaInShared(FormulaRecord formula) { final int formulaRow = formula.getRow(); final int formulaColumn = formula.getColumn(); @@ -202,48 +200,48 @@ public class SharedFormulaRecord Ptg ptg = (Ptg) field_7_parsed_expr.get(k); if (ptg instanceof RefNPtg) { RefNPtg refNPtg = (RefNPtg)ptg; - ptg = new ReferencePtg( (short)(formulaRow + refNPtg.getRow()), - (byte)(formulaColumn + refNPtg.getColumn()), + ptg = new ReferencePtg(fixupRelativeRow(formulaRow,refNPtg.getRow(),refNPtg.isRowRelative()), + fixupRelativeColumn(formulaColumn,refNPtg.getColumn(),refNPtg.isColRelative()), refNPtg.isRowRelative(), refNPtg.isColRelative()); } else if (ptg instanceof RefNVPtg) { RefNVPtg refNVPtg = (RefNVPtg)ptg; - ptg = new RefVPtg( (short)(formulaRow + refNVPtg.getRow()), - (byte)(formulaColumn + refNVPtg.getColumn()), - refNVPtg.isRowRelative(), - refNVPtg.isColRelative()); + ptg = new RefVPtg(fixupRelativeRow(formulaRow,refNVPtg.getRow(),refNVPtg.isRowRelative()), + fixupRelativeColumn(formulaColumn,refNVPtg.getColumn(),refNVPtg.isColRelative()), + refNVPtg.isRowRelative(), + refNVPtg.isColRelative()); } else if (ptg instanceof RefNAPtg) { RefNAPtg refNAPtg = (RefNAPtg)ptg; - ptg = new RefAPtg( (short)(formulaRow + refNAPtg.getRow()), - (byte)(formulaColumn + refNAPtg.getColumn()), + ptg = new RefAPtg( fixupRelativeRow(formulaRow,refNAPtg.getRow(),refNAPtg.isRowRelative()), + fixupRelativeColumn(formulaColumn,refNAPtg.getColumn(),refNAPtg.isColRelative()), refNAPtg.isRowRelative(), refNAPtg.isColRelative()); } else if (ptg instanceof AreaNPtg) { AreaNPtg areaNPtg = (AreaNPtg)ptg; - ptg = new AreaPtg((short)(formulaRow + areaNPtg.getFirstRow()), - (short)(formulaRow + areaNPtg.getLastRow()), - (short)(formulaColumn + areaNPtg.getFirstColumn()), - (short)(formulaColumn + areaNPtg.getLastColumn()), + ptg = new AreaPtg(fixupRelativeRow(formulaRow,areaNPtg.getFirstRow(),areaNPtg.isFirstRowRelative()), + fixupRelativeRow(formulaRow,areaNPtg.getLastRow(),areaNPtg.isLastRowRelative()), + fixupRelativeColumn(formulaColumn,areaNPtg.getFirstColumn(),areaNPtg.isFirstColRelative()), + fixupRelativeColumn(formulaColumn,areaNPtg.getLastColumn(),areaNPtg.isLastColRelative()), areaNPtg.isFirstRowRelative(), areaNPtg.isLastRowRelative(), areaNPtg.isFirstColRelative(), areaNPtg.isLastColRelative()); } else if (ptg instanceof AreaNVPtg) { AreaNVPtg areaNVPtg = (AreaNVPtg)ptg; - ptg = new AreaVPtg((short)(formulaRow + areaNVPtg.getFirstRow()), - (short)(formulaRow + areaNVPtg.getLastRow()), - (short)(formulaColumn + areaNVPtg.getFirstColumn()), - (short)(formulaColumn + areaNVPtg.getLastColumn()), + ptg = new AreaVPtg(fixupRelativeRow(formulaRow,areaNVPtg.getFirstRow(),areaNVPtg.isFirstRowRelative()), + fixupRelativeRow(formulaRow,areaNVPtg.getLastRow(),areaNVPtg.isLastRowRelative()), + fixupRelativeColumn(formulaColumn,areaNVPtg.getFirstColumn(),areaNVPtg.isFirstColRelative()), + fixupRelativeColumn(formulaColumn,areaNVPtg.getLastColumn(),areaNVPtg.isLastColRelative()), areaNVPtg.isFirstRowRelative(), areaNVPtg.isLastRowRelative(), areaNVPtg.isFirstColRelative(), areaNVPtg.isLastColRelative()); } else if (ptg instanceof AreaNAPtg) { AreaNAPtg areaNAPtg = (AreaNAPtg)ptg; - ptg = new AreaAPtg((short)(formulaRow + areaNAPtg.getFirstRow()), - (short)(formulaRow + areaNAPtg.getLastRow()), - (short)(formulaColumn + areaNAPtg.getFirstColumn()), - (short)(formulaColumn + areaNAPtg.getLastColumn()), + ptg = new AreaAPtg(fixupRelativeRow(formulaRow,areaNAPtg.getFirstRow(),areaNAPtg.isFirstRowRelative()), + fixupRelativeRow(formulaRow,areaNAPtg.getLastRow(),areaNAPtg.isLastRowRelative()), + fixupRelativeColumn(formulaColumn,areaNAPtg.getFirstColumn(),areaNAPtg.isFirstColRelative()), + fixupRelativeColumn(formulaColumn,areaNAPtg.getLastColumn(),areaNAPtg.isLastColRelative()), areaNAPtg.isFirstRowRelative(), areaNAPtg.isLastRowRelative(), areaNAPtg.isFirstColRelative(), @@ -258,6 +256,21 @@ public class SharedFormulaRecord throw new RuntimeException("Shared Formula Conversion: Coding Error"); } } + + private short fixupRelativeColumn(int currentcolumn, short column, boolean relative) { + if(relative) { + if((column&128)!=0) column=(short)(column-256); + column+=currentcolumn; + } + return column; + } + + private short fixupRelativeRow(int currentrow, short row, boolean relative) { + if(relative) { + row+=currentrow; + } + return row; + } /** * Mirroring formula records so it is registered in the ValueRecordsAggregate diff --git a/src/java/org/apache/poi/hssf/record/TextObjectRecord.java b/src/java/org/apache/poi/hssf/record/TextObjectRecord.java index 97685c9ca2..c8f6669b0f 100644 --- a/src/java/org/apache/poi/hssf/record/TextObjectRecord.java +++ b/src/java/org/apache/poi/hssf/record/TextObjectRecord.java @@ -251,4 +251,21 @@ public class TextObjectRecord buffer.append( "[/TXO]\n" ); return buffer.toString(); } + + public Object clone() { + + TextObjectRecord rec = new TextObjectRecord(); + rec.str = str; + + rec.setOptions(getOptions()); + rec.setTextOrientation(getTextOrientation()); + rec.setReserved4(getReserved4()); + rec.setReserved5(getReserved5()); + rec.setReserved6(getReserved6()); + rec.setTextLength(getTextLength()); + rec.setFormattingRunLength(getFormattingRunLength()); + rec.setReserved7(getReserved7()); + return rec; + } + } diff --git a/src/java/org/apache/poi/hssf/record/UncalcedRecord.java b/src/java/org/apache/poi/hssf/record/UncalcedRecord.java new file mode 100644 index 0000000000..a67b0b5af4 --- /dev/null +++ b/src/java/org/apache/poi/hssf/record/UncalcedRecord.java @@ -0,0 +1,82 @@ +/* ==================================================================== + 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.hssf.record; + +import org.apache.poi.util.LittleEndian; + +/** + * Title: Uncalced Record + *

+ * If this record occurs in the Worksheet Substream, it indicates that the formulas have not + * been recalculated before the document was saved. + * + * @author Olivier Leprince + */ + +public class UncalcedRecord extends Record +{ + public final static short sid = 0x5E; + + /** + * Default constructor + */ + public UncalcedRecord() { + } + /** + * read constructor + */ + public UncalcedRecord(RecordInputStream in) { + super(in); + } + + public short getSid() { + return sid; + } + + protected void validateSid(short id) { + if (id != sid) { + throw new RecordFormatException("NOT AN UNCALCED RECORD"); + } + } + + protected void fillFields(RecordInputStream in) { + short unused = in.readShort(); + } + + public String toString() { + StringBuffer buffer = new StringBuffer(); + buffer.append("[UNCALCED]\n"); + buffer.append("[/UNCALCED]\n"); + return buffer.toString(); + } + + public int serialize(int offset, byte[] data) { + LittleEndian.putShort(data, 0 + offset, sid); + LittleEndian.putShort(data, 2 + offset, (short) 2); + LittleEndian.putShort(data, 4 + offset, (short) 0); // unused + return getRecordSize(); + } + + public int getRecordSize() { + return UncalcedRecord.getStaticRecordSize(); + } + + public static int getStaticRecordSize() { + return 6; + } +} diff --git a/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java b/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java index be0f703e80..7840d32562 100644 --- a/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java +++ b/src/java/org/apache/poi/hssf/record/aggregates/FormulaRecordAggregate.java @@ -99,7 +99,7 @@ public class FormulaRecordAggregate { this.formulaRecord = formulaRecord; } - + public FormulaRecord getFormulaRecord() { return formulaRecord; @@ -109,7 +109,7 @@ public class FormulaRecordAggregate { return stringRecord; } - + public boolean isEqual(CellValueRecordInterface i) { return formulaRecord.isEqual( i ); diff --git a/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java b/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java index fe3af5aede..e48a0a902b 100644 --- a/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java +++ b/src/java/org/apache/poi/hssf/record/aggregates/ValueRecordsAggregate.java @@ -127,8 +127,17 @@ public class ValueRecordsAggregate FormulaRecordAggregate lastFormulaAggregate = null; + // First up, locate all the shared formulas List sharedFormulas = new java.util.ArrayList(); + for (k = offset; k < records.size(); k++) + { + Record rec = ( Record ) records.get(k); + if (rec instanceof SharedFormulaRecord) { + sharedFormulas.add(rec); + } + } + // Now do the main processing sweep for (k = offset; k < records.size(); k++) { Record rec = ( Record ) records.get(k); @@ -137,18 +146,14 @@ public class ValueRecordsAggregate { break; } else if (rec instanceof SharedFormulaRecord) { - sharedFormulas.add(rec); + // Already handled, not to worry } else if (rec instanceof FormulaRecord) { FormulaRecord formula = (FormulaRecord)rec; if (formula.isSharedFormula()) { - Record nextRecord = (Record) records.get(k + 1); - if (nextRecord instanceof SharedFormulaRecord) { - sharedFormulas.add(nextRecord); - k++; - } - //traverse the list of shared formulas in reverse order, and try to find the correct one - //for us + // Traverse the list of shared formulas in + // reverse order, and try to find the correct one + // for us boolean found = false; for (int i=sharedFormulas.size()-1;i>=0;i--) { SharedFormulaRecord shrd = (SharedFormulaRecord)sharedFormulas.get(i); diff --git a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java index 470b6e390b..d808a94c4d 100644 --- a/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/Area3DPtg.java @@ -243,16 +243,22 @@ public class Area3DPtg extends Ptg public void setArea( String ref ) { AreaReference ar = new AreaReference( ref ); + CellReference[] crs = ar.getCells(); + + CellReference firstCell = crs[0]; + CellReference lastCell = firstCell; + if(crs.length > 1) { + lastCell = crs[1]; + } - setFirstRow( (short) ar.getCells()[0].getRow() ); - setFirstColumn( (short) ar.getCells()[0].getCol() ); - setLastRow( (short) ar.getCells()[1].getRow() ); - setLastColumn( (short) ar.getCells()[1].getCol() ); - setFirstColRelative( !ar.getCells()[0].isColAbsolute() ); - setLastColRelative( !ar.getCells()[1].isColAbsolute() ); - setFirstRowRelative( !ar.getCells()[0].isRowAbsolute() ); - setLastRowRelative( !ar.getCells()[1].isRowAbsolute() ); - + setFirstRow( (short) firstCell.getRow() ); + setFirstColumn( (short) firstCell.getCol() ); + setLastRow( (short) lastCell.getRow() ); + setLastColumn( (short) lastCell.getCol() ); + setFirstColRelative( !firstCell.isColAbsolute() ); + setLastColRelative( !lastCell.isColAbsolute() ); + setFirstRowRelative( !firstCell.isRowAbsolute() ); + setLastRowRelative( !lastCell.isRowAbsolute() ); } public String toFormulaString(Workbook book) diff --git a/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java b/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java index e382d4e759..34bad6f32c 100644 --- a/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/ErrPtg.java @@ -29,7 +29,7 @@ import org.apache.poi.hssf.usermodel.HSSFErrorConstants; public class ErrPtg extends Ptg { public static final short sid = 0x1c; - private static final int SIZE = 7; + private static final int SIZE = 2; private byte field_1_error_code; /** Creates new ErrPtg */ diff --git a/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java b/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java index 511ac44d7b..a7fc0274ad 100644 --- a/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java +++ b/src/java/org/apache/poi/hssf/record/formula/ExpPtg.java @@ -75,7 +75,7 @@ public class ExpPtg public String toFormulaString(Workbook book) { - throw new RecordFormatException("Coding Error: Expected ExpPtg to be converted from Shared to Non-Shared Formula"); + throw new RecordFormatException("Coding Error: Expected ExpPtg to be converted from Shared to Non-Shared Formula by ValueRecordsAggregate, but it wasn't"); } public String toString() diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java index 9cc4550719..3e24106ca7 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java @@ -24,17 +24,33 @@ */ package org.apache.poi.hssf.usermodel; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.Calendar; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; + import org.apache.poi.hssf.model.FormulaParser; import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.model.Workbook; -import org.apache.poi.hssf.record.*; +import org.apache.poi.hssf.record.BlankRecord; +import org.apache.poi.hssf.record.BoolErrRecord; +import org.apache.poi.hssf.record.CellValueRecordInterface; +import org.apache.poi.hssf.record.CommonObjectDataSubRecord; +import org.apache.poi.hssf.record.ExtendedFormatRecord; +import org.apache.poi.hssf.record.FormulaRecord; +import org.apache.poi.hssf.record.LabelSSTRecord; +import org.apache.poi.hssf.record.NoteRecord; +import org.apache.poi.hssf.record.NumberRecord; +import org.apache.poi.hssf.record.ObjRecord; +import org.apache.poi.hssf.record.Record; +import org.apache.poi.hssf.record.SubRecord; +import org.apache.poi.hssf.record.TextObjectRecord; +import org.apache.poi.hssf.record.UnicodeString; import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate; import org.apache.poi.hssf.record.formula.Ptg; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.*; - /** * High level representation of a cell in a row of a spreadsheet. * Cells can be numeric, formula-based or string-based (text). The cell type @@ -266,14 +282,24 @@ public class HSSFCell } /** - * set the cell's number within the row (0 based) + * Set the cell's number within the row (0 based). * @param num short the cell number + * @deprecated Doesn't update the row's idea of what cell this is, use {@link HSSFRow#moveCell(HSSFCell, short)} instead */ - public void setCellNum(short num) { record.setColumn(num); } + + /** + * Updates the cell record's idea of what + * column it belongs in (0 based) + * @param num the new cell number + */ + protected void updateCellNum(short num) + { + record.setColumn(num); + } /** * get the cell's number within the row @@ -508,7 +534,13 @@ public class HSSFCell { setCellType(CELL_TYPE_NUMERIC, false, row, col, styleIndex); } - (( NumberRecord ) record).setValue(value); + + // Save into the apropriate record + if(record instanceof FormulaRecordAggregate) { + (( FormulaRecordAggregate ) record).getFormulaRecord().setValue(value); + } else { + (( NumberRecord ) record).setValue(value); + } } /** diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java b/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java index e383ed5586..583e1b4793 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFPatriarch.java @@ -21,6 +21,13 @@ import java.util.ArrayList; import java.util.Iterator; import java.util.List; +import org.apache.poi.ddf.EscherComplexProperty; +import org.apache.poi.ddf.EscherOptRecord; +import org.apache.poi.ddf.EscherProperty; +import org.apache.poi.hssf.record.EscherAggregate; +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.StringUtil; + /** * The patriarch is the toplevel container for shapes in a sheet. It does * little other than act as a container for other shapes and groups. @@ -37,13 +44,21 @@ public class HSSFPatriarch int x2 = 1023; int y2 = 255; + /** + * The EscherAggregate we have been bound to. + * (This will handle writing us out into records, + * and building up our shapes from the records) + */ + private EscherAggregate boundAggregate; + /** * Creates the patriarch. * - * @param sheet the sheet this patriarch is stored in. + * @param sheet the sheet this patriarch is stored in. */ - HSSFPatriarch(HSSFSheet sheet) + HSSFPatriarch(HSSFSheet sheet, EscherAggregate boundAggregate) { + this.boundAggregate = boundAggregate; this.sheet = sheet; } @@ -173,6 +188,39 @@ public class HSSFPatriarch this.x2 = x2; this.y2 = y2; } + + /** + * Does this HSSFPatriarch contain a chart? + * (Technically a reference to a chart, since they + * get stored in a different block of records) + * FIXME - detect chart in all cases (only seems + * to work on some charts so far) + */ + public boolean containsChart() { + // TODO - support charts properly in usermodel + + // We're looking for a EscherOptRecord + EscherOptRecord optRecord = (EscherOptRecord) + boundAggregate.findFirstWithId(EscherOptRecord.RECORD_ID); + if(optRecord == null) { + // No opt record, can't have chart + return false; + } + + for(Iterator it = optRecord.getEscherProperties().iterator(); it.hasNext();) { + EscherProperty prop = (EscherProperty)it.next(); + if(prop.getPropertyNumber() == 896 && prop.isComplex()) { + EscherComplexProperty cp = (EscherComplexProperty)prop; + String str = StringUtil.getFromUnicodeLE(cp.getComplexData()); + System.err.println(str); + if(str.equals("Chart 1\0")) { + return true; + } + } + } + + return false; + } /** * The top left x coordinate of this group. @@ -206,4 +254,10 @@ public class HSSFPatriarch return y2; } + /** + * Returns the aggregate escher record we're bound to + */ + protected EscherAggregate _getBoundAggregate() { + return boundAggregate; + } } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java index 423b023af1..ae5727bc68 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFRow.java @@ -22,15 +22,14 @@ */ package org.apache.poi.hssf.usermodel; +import java.util.Iterator; +import java.util.NoSuchElementException; + import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.model.Workbook; import org.apache.poi.hssf.record.CellValueRecordInterface; import org.apache.poi.hssf.record.RowRecord; -import java.util.HashMap; -import java.util.Iterator; -import java.util.NoSuchElementException; - /** * High level representation of a row of a spreadsheet. * @@ -157,11 +156,15 @@ public class HSSFRow * remove the HSSFCell from this row. * @param cell to remove */ - public void removeCell(HSSFCell cell) - { - CellValueRecordInterface cval = cell.getCellValueRecord(); - - sheet.removeValueRecord(getRowNum(), cval); + public void removeCell(HSSFCell cell) { + removeCell(cell, true); + } + private void removeCell(HSSFCell cell, boolean alsoRemoveRecords) { + if(alsoRemoveRecords) { + CellValueRecordInterface cval = cell.getCellValueRecord(); + sheet.removeValueRecord(getRowNum(), cval); + } + short column=cell.getCellNum(); if(cell!=null && column newColumn && cells[newColumn] != null) { + throw new IllegalArgumentException("Asked to move cell to column " + newColumn + " but there's already a cell there"); + } + + // Check it's one of ours + if(! cells[cell.getCellNum()].equals(cell)) { + throw new IllegalArgumentException("Asked to move a cell, but it didn't belong to our row"); + } + + // Move the cell to the new position + // (Don't remove the records though) + removeCell(cell, false); + cell.updateCellNum(newColumn); + addCell(cell); + } /** * used internally to add a cell. */ - private void addCell(HSSFCell cell) { short column=cell.getCellNum(); diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java b/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java index 19e54e2adc..fa49528619 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFShapeGroup.java @@ -121,7 +121,7 @@ public class HSSFShapeGroup } /** - * Sets the coordinate space of this group. All children are contrained + * Sets the coordinate space of this group. All children are constrained * to these coordinates. */ public void setCoordinates( int x1, int y1, int x2, int y2 ) @@ -177,5 +177,4 @@ public class HSSFShapeGroup } return count; } - -} +} \ No newline at end of file diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java index b52fa1e5b2..0250a4cbaa 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFSheet.java @@ -28,6 +28,7 @@ import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.model.Workbook; import org.apache.poi.hssf.record.*; import org.apache.poi.hssf.record.formula.Ptg; +import org.apache.poi.hssf.record.formula.ReferencePtg; import org.apache.poi.hssf.util.HSSFCellRangeAddress; import org.apache.poi.hssf.util.HSSFDataValidation; import org.apache.poi.hssf.util.Region; @@ -593,6 +594,26 @@ public class HSSFSheet region.getColumnTo()); } + /** + * Whether a record must be inserted or not at generation to indicate that + * formula must be recalculated when workbook is opened. + * @param value true if an uncalced record must be inserted or not at generation + */ + public void setForceFormulaRecalculation(boolean value) + { + sheet.setUncalced(value); + } + /** + * Whether a record must be inserted or not at generation to indicate that + * formula must be recalculated when workbook is opened. + * @return true if an uncalced record must be inserted or not at generation + */ + public boolean getForceFormulaRecalculation() + { + return sheet.getUncalced(); + } + + /** * determines whether the output is vertically centered on the page. * @param value true to vertically center, false otherwise. @@ -1202,10 +1223,66 @@ public class HSSFSheet row2Replace.createCellFromRecord( cellRecord ); sheet.addValueRecord( rowNum + n, cellRecord ); } + + // move comments if exist (can exist even if cell is null) + HSSFComment comment = getCellComment(rowNum, col); + if (comment != null) { + comment.setRow(rowNum + n); + } } } if ( endRow == lastrow || endRow + n > lastrow ) lastrow = Math.min( endRow + n, 65535 ); if ( startRow == firstrow || startRow + n < firstrow ) firstrow = Math.max( startRow + n, 0 ); + + // Update any formulas on this sheet that point to + // rows which have been moved + updateFormulasAfterShift(startRow, endRow, n); + } + + /** + * Called by shiftRows to update formulas on this sheet + * to point to the new location of moved rows + */ + private void updateFormulasAfterShift(int startRow, int endRow, int n) { + // Need to look at every cell on the sheet + // Not just those that were moved + Iterator ri = rowIterator(); + while(ri.hasNext()) { + HSSFRow r = (HSSFRow)ri.next(); + Iterator ci = r.cellIterator(); + while(ci.hasNext()) { + HSSFCell c = (HSSFCell)ci.next(); + if(c.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { + // Since it's a formula cell, process the + // formula string, and look to see if + // it contains any references + FormulaParser fp = new FormulaParser(c.getCellFormula(), workbook.getWorkbook()); + fp.parse(); + + // Look for references, and update if needed + Ptg[] ptgs = fp.getRPNPtg(); + boolean changed = false; + for(int i=0; inull if not found */ public HSSFComment getCellComment(int row, int column){ - return HSSFCell.findCellComment(sheet, row, column); + // Don't call findCellComment directly, otherwise + // two calls to this method will result in two + // new HSSFComment instances, which is bad + HSSFRow r = getRow(row); + if(r != null) { + HSSFCell c = r.getCell((short)column); + if(c != null) { + return c.getCellComment(); + } else { + // No cell, so you will get new + // objects every time, sorry... + return HSSFCell.findCellComment(sheet, row, column); + } + } + return null; } } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 487f9c6b22..e237ed75db 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -445,6 +445,35 @@ public class HSSFWorkbook extends POIDocument return workbook.getSheetName(sheet); } + /** + * check whether a sheet is hidden + * @param sheet Number + * @return True if sheet is hidden + */ + + public boolean isSheetHidden(int sheet) { + if (sheet > (sheets.size() - 1)) + { + throw new RuntimeException("Sheet out of bounds"); + } + return workbook.isSheetHidden(sheet); + } + + /** + * Hide or unhide a sheet + * + * @param sheetnum The sheet number + * @param hidden True to mark the sheet as hidden, false otherwise + */ + + public void setSheetHidden(int sheet, boolean hidden) { + if (sheet > (sheets.size() - 1)) + { + throw new RuntimeException("Sheet out of bounds"); + } + workbook.setSheetHidden(sheet,hidden); + } + /* * get the sheet's index * @param name sheet name diff --git a/src/java/org/apache/poi/hssf/util/AreaReference.java b/src/java/org/apache/poi/hssf/util/AreaReference.java index a881dbabb9..8169378e76 100644 --- a/src/java/org/apache/poi/hssf/util/AreaReference.java +++ b/src/java/org/apache/poi/hssf/util/AreaReference.java @@ -18,15 +18,24 @@ package org.apache.poi.hssf.util; +import java.util.ArrayList; +import java.util.StringTokenizer; + public class AreaReference { private CellReference [] cells; private int dim; - /** Create an area ref from a string representation + /** + * Create an area ref from a string representation. + * The area reference must be contiguous */ public AreaReference(String reference) { + if(! isContiguous(reference)) { + throw new IllegalArgumentException("References passed to the AreaReference must be contiguous, use generateContiguous(ref) if you have non-contiguous references"); + } + String[] refs = seperateAreaRefs(reference); dim = refs.length; cells = new CellReference[dim]; @@ -34,16 +43,73 @@ private int dim; cells[i]=new CellReference(refs[i]); } } + + /** + * Is the reference for a contiguous (i.e. + * unbroken) area, or is it made up of + * several different parts? + * (If it is, you will need to call + * .... + */ + public static boolean isContiguous(String reference) { + if(reference.indexOf(',') == -1) { + return true; + } + return false; + } + + /** + * Takes a non-contiguous area reference, and + * returns an array of contiguous area references. + */ + public static AreaReference[] generateContiguous(String reference) { + ArrayList refs = new ArrayList(); + StringTokenizer st = new StringTokenizer(reference, ","); + while(st.hasMoreTokens()) { + refs.add( + new AreaReference(st.nextToken()) + ); + } + return (AreaReference[])refs.toArray(new AreaReference[refs.size()]); + } + //not sure if we need to be flexible here! /** return the dimensions of this area **/ public int getDim() { return dim; } - /** return the cell references that define this area */ + /** + * Return the cell references that define this area + * (i.e. the two corners) + */ public CellReference[] getCells() { return cells; } + /** + * Returns a reference to every cell covered by this area + */ + public CellReference[] getAllReferencedCells() { + // Special case for single cell reference + if(cells.length == 1) { + return cells; + } + // Interpolate between the two + int minRow = Math.min(cells[0].getRow(), cells[1].getRow()); + int maxRow = Math.max(cells[0].getRow(), cells[1].getRow()); + int minCol = Math.min(cells[0].getCol(), cells[1].getCol()); + int maxCol = Math.max(cells[0].getCol(), cells[1].getCol()); + + ArrayList refs = new ArrayList(); + for(int row=minRow; row<=maxRow; row++) { + for(int col=minCol; col<=maxCol; col++) { + CellReference ref = new CellReference(row, col, cells[0].isRowAbsolute(), cells[0].isColAbsolute()); + ref.setSheetName(cells[0].getSheetName()); + refs.add(ref); + } + } + return (CellReference[])refs.toArray(new CellReference[refs.size()]); + } public String toString() { StringBuffer retval = new StringBuffer(); diff --git a/src/java/org/apache/poi/hssf/util/CellReference.java b/src/java/org/apache/poi/hssf/util/CellReference.java index 0bc1cee2e3..def58472a8 100644 --- a/src/java/org/apache/poi/hssf/util/CellReference.java +++ b/src/java/org/apache/poi/hssf/util/CellReference.java @@ -69,6 +69,10 @@ public class CellReference { public boolean isRowAbsolute(){return rowAbs;} public boolean isColAbsolute(){return colAbs;} public String getSheetName(){return sheetName;} + + protected void setSheetName(String sheetName) { + this.sheetName = sheetName; + } /** * takes in a column reference portion of a CellRef and converts it from diff --git a/src/java/org/apache/poi/poifs/common/POIFSConstants.java b/src/java/org/apache/poi/poifs/common/POIFSConstants.java index bc1bf6dad5..399f52be4b 100644 --- a/src/java/org/apache/poi/poifs/common/POIFSConstants.java +++ b/src/java/org/apache/poi/poifs/common/POIFSConstants.java @@ -31,4 +31,7 @@ public interface POIFSConstants public static final int END_OF_CHAIN = -2; public static final int PROPERTY_SIZE = 0x0080; public static final int UNUSED_BLOCK = -1; + + public static final byte[] OOXML_FILE_HEADER = + new byte[] { 0x50, 0x4b, 0x03, 0x04 }; } // end public interface POIFSConstants; diff --git a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java index 981c51d39a..771db767be 100644 --- a/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java +++ b/src/java/org/apache/poi/poifs/filesystem/POIFSFileSystem.java @@ -19,14 +19,19 @@ package org.apache.poi.poifs.filesystem; -import java.io.*; +import java.io.FileInputStream; +import java.io.FileOutputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.PushbackInputStream; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Iterator; +import java.util.List; -import java.util.*; - -import org.apache.poi.poifs.common.POIFSConstants; import org.apache.poi.poifs.dev.POIFSViewable; import org.apache.poi.poifs.property.DirectoryProperty; -import org.apache.poi.poifs.property.DocumentProperty; import org.apache.poi.poifs.property.Property; import org.apache.poi.poifs.property.PropertyTable; import org.apache.poi.poifs.storage.BATBlock; @@ -34,13 +39,14 @@ import org.apache.poi.poifs.storage.BlockAllocationTableReader; import org.apache.poi.poifs.storage.BlockAllocationTableWriter; import org.apache.poi.poifs.storage.BlockList; import org.apache.poi.poifs.storage.BlockWritable; +import org.apache.poi.poifs.storage.HeaderBlockConstants; import org.apache.poi.poifs.storage.HeaderBlockReader; import org.apache.poi.poifs.storage.HeaderBlockWriter; -import org.apache.poi.poifs.storage.RawDataBlock; import org.apache.poi.poifs.storage.RawDataBlockList; import org.apache.poi.poifs.storage.SmallBlockTableReader; import org.apache.poi.poifs.storage.SmallBlockTableWriter; -import org.apache.poi.poifs.storage.SmallDocumentBlock; +import org.apache.poi.util.IOUtils; +import org.apache.poi.util.LongField; /** * This is the main class of the POIFS system; it manages the entire @@ -106,6 +112,35 @@ public class POIFSFileSystem .getSBATStart()), data_blocks, properties.getRoot() .getChildren(), null); } + + /** + * Checks that the supplied InputStream (which MUST + * support mark and reset, or be a PushbackInputStream) + * has a POIFS (OLE2) header at the start of it. + * If your InputStream does not support mark / reset, + * then wrap it in a PushBackInputStream, then be + * sure to always use that, and not the original! + * @param inp An InputStream which supports either mark/reset, or is a PushbackInputStream + */ + public static boolean hasPOIFSHeader(InputStream inp) throws IOException { + // We want to peek at the first 8 bytes + inp.mark(8); + + byte[] header = new byte[8]; + IOUtils.readFully(inp, header); + LongField signature = new LongField(HeaderBlockConstants._signature_offset, header); + + // Wind back those 8 bytes + if(inp instanceof PushbackInputStream) { + PushbackInputStream pin = (PushbackInputStream)inp; + pin.unread(header); + } else { + inp.reset(); + } + + // Did it match the signature? + return (signature.get() == HeaderBlockConstants._signature); + } /** * Create a new document to be added to the root directory diff --git a/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java b/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java index 16c94e2c23..0d5bb817b4 100644 --- a/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java +++ b/src/java/org/apache/poi/poifs/storage/HeaderBlockReader.java @@ -91,8 +91,11 @@ public class HeaderBlockReader if (signature.get() != _signature) { // Is it one of the usual suspects? - if(_data[0] == 0x50 && _data[1] == 0x4b && _data[2] == 0x03 && - _data[3] == 0x04) { + byte[] OOXML_FILE_HEADER = POIFSConstants.OOXML_FILE_HEADER; + if(_data[0] == OOXML_FILE_HEADER[0] && + _data[1] == OOXML_FILE_HEADER[1] && + _data[2] == OOXML_FILE_HEADER[2] && + _data[3] == OOXML_FILE_HEADER[3]) { throw new OfficeXmlFileException("The supplied data appears to be in the Office 2007+ XML. POI only supports OLE2 Office documents"); } diff --git a/src/java/org/apache/poi/poifs/storage/RawDataBlock.java b/src/java/org/apache/poi/poifs/storage/RawDataBlock.java index 4403966343..d554298400 100644 --- a/src/java/org/apache/poi/poifs/storage/RawDataBlock.java +++ b/src/java/org/apache/poi/poifs/storage/RawDataBlock.java @@ -42,34 +42,44 @@ public class RawDataBlock * @param stream the InputStream from which the data will be read * * @exception IOException on I/O errors, and if an insufficient - * amount of data is read + * amount of data is read (the InputStream must + * be an exact multiple of the block size) */ - public RawDataBlock(final InputStream stream) - throws IOException - { - _data = new byte[ POIFSConstants.BIG_BLOCK_SIZE ]; + throws IOException { + this(stream, POIFSConstants.BIG_BLOCK_SIZE); + } + /** + * Constructor RawDataBlock + * + * @param stream the InputStream from which the data will be read + * @param blockSize the size of the POIFS blocks, normally 512 bytes {@link POIFSConstants#BIG_BLOCK_SIZE} + * + * @exception IOException on I/O errors, and if an insufficient + * amount of data is read (the InputStream must + * be an exact multiple of the block size) + */ + public RawDataBlock(final InputStream stream, int blockSize) + throws IOException { + _data = new byte[ blockSize ]; int count = IOUtils.readFully(stream, _data); - if (count == -1) - { + if (count == -1) { _eof = true; } - else if (count != POIFSConstants.BIG_BLOCK_SIZE) - { - if (count == -1) - //Cant have -1 bytes read in the error message! - count = 0; - + else if (count != blockSize) { + // IOUtils.readFully will always read the + // requested number of bytes, unless it hits + // an EOF + _eof = true; String type = " byte" + ((count == 1) ? ("") : ("s")); throw new IOException("Unable to read entire block; " + count - + type + " read; expected " - + POIFSConstants.BIG_BLOCK_SIZE + " bytes"); + + type + " read before EOF; expected " + + blockSize + " bytes"); } - else - { + else { _eof = false; } } @@ -82,7 +92,6 @@ public class RawDataBlock * * @exception IOException */ - public boolean eof() throws IOException { @@ -98,7 +107,6 @@ public class RawDataBlock * * @exception IOException if there is no data */ - public byte [] getData() throws IOException { diff --git a/src/java/org/apache/poi/util/IOUtils.java b/src/java/org/apache/poi/util/IOUtils.java index 42b69c850b..c3aa8695e2 100644 --- a/src/java/org/apache/poi/util/IOUtils.java +++ b/src/java/org/apache/poi/util/IOUtils.java @@ -58,11 +58,16 @@ public class IOUtils } /** - * Same as the normal in.read(b, off, len), but tries to ensure that - * the entire len number of bytes is read. + * Same as the normal in.read(b, off, len), but + * tries to ensure that the entire len number of bytes + * is read. *

- * If the end of file is reached before any bytes are read, returns -1. - * Otherwise, returns the number of bytes read. + * If the end of file is reached before any bytes + * are read, returns -1. + * If the end of the file is reached after some bytes are + * read, returns the number of bytes read. + * If the end of the file isn't reached before len + * bytes have been read, will return len bytes. */ public static int readFully(InputStream in, byte[] b, int off, int len) throws IOException @@ -79,5 +84,4 @@ public class IOUtils } } } -} - +} \ No newline at end of file diff --git a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java index 0fc6f5e847..f247227007 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java +++ b/src/scratchpad/src/org/apache/poi/hslf/extractor/PowerPointExtractor.java @@ -41,7 +41,9 @@ public class PowerPointExtractor extends POITextExtractor private HSLFSlideShow _hslfshow; private SlideShow _show; private Slide[] _slides; - private Notes[] _notes; + + private boolean slidesByDefault = true; + private boolean notesByDefault = false; /** * Basic extractor. Returns all the text, and optionally all the notes @@ -99,7 +101,6 @@ public class PowerPointExtractor extends POITextExtractor _hslfshow = ss; _show = new SlideShow(_hslfshow); _slides = _show.getSlides(); - _notes = _show.getNotes(); } /** @@ -110,23 +111,39 @@ public class PowerPointExtractor extends POITextExtractor _hslfshow = null; _show = null; _slides = null; - _notes = null; } + /** + * Should a call to getText() return slide text? + * Default is yes + */ + public void setSlidesByDefault(boolean slidesByDefault) { + this.slidesByDefault = slidesByDefault; + } + /** + * Should a call to getText() return notes text? + * Default is no + */ + public void setNotesByDefault(boolean notesByDefault) { + this.notesByDefault = notesByDefault; + } - /** - * Fetches all the slide text from the slideshow, but not the notes - */ - public String getText() { - return getText(true,false); - } + /** + * Fetches all the slide text from the slideshow, + * but not the notes, unless you've called + * setSlidesByDefault() and setNotesByDefault() + * to change this + */ + public String getText() { + return getText(slidesByDefault,notesByDefault); + } - /** - * Fetches all the notes text from the slideshow, but not the slide text - */ - public String getNotes() { - return getText(false,true); - } + /** + * Fetches all the notes text from the slideshow, but not the slide text + */ + public String getNotes() { + return getText(false,true); + } /** * Fetches text from the slideshow, be it slide text or note text. @@ -154,7 +171,7 @@ public class PowerPointExtractor extends POITextExtractor } } if(getNoteText) { - ret.append(" "); + ret.append("\n"); } } diff --git a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java b/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java index ca6e02d69b..586932e739 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/model/TextRun.java @@ -24,7 +24,12 @@ import java.util.LinkedList; import java.util.Vector; import org.apache.poi.hslf.model.textproperties.TextPropCollection; -import org.apache.poi.hslf.record.*; +import org.apache.poi.hslf.record.Record; +import org.apache.poi.hslf.record.RecordContainer; +import org.apache.poi.hslf.record.StyleTextPropAtom; +import org.apache.poi.hslf.record.TextBytesAtom; +import org.apache.poi.hslf.record.TextCharsAtom; +import org.apache.poi.hslf.record.TextHeaderAtom; import org.apache.poi.hslf.usermodel.RichTextRun; import org.apache.poi.hslf.usermodel.SlideShow; import org.apache.poi.util.StringUtil; @@ -252,9 +257,70 @@ public class TextRun // Update methods follow + + /** + * Adds the supplied text onto the end of the TextRun, + * creating a new RichTextRun (returned) for it to + * sit in. + * In many cases, before calling this, you'll want to add + * a newline onto the end of your last RichTextRun + */ + public RichTextRun appendText(String s) { + // We will need a StyleTextProp atom + ensureStyleAtomPresent(); + + // First up, append the text to the + // underlying text atom + int oldSize = getRawText().length(); + storeText( + getRawText() + s + ); + + // If either of the previous styles overran + // the text by one, we need to shuffle that + // extra character onto the new ones + int pOverRun = _styleAtom.getParagraphTextLengthCovered() - oldSize; + int cOverRun = _styleAtom.getCharacterTextLengthCovered() - oldSize; + if(pOverRun > 0) { + TextPropCollection tpc = (TextPropCollection) + _styleAtom.getParagraphStyles().getLast(); + tpc.updateTextSize( + tpc.getCharactersCovered() - pOverRun + ); + } + if(cOverRun > 0) { + TextPropCollection tpc = (TextPropCollection) + _styleAtom.getCharacterStyles().getLast(); + tpc.updateTextSize( + tpc.getCharactersCovered() - cOverRun + ); + } + + // Next, add the styles for its paragraph and characters + TextPropCollection newPTP = + _styleAtom.addParagraphTextPropCollection(s.length()+pOverRun); + TextPropCollection newCTP = + _styleAtom.addCharacterTextPropCollection(s.length()+cOverRun); + + // Now, create the new RichTextRun + RichTextRun nr = new RichTextRun( + this, oldSize, s.length(), + newPTP, newCTP, false, false + ); + + // Add the new RichTextRun onto our list + RichTextRun[] newRuns = new RichTextRun[_rtRuns.length+1]; + System.arraycopy(_rtRuns, 0, newRuns, 0, _rtRuns.length); + newRuns[newRuns.length-1] = nr; + _rtRuns = newRuns; + + // And return the new run to the caller + return nr; + } /** - * Saves the given string to the records. Doesn't touch the stylings. + * Saves the given string to the records. Doesn't + * touch the stylings. */ private void storeText(String s) { // Remove a single trailing \n, as there is an implicit one at the diff --git a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java index 32f8b2bd03..fdaa9eec2c 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java +++ b/src/scratchpad/src/org/apache/poi/hslf/record/StyleTextPropAtom.java @@ -19,17 +19,19 @@ package org.apache.poi.hslf.record; -import org.apache.poi.hslf.model.textproperties.*; -import org.apache.poi.util.LittleEndian; -import org.apache.poi.util.POILogger; - +import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.OutputStream; -import java.io.ByteArrayOutputStream; -import java.util.LinkedList; -import java.util.Vector; -import java.util.List; import java.util.Iterator; +import java.util.LinkedList; + +import org.apache.poi.hslf.model.textproperties.AlignmentTextProp; +import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; +import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; +import org.apache.poi.hslf.model.textproperties.TextProp; +import org.apache.poi.hslf.model.textproperties.TextPropCollection; +import org.apache.poi.util.LittleEndian; +import org.apache.poi.util.POILogger; /** * A StyleTextPropAtom (type 4001). Holds basic character properties @@ -88,6 +90,37 @@ public class StyleTextPropAtom extends RecordAtom * character stylings */ public void setCharacterStyles(LinkedList cs) { charStyles = cs; } + + /** + * Returns how many characters the paragraph's + * TextPropCollections cover. + * (May be one or two more than the underlying text does, + * due to having extra characters meaning something + * special to powerpoint) + */ + public int getParagraphTextLengthCovered() { + return getCharactersCovered(paragraphStyles); + } + /** + * Returns how many characters the character's + * TextPropCollections cover. + * (May be one or two more than the underlying text does, + * due to having extra characters meaning something + * special to powerpoint) + */ + public int getCharacterTextLengthCovered() { + return getCharactersCovered(charStyles); + } + private int getCharactersCovered(LinkedList styles) { + int length = 0; + Iterator it = styles.iterator(); + while(it.hasNext()) { + TextPropCollection tpc = + (TextPropCollection)it.next(); + length += tpc.getCharactersCovered(); + } + return length; + } /** All the different kinds of paragraph properties we might handle */ public static TextProp[] paragraphTextPropTypes = new TextProp[] { @@ -355,8 +388,7 @@ public class StyleTextPropAtom extends RecordAtom charStyles.add(tpc); return tpc; } - - + /* ************************************************************************ */ diff --git a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java b/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java index d16bf7bc02..fe03755079 100644 --- a/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java +++ b/src/scratchpad/src/org/apache/poi/hslf/usermodel/RichTextRun.java @@ -20,25 +20,28 @@ package org.apache.poi.hslf.usermodel; -import org.apache.poi.hslf.model.*; +import java.awt.Color; + +import org.apache.poi.hslf.model.MasterSheet; import org.apache.poi.hslf.model.Shape; -import org.apache.poi.hslf.model.textproperties.*; +import org.apache.poi.hslf.model.Sheet; +import org.apache.poi.hslf.model.TextRun; +import org.apache.poi.hslf.model.textproperties.BitMaskTextProp; +import org.apache.poi.hslf.model.textproperties.CharFlagsTextProp; +import org.apache.poi.hslf.model.textproperties.ParagraphFlagsTextProp; +import org.apache.poi.hslf.model.textproperties.TextProp; +import org.apache.poi.hslf.model.textproperties.TextPropCollection; import org.apache.poi.hslf.record.ColorSchemeAtom; -import org.apache.poi.hslf.exceptions.HSLFException; - -import java.awt.*; /** * Represents a run of text, all with the same style * - * TODO: get access to the font/character properties - * - * @author Nick Burch + * TODO: finish all the getters and setters to the + * font/character/paragraph properties (currently only + * has some of them) */ - -public class RichTextRun -{ +public class RichTextRun { /** The TextRun we belong to */ private TextRun parentRun; /** The SlideShow we belong to */ diff --git a/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java b/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java index 2a9fc6c64b..f60a6adaac 100644 --- a/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java +++ b/src/scratchpad/src/org/apache/poi/hssf/usermodel/HSSFFormulaEvaluator.java @@ -217,14 +217,66 @@ public class HSSFFormulaEvaluator { /** - * If cell contains formula, it evaluates the formula, and puts the - * formula result back into the cell. - * Else if cell does not contain formula, this method leaves the cell - * unchanged. Note that the same instance of HSSFCell is returned to + * If cell contains formula, it evaluates the formula, + * and saves the result of the formula. The cell + * remains as a formula cell. + * Else if cell does not contain formula, this method leaves + * the cell unchanged. + * Note that the type of the formula result is returned, + * so you know what kind of value is also stored with + * the formula. + *

+     * int evaluatedCellType = evaluator.evaluateFormulaCell(cell);
+     * 
+ * Be aware that your cell will hold both the formula, + * and the result. If you want the cell replaced with + * the result of the formula, use {@link #evaluateInCell(HSSFCell)} + * @param cell The cell to evaluate + * @return The type of the formula result (the cell's type remains as HSSFCell.CELL_TYPE_FORMULA however) + */ + public int evaluateFormulaCell(HSSFCell cell) { + if (cell != null) { + switch (cell.getCellType()) { + case HSSFCell.CELL_TYPE_FORMULA: + CellValue cv = getCellValueForEval(internalEvaluate(cell, row, sheet, workbook)); + switch (cv.getCellType()) { + case HSSFCell.CELL_TYPE_BOOLEAN: + cell.setCellValue(cv.getBooleanValue()); + break; + case HSSFCell.CELL_TYPE_ERROR: + cell.setCellValue(cv.getErrorValue()); + break; + case HSSFCell.CELL_TYPE_NUMERIC: + cell.setCellValue(cv.getNumberValue()); + break; + case HSSFCell.CELL_TYPE_STRING: + cell.setCellValue(cv.getRichTextStringValue()); + break; + case HSSFCell.CELL_TYPE_BLANK: + break; + case HSSFCell.CELL_TYPE_FORMULA: // this will never happen, we have already evaluated the formula + break; + } + return cv.getCellType(); + } + } + return -1; + } + + /** + * If cell contains formula, it evaluates the formula, and + * puts the formula result back into the cell, in place + * of the old formula. + * Else if cell does not contain formula, this method leaves + * the cell unchanged. + * Note that the same instance of HSSFCell is returned to * allow chained calls like: *
      * int evaluatedCellType = evaluator.evaluateInCell(cell).getCellType();
      * 
+ * Be aware that your cell value will be changed to hold the + * result of the formula. If you simply want the formula + * value computed for you, use {@link #evaluateFormulaCell(HSSFCell)} * @param cell */ public HSSFCell evaluateInCell(HSSFCell cell) { diff --git a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableRow.java b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableRow.java index ff9cf2b9c8..a88e32360e 100644 --- a/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableRow.java +++ b/src/scratchpad/src/org/apache/poi/hwpf/usermodel/TableRow.java @@ -58,7 +58,7 @@ public class TableRow p = getParagraph(end); s = p.text(); } - _cells[cellIndex] = new TableCell(start, end, this, levelNum, + _cells[cellIndex] = new TableCell(start, end+1, this, levelNum, _tprops.getRgtc()[cellIndex], _tprops.getRgdxaCenter()[cellIndex], _tprops.getRgdxaCenter()[cellIndex+1]-_tprops.getRgdxaCenter()[cellIndex]); diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.ppt b/src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.ppt new file mode 100755 index 0000000000000000000000000000000000000000..81b99e100f926c1cc3fde2e90aef8c5838aa791f GIT binary patch literal 124416 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 literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.pptx b/src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.pptx new file mode 100755 index 0000000000000000000000000000000000000000..e5237f4c15dd7adf33bd79a7416f54c9ca6751ef GIT binary patch literal 48008 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

pxmSUp}CYP+P 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 literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.txt b/src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.txt new file mode 100644 index 0000000000..ccfe4d2714 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hslf/data/SampleShow.txt @@ -0,0 +1,26 @@ +Author = Nick Burch +Title = SlideShow Sample +Subject = A sample slideshow +Keywords = Sample Testing +Comments = This is a sample slideshow, for use with testing etc + +(Slide 1) +Title of the first slide + +Subtitle of the first slide + +This bit is in italic green + +(Notes 1) +I am the notes of the first slide + +(Slide 2) +This is the second slide + +* It has bullet points on it +* They’re fun, aren’t they? +* Especially in a different font like Arial Black at 16 point! + +(Notes 2) +These are the notes of the 2nd slide +THIS LINE IS BOLD diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java index e0e0318e77..f8618ff0bd 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/extractor/TextExtractor.java @@ -72,6 +72,29 @@ public class TextExtractor extends TestCase { ensureTwoStringsTheSame(expectText, notesText); } + + public void testReadBoth() throws Exception { + String[] slText = new String[] { + "This is a test title\nThis is a test subtitle\nThis is on page 1\n", + "This is the title on page 2\nThis is page two\nIt has several blocks of text\nNone of them have formatting\n" + }; + String[] ntText = new String[] { + "These are the notes for page 1\n", + "These are the notes on page two, again lacking formatting\n" + }; + + ppe.setSlidesByDefault(true); + ppe.setNotesByDefault(false); + assertEquals(slText[0]+slText[1], ppe.getText()); + + ppe.setSlidesByDefault(false); + ppe.setNotesByDefault(true); + assertEquals(ntText[0]+ntText[1], ppe.getText()); + + ppe.setSlidesByDefault(true); + ppe.setNotesByDefault(true); + assertEquals(slText[0]+slText[1]+"\n"+ntText[0]+ntText[1], ppe.getText()); + } /** * Test that when presented with a PPT file missing the odd diff --git a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java index 7561a5fe56..0fecdab97b 100644 --- a/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java +++ b/src/scratchpad/testcases/org/apache/poi/hslf/usermodel/TestRichTextRun.java @@ -16,16 +16,22 @@ */ package org.apache.poi.hslf.usermodel; -import java.io.*; -import java.awt.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; + +import junit.framework.TestCase; import org.apache.poi.hslf.HSLFSlideShow; -import org.apache.poi.hslf.model.*; +import org.apache.poi.hslf.model.Slide; +import org.apache.poi.hslf.model.SlideMaster; +import org.apache.poi.hslf.model.TextBox; +import org.apache.poi.hslf.model.TextRun; import org.apache.poi.hslf.record.Record; import org.apache.poi.hslf.record.SlideListWithText; -import junit.framework.TestCase; - /** * Test that the friendly getters and setters on RichTextRun * behave as expected. @@ -549,4 +555,75 @@ if(false) { assertEquals(0, rt.getBulletOffset()); assertEquals('\u263A', rt.getBulletChar()); } + + public void testAddText() throws Exception { + FileInputStream is = new FileInputStream(new File(System.getProperty("HSLF.testdata.path"), "bullets.ppt")); + SlideShow ppt = new SlideShow(is); + is.close(); + assertTrue("No Exceptions while reading file", true); + + RichTextRun rt; + TextRun[] txt; + Slide[] slides = ppt.getSlides(); + + assertEquals(2, slides.length); + txt = slides[0].getTextRuns(); + assertEquals(2, txt.length); + + assertEquals("Title text", txt[0].getRawText()); + assertEquals(1, txt[0].getRichTextRuns().length); + rt = txt[0].getRichTextRuns()[0]; + assertFalse(rt.isBullet()); + + // Add some new text + txt[0].appendText("Foo! I'm new!"); + assertEquals(2, txt[0].getRichTextRuns().length); + + rt = txt[0].getRichTextRuns()[0]; + assertFalse(rt.isBold()); + assertEquals("Title text", rt.getText()); + rt = txt[0].getRichTextRuns()[1]; + assertFalse(rt.isBold()); + assertEquals("Foo! I'm new!", rt.getText()); + rt.setBold(true); + + // And some more + txt[0].appendText("Me too!"); + assertEquals(3, txt[0].getRichTextRuns().length); + rt = txt[0].getRichTextRuns()[0]; + assertFalse(rt.isBold()); + assertEquals("Title text", rt.getText()); + rt = txt[0].getRichTextRuns()[1]; + assertTrue(rt.isBold()); + assertEquals("Foo! I'm new!", rt.getText()); + rt = txt[0].getRichTextRuns()[2]; + assertFalse(rt.isBold()); + assertEquals("Me too!", rt.getText()); + + // Save and re-open + ByteArrayOutputStream out = new ByteArrayOutputStream(); + ppt.write(out); + out.close(); + + ppt = new SlideShow(new ByteArrayInputStream(out.toByteArray())); + slides = ppt.getSlides(); + + assertEquals(2, slides.length); + + txt = slides[0].getTextRuns(); + assertEquals(2, txt.length); + assertEquals(3, txt[0].getRichTextRuns().length); + rt = txt[0].getRichTextRuns()[0]; + assertFalse(rt.isBold()); + assertEquals("Title text", rt.getText()); + rt = txt[0].getRichTextRuns()[1]; + assertTrue(rt.isBold()); + assertEquals("Foo! I'm new!", rt.getText()); + rt = txt[0].getRichTextRuns()[2]; + assertFalse(rt.isBold()); + assertEquals("Me too!", rt.getText()); + +// FileOutputStream fout = new FileOutputStream("/tmp/foo.ppt"); +// ppt.write(fout); + } } diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/data/42464-ExpPtg-bad.xls b/src/scratchpad/testcases/org/apache/poi/hssf/data/42464-ExpPtg-bad.xls new file mode 100644 index 0000000000000000000000000000000000000000..54a7edb404f7d5a106a264819f5873d6fdc2cfcb GIT binary patch literal 141824 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 literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/data/42464-ExpPtg-ok.xls b/src/scratchpad/testcases/org/apache/poi/hssf/data/42464-ExpPtg-ok.xls new file mode 100644 index 0000000000000000000000000000000000000000..5ae84bc90e26fa9914ebc887b39ea7b6fd38677a GIT binary patch literal 143872 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̼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 SENDq0IR3$j^8XJUBdKiw literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/model/TestFormulaParserSP.java b/src/scratchpad/testcases/org/apache/poi/hssf/model/TestFormulaParserSP.java new file mode 100644 index 0000000000..aa73714a0f --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hssf/model/TestFormulaParserSP.java @@ -0,0 +1,83 @@ + +/* ==================================================================== + 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.hssf.model; + +import junit.framework.TestCase; + +import org.apache.poi.hssf.record.formula.FuncVarPtg; +import org.apache.poi.hssf.record.formula.NamePtg; +import org.apache.poi.hssf.record.formula.Ptg; +import org.apache.poi.hssf.usermodel.HSSFFormulaEvaluator; +import org.apache.poi.hssf.usermodel.HSSFName; +import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.HSSFWorkbook; + +/** + * Test the low level formula parser functionality, + * but using parts which need to use the + * HSSFFormulaEvaluator, which is in scratchpad + */ +public class TestFormulaParserSP extends TestCase { + + public TestFormulaParserSP(String name) { + super(name); + } + + public void testWithNamedRange() throws Exception { + HSSFWorkbook workbook = new HSSFWorkbook(); + FormulaParser fp; + Ptg[] ptgs; + + HSSFSheet s = workbook.createSheet("Foo"); + s.createRow(0).createCell((short)0).setCellValue(1.1); + s.createRow(1).createCell((short)0).setCellValue(2.3); + s.createRow(2).createCell((short)2).setCellValue(3.1); + + HSSFName name = workbook.createName(); + name.setNameName("testName"); + name.setReference("A1:A2"); + + fp = HSSFFormulaEvaluator.getUnderlyingParser(workbook, "SUM(testName)"); + fp.parse(); + ptgs = fp.getRPNPtg(); + assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2); + assertEquals(NamePtg.class, ptgs[0].getClass()); + assertEquals(FuncVarPtg.class, ptgs[1].getClass()); + + // Now make it a single cell + name.setReference("C3"); + + fp = HSSFFormulaEvaluator.getUnderlyingParser(workbook, "SUM(testName)"); + fp.parse(); + ptgs = fp.getRPNPtg(); + assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2); + assertEquals(NamePtg.class, ptgs[0].getClass()); + assertEquals(FuncVarPtg.class, ptgs[1].getClass()); + + // And make it non-contiguous + name.setReference("A1:A2,C3"); + fp = HSSFFormulaEvaluator.getUnderlyingParser(workbook, "SUM(testName)"); + fp.parse(); + ptgs = fp.getRPNPtg(); + assertTrue("two tokens expected, got "+ptgs.length,ptgs.length == 2); + assertEquals(NamePtg.class, ptgs[0].getClass()); + assertEquals(FuncVarPtg.class, ptgs[1].getClass()); + } + +} diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java new file mode 100644 index 0000000000..3b31cc03a3 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestBug42464.java @@ -0,0 +1,93 @@ +/* ==================================================================== + 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.hssf.usermodel; + +import java.io.File; +import java.io.FileInputStream; +import java.util.Iterator; +import java.util.List; + +import org.apache.poi.hssf.record.FormulaRecord; +import org.apache.poi.hssf.record.aggregates.FormulaRecordAggregate; +import org.apache.poi.hssf.record.formula.ExpPtg; +import org.apache.poi.hssf.util.CellReference; + +import junit.framework.TestCase; + +public class TestBug42464 extends TestCase { + String dirname; + + protected void setUp() throws Exception { + super.setUp(); + dirname = System.getProperty("HSSF.testdata.path"); + } + + public void testOKFile() throws Exception { + HSSFWorkbook wb = new HSSFWorkbook( + new FileInputStream(new File(dirname,"42464-ExpPtg-ok.xls")) + ); + process(wb); + } + public void testExpSharedBadFile() throws Exception { + HSSFWorkbook wb = new HSSFWorkbook( + new FileInputStream(new File(dirname,"42464-ExpPtg-bad.xls")) + ); + process(wb); + } + + protected void process(HSSFWorkbook wb) { + for(int i=0; i " + cell.getCellFormula()); + } + + eval.evaluate(cell); + + } + } + } +} diff --git a/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorDocs.java b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorDocs.java new file mode 100644 index 0000000000..cd2acc7ea9 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hssf/usermodel/TestFormulaEvaluatorDocs.java @@ -0,0 +1,117 @@ +package org.apache.poi.hssf.usermodel; + +import java.util.Iterator; + +import junit.framework.TestCase; + +/** + * Tests to show that our documentation at + * http://poi.apache.org/hssf/eval.html + * all actually works as we'd expect them to + */ +public class TestFormulaEvaluatorDocs extends TestCase { + protected void setUp() throws Exception { + super.setUp(); + } + + /** + * http://poi.apache.org/hssf/eval.html#EvaluateAll + */ + public void testEvaluateAll() throws Exception { + HSSFWorkbook wb = new HSSFWorkbook(); + HSSFSheet s1 = wb.createSheet(); + HSSFSheet s2 = wb.createSheet(); + wb.setSheetName(0, "S1"); + wb.setSheetName(1, "S2"); + + HSSFRow s1r1 = s1.createRow(0); + HSSFRow s1r2 = s1.createRow(1); + HSSFRow s2r1 = s2.createRow(0); + + HSSFCell s1r1c1 = s1r1.createCell((short)0); + HSSFCell s1r1c2 = s1r1.createCell((short)1); + HSSFCell s1r1c3 = s1r1.createCell((short)2); + s1r1c1.setCellValue(22.3); + s1r1c2.setCellValue(33.4); + s1r1c3.setCellFormula("SUM(A1:B1)"); + + HSSFCell s1r2c1 = s1r2.createCell((short)0); + HSSFCell s1r2c2 = s1r2.createCell((short)1); + HSSFCell s1r2c3 = s1r2.createCell((short)2); + s1r2c1.setCellValue(-1.2); + s1r2c2.setCellValue(-3.4); + s1r2c3.setCellFormula("SUM(A2:B2)"); + + HSSFCell s2r1c1 = s2r1.createCell((short)0); + s2r1c1.setCellFormula("S1!A1"); + + // Not evaluated yet + assertEquals(0.0, s1r1c3.getNumericCellValue(), 0); + assertEquals(0.0, s1r2c3.getNumericCellValue(), 0); + assertEquals(0.0, s2r1c1.getNumericCellValue(), 0); + + // Do a full evaluate, as per our docs + // uses evaluateFormulaCell() + for(int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) { + HSSFSheet sheet = wb.getSheetAt(sheetNum); + HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb); + + for(Iterator rit = sheet.rowIterator(); rit.hasNext();) { + HSSFRow r = (HSSFRow)rit.next(); + evaluator.setCurrentRow(r); + + for(Iterator cit = r.cellIterator(); cit.hasNext();) { + HSSFCell c = (HSSFCell)cit.next(); + if(c.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { + evaluator.evaluateFormulaCell(c); + + // For testing - all should be numeric + assertEquals(HSSFCell.CELL_TYPE_NUMERIC, evaluator.evaluateFormulaCell(c)); + } + } + } + } + + // Check now as expected + assertEquals(55.7, wb.getSheetAt(0).getRow(0).getCell((short)2).getNumericCellValue(), 0); + assertEquals("SUM(A1:B1)", wb.getSheetAt(0).getRow(0).getCell((short)2).getCellFormula()); + assertEquals(HSSFCell.CELL_TYPE_FORMULA, wb.getSheetAt(0).getRow(0).getCell((short)2).getCellType()); + + assertEquals(-4.6, wb.getSheetAt(0).getRow(1).getCell((short)2).getNumericCellValue(), 0); + assertEquals("SUM(A2:B2)", wb.getSheetAt(0).getRow(1).getCell((short)2).getCellFormula()); + assertEquals(HSSFCell.CELL_TYPE_FORMULA, wb.getSheetAt(0).getRow(1).getCell((short)2).getCellType()); + + assertEquals(22.3, wb.getSheetAt(1).getRow(0).getCell((short)0).getNumericCellValue(), 0); + assertEquals("S1!A1", wb.getSheetAt(1).getRow(0).getCell((short)0).getCellFormula()); + assertEquals(HSSFCell.CELL_TYPE_FORMULA, wb.getSheetAt(1).getRow(0).getCell((short)0).getCellType()); + + + // Now do the alternate call, which zaps the formulas + // uses evaluateInCell() + for(int sheetNum = 0; sheetNum < wb.getNumberOfSheets(); sheetNum++) { + HSSFSheet sheet = wb.getSheetAt(sheetNum); + HSSFFormulaEvaluator evaluator = new HSSFFormulaEvaluator(sheet, wb); + + for(Iterator rit = sheet.rowIterator(); rit.hasNext();) { + HSSFRow r = (HSSFRow)rit.next(); + evaluator.setCurrentRow(r); + + for(Iterator cit = r.cellIterator(); cit.hasNext();) { + HSSFCell c = (HSSFCell)cit.next(); + if(c.getCellType() == HSSFCell.CELL_TYPE_FORMULA) { + evaluator.evaluateInCell(c); + } + } + } + } + + assertEquals(55.7, wb.getSheetAt(0).getRow(0).getCell((short)2).getNumericCellValue(), 0); + assertEquals(HSSFCell.CELL_TYPE_NUMERIC, wb.getSheetAt(0).getRow(0).getCell((short)2).getCellType()); + + assertEquals(-4.6, wb.getSheetAt(0).getRow(1).getCell((short)2).getNumericCellValue(), 0); + assertEquals(HSSFCell.CELL_TYPE_NUMERIC, wb.getSheetAt(0).getRow(1).getCell((short)2).getCellType()); + + assertEquals(22.3, wb.getSheetAt(1).getRow(0).getCell((short)0).getNumericCellValue(), 0); + assertEquals(HSSFCell.CELL_TYPE_NUMERIC, wb.getSheetAt(1).getRow(0).getCell((short)0).getCellType()); + } +} diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/Bug44292.doc b/src/scratchpad/testcases/org/apache/poi/hwpf/data/Bug44292.doc new file mode 100644 index 0000000000000000000000000000000000000000..fd7ca6cc3e444b2aea9882c20585676f9dd5fba3 GIT binary patch literal 24064 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 A6aWAK literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.docx b/src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.docx new file mode 100755 index 0000000000000000000000000000000000000000..a43c77ae236716a4cc5e4b22ea486a00cc81fbd6 GIT binary patch literal 11611 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 HeE;-6N56k5 literal 0 HcmV?d00001 diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.txt b/src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.txt new file mode 100644 index 0000000000..6b5fd46554 --- /dev/null +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/data/SampleDoc.txt @@ -0,0 +1,14 @@ +Author = Nick Burch +Title = Test Document +Subject = This is a sample document +Keywords = Testing Sample +Comments = This document is used for testing text and metadata extraction + + +I am a test document +This is page 1 +I am Calibri (Body) in font size 11 +  +This is page two +It’s Arial Black in 16 point +It’s also in blue diff --git a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java index 8e7f47ed96..e82c4d1304 100644 --- a/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java +++ b/src/scratchpad/testcases/org/apache/poi/hwpf/usermodel/TestProblems.java @@ -74,4 +74,34 @@ public class TestProblems extends TestCase { } } } + + /** + * Test for TableCell not skipping the last paragraph + */ + public void testTableCellLastParagraph() throws Exception { + HWPFDocument doc = new HWPFDocument(new FileInputStream(dirname + "/Bug44292.doc")); + Range r = doc.getRange(); + + //get the table + Paragraph p = r.getParagraph(0); + Table t = r.getTable(p); + + //get the only row + TableRow row = t.getRow(0); + + //get the first cell + TableCell cell = row.getCell(0); + // First cell should have one paragraph + assertEquals(1, cell.numParagraphs()); + + //get the second + cell = row.getCell(1); + // Second cell should be detected as having two paragraphs + assertEquals(2, cell.numParagraphs()); + + //get the last cell + cell = row.getCell(2); + // Last cell should have one paragraph + assertEquals(1, cell.numParagraphs()); + } } diff --git a/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java b/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java index 04bbe47bbd..7c139827b6 100644 --- a/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java +++ b/src/testcases/org/apache/poi/ddf/TestEscherContainerRecord.java @@ -82,21 +82,45 @@ public class TestEscherContainerRecord extends TestCase r2.setOptions( (short) 0x9876 ); r2.setRecordId( EscherOptRecord.RECORD_ID ); + String expected; r.addChildRecord( r2 ); - String expected = "org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl + - " isContainer: true" + nl + - " options: 0x000F" + nl + - " recordId: 0xF004" + nl + - " numchildren: 1" + nl + - " children: " + nl + - "org.apache.poi.ddf.EscherOptRecord:" + nl + - " isContainer: false" + nl + - " options: 0x0003" + nl + - " recordId: 0xF00B" + nl + - " numchildren: 0" + nl + - " properties:" + nl; + expected = "org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl + + " isContainer: true" + nl + + " options: 0x000F" + nl + + " recordId: 0xF004" + nl + + " numchildren: 1" + nl + + " children: " + nl + + " Child 0:" + nl + + "org.apache.poi.ddf.EscherOptRecord:" + nl + + " isContainer: false" + nl + + " options: 0x0003" + nl + + " recordId: 0xF00B" + nl + + " numchildren: 0" + nl + + " properties:" + nl; assertEquals( expected, r.toString() ); + r.addChildRecord( r2 ); + expected = "org.apache.poi.ddf.EscherContainerRecord (SpContainer):" + nl + + " isContainer: true" + nl + + " options: 0x000F" + nl + + " recordId: 0xF004" + nl + + " numchildren: 2" + nl + + " children: " + nl + + " Child 0:" + nl + + "org.apache.poi.ddf.EscherOptRecord:" + nl + + " isContainer: false" + nl + + " options: 0x0003" + nl + + " recordId: 0xF00B" + nl + + " numchildren: 0" + nl + + " properties:" + nl + + " Child 1:" + nl + + "org.apache.poi.ddf.EscherOptRecord:" + nl + + " isContainer: false" + nl + + " options: 0x0003" + nl + + " recordId: 0xF00B" + nl + + " numchildren: 0" + nl + + " properties:" + nl; + assertEquals( expected, r.toString() ); } public void testGetRecordSize() throws Exception diff --git a/src/testcases/org/apache/poi/hssf/HSSFTests.java b/src/testcases/org/apache/poi/hssf/HSSFTests.java index c26ba9beb3..1bc9df1798 100644 --- a/src/testcases/org/apache/poi/hssf/HSSFTests.java +++ b/src/testcases/org/apache/poi/hssf/HSSFTests.java @@ -23,8 +23,8 @@ import junit.framework.TestSuite; import org.apache.poi.hssf.eventmodel.TestEventRecordFactory; import org.apache.poi.hssf.eventmodel.TestModelFactory; -import org.apache.poi.hssf.model.TestFormulaParser; import org.apache.poi.hssf.model.TestDrawingManager; +import org.apache.poi.hssf.model.TestFormulaParser; import org.apache.poi.hssf.model.TestSheet; import org.apache.poi.hssf.record.TestAreaFormatRecord; import org.apache.poi.hssf.record.TestAreaRecord; @@ -91,6 +91,7 @@ import org.apache.poi.hssf.usermodel.TestFontDetails; import org.apache.poi.hssf.usermodel.TestFormulas; import org.apache.poi.hssf.usermodel.TestHSSFCell; import org.apache.poi.hssf.usermodel.TestHSSFClientAnchor; +import org.apache.poi.hssf.usermodel.TestHSSFComment; import org.apache.poi.hssf.usermodel.TestHSSFDateUtil; import org.apache.poi.hssf.usermodel.TestHSSFHeaderFooter; import org.apache.poi.hssf.usermodel.TestHSSFPalette; @@ -110,7 +111,6 @@ import org.apache.poi.hssf.util.TestCellReference; import org.apache.poi.hssf.util.TestRKUtil; import org.apache.poi.hssf.util.TestRangeAddress; import org.apache.poi.hssf.util.TestSheetReferences; -import org.apache.poi.hssf.usermodel.TestHSSFComment; /** * Test Suite for running just HSSF tests. Mostly diff --git a/src/testcases/org/apache/poi/hssf/data/37684-1.xls b/src/testcases/org/apache/poi/hssf/data/37684-1.xls new file mode 100755 index 0000000000000000000000000000000000000000..a59769eb39c37bf489de8c1bba0d89882c2c120e GIT binary patch literal 32768 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 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/37684-2.xls b/src/testcases/org/apache/poi/hssf/data/37684-2.xls new file mode 100755 index 0000000000000000000000000000000000000000..b17d0fa2271f9033a8252641b78ea4103cf0c32a GIT binary patch literal 82944 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 H)${)s^TT7f literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/42464-ExpPtg-bad.xls b/src/testcases/org/apache/poi/hssf/data/42464-ExpPtg-bad.xls new file mode 100644 index 0000000000000000000000000000000000000000..54a7edb404f7d5a106a264819f5873d6fdc2cfcb GIT binary patch literal 141824 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 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/42464-ExpPtg-ok.xls b/src/testcases/org/apache/poi/hssf/data/42464-ExpPtg-ok.xls new file mode 100644 index 0000000000000000000000000000000000000000..5ae84bc90e26fa9914ebc887b39ea7b6fd38677a GIT binary patch literal 143872 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̼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 SENDq0IR3$j^8XJUBdKiw literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/43493.xls b/src/testcases/org/apache/poi/hssf/data/43493.xls new file mode 100644 index 0000000000000000000000000000000000000000..2a02f3d740883b9ee64c9598fb4a7c09cd4a68d4 GIT binary patch literal 66048 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 MiTKd|ci$2GFNj&xfB*mh literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/43902.xls b/src/testcases/org/apache/poi/hssf/data/43902.xls new file mode 100644 index 0000000000000000000000000000000000000000..a67720d6c410ef5e16a2fbad1199d270d16a431c GIT binary patch literal 83456 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 Nvs1HK$~US1{{bv%){y`J literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/44010-SingleChart.xls b/src/testcases/org/apache/poi/hssf/data/44010-SingleChart.xls new file mode 100644 index 0000000000000000000000000000000000000000..fe0df2750aefb02c54687230f004b08a9a6facd1 GIT binary patch literal 28672 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 Jnx6&te*q!-9Wwv` literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/44010-TwoCharts.xls b/src/testcases/org/apache/poi/hssf/data/44010-TwoCharts.xls new file mode 100644 index 0000000000000000000000000000000000000000..4a61523fe0f44a0c159a1b80168dd6ad9d8c8ce3 GIT binary patch literal 29696 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 BXdM6m literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/44167.xls b/src/testcases/org/apache/poi/hssf/data/44167.xls new file mode 100755 index 0000000000000000000000000000000000000000..c5470210d8510a4162cc6e55f8ea97e231baab6d GIT binary patch literal 14336 zcmeHOU2Kz87=FL5-MS6dZetsuE6o-I><70o1vAG68D=1Z2^bf}jIAqSVQ$)$1QUZr z;l`lBc%d;Q!lluG#zb$7*$fwWK_nPr{D};M-Wj72BgvpX&-?Y;zK(Vd6#;Wj^Pcy7 z&-r`LbN;?_+MfNqc;fi`i!aIyw?=a0S~6d9UATqtV&^$1h)*W@=;%cV12XOoVj$m- zj?DGRxg}@vJ{vq^uwRsW=>{aF20DUk{5aVc#7sbMur5ajLgv}?MT)vr>&2)-pB zX`ZhYX~YOWjr7Uqk8rq){O+^XN=yc&Pln{?#vVg;+3H<5!z!<}U7|87aS3@>icc!U zs*-oZRp_j+R7)MCS{kGU&-IciCgg3!#D08dh1(uxWdG%>Z^eE*0=Z8hr9>SH*01$(r%AkReJZOo9a%-)YIL}bhg25 z(x!&CsP7ovEVXj4%jgviX?EL>Dbw599OEZs0cV6P<#B-^}gouN-&X=q%Kb6 zsxC?RR7*lsmnOWb7bNnMJ1zF^AqmR zP$Z!Z!z0{1=q>CsasV;oUe-mEUeweF)$fuLBqntS>9aVx6+&wxWJKK0D{zL*(4Y_(Chtwv?ZNR{Byiw$1^l z%j7EBl#iC_b|l1Uw~ZGl&KXIZw%d52;#}m2(|#N03La2Sh_ekg&J8Mn{mo9#c9dyO zT5qS|svqF?q&Qn(<3YuBhenBPg^hEc3t+t!`BKVdKTJG^UDEj!XlRY6L_X9*eml}R zt`a5W*qe+84TotS-8MZx3- zNBYE}w|>2{Wq0tMSN&4E^nrWTME66J`++}_u)o-od8vH7gP{FuWBt*=_-OyorFc9V z)9QJxz-V4)tcwo!4G+ho;dRkibTG0zYG2+W#yG=(VZbn87%&VN1`Gp+0mFb{z%XDK zFbv!w4DcM!GdK^tJWKPC%%21CJAQtr&;R!Dr#?J;^UTikJAbIlb2HEQjOQVl=X~e4 zq&(~MK42k)@mC?##@&7lY?Tpw_`BZqG7KG)XVGhOcjfr?h|?;Lqp+Vo{TO11x{upYH$sXxfJN7v6oHhOdG*v(Cm}|y|Ie6iGvQ75NQ~300+c$uP yU1}4NIR5uD0wlXzhWa^&IDh6^Kkut_@<92d12sg{hN$+yjoGvMZ?wPIRsWxC&9B!0 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/44200.xls b/src/testcases/org/apache/poi/hssf/data/44200.xls new file mode 100755 index 0000000000000000000000000000000000000000..691afedb806ec66c4667f4640fb7a2ac417bd83d GIT binary patch literal 13824 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 AnE(I) literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/Booleans.xlsx b/src/testcases/org/apache/poi/hssf/data/Booleans.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..7528346119cd22cabc37f5bc3ab840f22bbd3762 GIT binary patch literal 8612 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 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/ForShifting.xls b/src/testcases/org/apache/poi/hssf/data/ForShifting.xls new file mode 100755 index 0000000000000000000000000000000000000000..13e5920e521391ba54beefba8e5788f569f55bf3 GIT binary patch literal 18432 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 R*1-uV_&WZd?f+N;{{@g~L5lzY literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/SampleSS.txt b/src/testcases/org/apache/poi/hssf/data/SampleSS.txt new file mode 100644 index 0000000000..b1dc6b63b5 --- /dev/null +++ b/src/testcases/org/apache/poi/hssf/data/SampleSS.txt @@ -0,0 +1,21 @@ +Author = Nick Burch +Title = Sample Spreadsheet +Subject = Spreadsheet for testing +Keywords = Testing Sample Formulas +Comments = This is a sample spreadsheet, for use when testing things + +(First Sheet) +Test spreadsheet +2nd row 2nd row 2nd column + +This one is red + +(Sheet Number 2) +Start of 2nd sheet +Sheet 2 row 2 + +I'm in bold blue, on a yellow background + +cb=1 cb=10 cb=2 cb=sum +1 10 2 =SUM(A7:C7) + diff --git a/src/testcases/org/apache/poi/hssf/data/SampleSS.xls b/src/testcases/org/apache/poi/hssf/data/SampleSS.xls new file mode 100755 index 0000000000000000000000000000000000000000..771aacf9145fa2a92263bb9ffc6b96712b7dfae8 GIT binary patch literal 17408 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 CR+ZBL literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/SharedFormulaTest.xls b/src/testcases/org/apache/poi/hssf/data/SharedFormulaTest.xls new file mode 100644 index 0000000000000000000000000000000000000000..8db77d98240c13b88bcf3ab6cd50ef5cc5084bb2 GIT binary patch literal 31232 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 E0;8K#+yDRo literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/UncalcedRecord.xls b/src/testcases/org/apache/poi/hssf/data/UncalcedRecord.xls new file mode 100644 index 0000000000000000000000000000000000000000..f1a0396c0047a2514a2209039980fe738a392f38 GIT binary patch literal 18432 zcmeHPU2GIp6h1SZ-EL_M{S&0nWx5Sf+Ae9?h>%LVMM@;0LJ9_AAxmkyp<%UJz-UZl zQF+j4f|8({kQfqQh(<9Q^})og@qvdDjgf%*VEK7B8ce_x*6*Cz>FiE-mzH0_d#C6A zoO|v)XTF)8neWbSfBd0x{Mcu;=g5`XsfeznO30g`*HEvw+ZBZVREnE+X`&95O7{=~ zB|aQTuZL<{PZf`bQN=+%M>?G_Mv)Vphis$g2v!?nLoW;sj+pDaHukK0^6@V7cBa)5 zL!YLTMoGl9O7o(oK(wmNZ$ouH}PO|ZAvT(R; z_t^R+dGyVB^o@D+B~$c=b%QG6MJX;T<6bGN;)ayf@nR_{PEyvyJ*gcUAH{>X;(LoZ zN-wP)+&2_!WzA+^hGrRSdP_1ip|{Au^GZF9YCZ_jjvmdAg_t_>yjVCb%ZT6+1Q%s&AP`XuDR>klP8fO_b6aG?U1*WYHOzt(4w&y^6k+C%~|6jj|5AUBvfd z#)UUs{{usa9);vblcRA`8IIIlLy|+*Z3OMojieK+z#z@AqqJbK+6+3UnZr;GyzUwd z60^Pgc6rNT5HBiI2q**;0t$iu7y>0eJkoeP^!+2Jiq9doQMs>wi&_$L9wO}jj&gs~ z>;)H=n<_5@Tr_r~o{#q54Arl3Q~l17p}trvD9B0dc*YXI4e9+xEmQi2=7xrrZDt@I zXxkQa8h&FD9-0<9iniXK!GZ1BCMI)pFRbc!iL9D4L?s*ckM%W=TMzm_C}IBS(%93@DUkvrrHg~nlTMoe_M5>|?PzWdl6aor? z`vQS$c!KrFJC^L-VPZ6X@PoguY}i%t(K|kBdg$|CTA=$H!VjO^ABGr^Cm{U%IRN4J z?r{h|DZLLVhkOXBhMa&fX}X9(ew6&q!@aNo)ph%r%5@L*j|}e_j_x(PUhE%?Nh}oH zf4p?dNiB^2_}N|EWvKI;5S0`H3ITy)5Kssx1QY@a0fm4y)5Kssx1QY`Qdj$ABKGSIC$#^Y~FRWYqp7}TbUkCm{ zC4UK!`8{)a=JotbL+1V5Ux||6`7;H#f5SKz^?4BPpO3N@vH-FWQU_tm&fnhT{;QBc zx{j(!cNl>l8pgJlOzNU%QI60{I2zMWbMfsFJ7hkGDtvr45x#>fX{}Xc=X~64&1&(# z+iuRdoJIPie~x216Y%;|`u6~|1^!29H|@N^IPf1RH2w_P7)-~%*ziIbl7}|YK6(aQ zpJ2ZZMi>2JnB7cPH(i Ut2di$?5Df`H|x(m{$BR~FUIE`6aWAK literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/WithChart.xls b/src/testcases/org/apache/poi/hssf/data/WithChart.xls new file mode 100755 index 0000000000000000000000000000000000000000..624b7672892eca33d042e7cc034fa388517db433 GIT binary patch literal 20992 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 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java b/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java index 2d1a25c067..9e6b53e9af 100644 --- a/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java +++ b/src/testcases/org/apache/poi/hssf/model/TestFormulaParser.java @@ -45,7 +45,9 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; /** * Test the low level formula parser functionality. High level tests are to - * be done via usermodel/HSSFCell.setFormulaValue() . + * be done via usermodel/HSSFCell.setFormulaValue() . + * Some tests are also done in scratchpad, if they need + * HSSFFormulaEvaluator, which is there */ public class TestFormulaParser extends TestCase { @@ -349,7 +351,7 @@ public class TestFormulaParser extends TestCase { assertTrue("ptg0 is a StringPtg", ptg[0] instanceof StringPtg); assertTrue("ptg0 contains exact value", ((StringPtg)ptg[0]).getValue().equals(value)); } - + public void testLookupAndMatchFunctionArgs() { FormulaParser fp = new FormulaParser("lookup(A1, A3:A52, B3:B52)", null); diff --git a/src/testcases/org/apache/poi/hssf/record/TestNoteRecord.java b/src/testcases/org/apache/poi/hssf/record/TestNoteRecord.java index 5d45094924..2f967b66e6 100644 --- a/src/testcases/org/apache/poi/hssf/record/TestNoteRecord.java +++ b/src/testcases/org/apache/poi/hssf/record/TestNoteRecord.java @@ -79,4 +79,27 @@ public class TestNoteRecord System.arraycopy(ser, 4, recdata, 0, recdata.length); assertTrue(Arrays.equals(data, recdata)); } + + public void testClone() + { + NoteRecord record = new NoteRecord(); + + record.setRow((short)1); + record.setColumn((short)2); + record.setFlags(NoteRecord.NOTE_VISIBLE); + record.setShapeId((short)1026); + record.setAuthor("Apache Software Foundation"); + + NoteRecord cloned = (NoteRecord)record.clone(); + assertEquals(record.getRow(), cloned.getRow()); + assertEquals(record.getColumn(), cloned.getColumn()); + assertEquals(record.getFlags(), cloned.getFlags()); + assertEquals(record.getShapeId(), cloned.getShapeId()); + assertEquals(record.getAuthor(), cloned.getAuthor()); + + //finally check that the serialized data is the same + byte[] src = record.serialize(); + byte[] cln = cloned.serialize(); + assertTrue(Arrays.equals(src, cln)); + } } diff --git a/src/testcases/org/apache/poi/hssf/record/TestNoteStructureSubRecord.java b/src/testcases/org/apache/poi/hssf/record/TestNoteStructureSubRecord.java index 833aa66128..d6b5a64766 100644 --- a/src/testcases/org/apache/poi/hssf/record/TestNoteStructureSubRecord.java +++ b/src/testcases/org/apache/poi/hssf/record/TestNoteStructureSubRecord.java @@ -65,4 +65,16 @@ public class TestNoteStructureSubRecord assertEquals(ser.length - 4, data.length); } + + public void testClone() + { + NoteStructureSubRecord record = new NoteStructureSubRecord(); + byte[] src = record.serialize(); + + NoteStructureSubRecord cloned = (NoteStructureSubRecord)record.clone(); + byte[] cln = cloned.serialize(); + + assertEquals(record.getRecordSize(), cloned.getRecordSize()); + assertTrue(Arrays.equals(src, cln)); + } } diff --git a/src/testcases/org/apache/poi/hssf/record/TestTextObjectRecord.java b/src/testcases/org/apache/poi/hssf/record/TestTextObjectRecord.java index 63b9db356f..64e087a554 100644 --- a/src/testcases/org/apache/poi/hssf/record/TestTextObjectRecord.java +++ b/src/testcases/org/apache/poi/hssf/record/TestTextObjectRecord.java @@ -117,4 +117,44 @@ public class TestTextObjectRecord extends TestCase { } } + + /** + * Test cloning + */ + public void testClone() { + String text = "Hello, World"; + HSSFRichTextString str = new HSSFRichTextString(text); + + TextObjectRecord obj = new TextObjectRecord(); + int frLength = ( str.numFormattingRuns() + 1 ) * 8; + obj.setFormattingRunLength( (short) frLength ); + obj.setTextLength( (short) str.length() ); + obj.setReserved1(true); + obj.setReserved2((short)2); + obj.setReserved3((short)3); + obj.setReserved4((short)4); + obj.setReserved5((short)5); + obj.setReserved6((short)6); + obj.setReserved7((short)7); + obj.setStr( str ); + + + TextObjectRecord cloned = (TextObjectRecord)obj.clone(); + assertEquals(obj.getReserved2(), cloned.getReserved2()); + assertEquals(obj.getReserved3(), cloned.getReserved3()); + assertEquals(obj.getReserved4(), cloned.getReserved4()); + assertEquals(obj.getReserved5(), cloned.getReserved5()); + assertEquals(obj.getReserved6(), cloned.getReserved6()); + assertEquals(obj.getReserved7(), cloned.getReserved7()); + assertEquals(obj.getRecordSize(), cloned.getRecordSize()); + assertEquals(obj.getOptions(), cloned.getOptions()); + assertEquals(obj.getHorizontalTextAlignment(), cloned.getHorizontalTextAlignment()); + assertEquals(obj.getFormattingRunLength(), cloned.getFormattingRunLength()); + assertEquals(obj.getStr().getString(), cloned.getStr().getString()); + + //finally check that the serialized data is the same + byte[] src = obj.serialize(); + byte[] cln = cloned.serialize(); + assertTrue(Arrays.equals(src, cln)); + } } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java index 75ec3fee60..d0dc7203e1 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestBugs.java @@ -913,7 +913,104 @@ extends TestCase { } - + /** + * Bug 44200: Sheet not cloneable when Note added to excel cell + */ + public void test44200() throws Exception { + FileInputStream in = new FileInputStream(new File(cwd, "44200.xls")); + HSSFWorkbook wb = new HSSFWorkbook(in); + in.close(); + + wb.cloneSheet(0); + assertTrue("No Exceptions while cloning sheet", true); + + //serialize and read again + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + + wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + assertTrue("No Exceptions while reading file", true); + + } + + /** + * Bug 44201: Sheet not cloneable when validation added to excel cell + */ + public void test44201() throws Exception { + FileInputStream in = new FileInputStream(new File(cwd, "44201.xls")); + HSSFWorkbook wb = new HSSFWorkbook(in); + in.close(); + + wb.cloneSheet(0); + assertTrue("No Exceptions while cloning sheet", true); + + //serialize and read again + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + + wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + assertTrue("No Exceptions while reading file", true); + + } + + /** + * Bug 37684 : Unhandled Continue Record Error + */ + public void test37684 () throws Exception { + FileInputStream in = new FileInputStream(new File(cwd, "37684-1.xls")); + HSSFWorkbook wb = new HSSFWorkbook(in); + in.close(); + + assertTrue("No exceptions while reading workbook", true); + + //serialize and read again + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + assertTrue("No exceptions while saving workbook", true); + + wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + assertTrue("No exceptions while reading saved stream", true); + + + in = new FileInputStream(new File(cwd, "37684-2.xls")); + wb = new HSSFWorkbook(in); + in.close(); + + assertTrue("No exceptions while reading workbook", true); + + //serialize and read again + out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + assertTrue("No exceptions while saving workbook", true); + + wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + assertTrue("No exceptions while reading saved stream", true); + } + + /** + * Bug 41139: Constructing HSSFWorkbook is failed,threw threw ArrayIndexOutOfBoundsException for creating UnknownRecord + */ + public void test41139() throws Exception { + FileInputStream in = new FileInputStream(new File(cwd, "41139.xls")); + HSSFWorkbook wb = new HSSFWorkbook(in); + in.close(); + + assertTrue("No Exceptions while reading file", true); + + //serialize and read again + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + + wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + assertTrue("No Exceptions while reading file", true); + + } + } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java b/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java index 04ae9fdf1f..266200b2d2 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestEscherGraphics.java @@ -20,24 +20,36 @@ package org.apache.poi.hssf.usermodel; import junit.framework.TestCase; import java.awt.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; /** * Tests the capabilities of the EscherGraphics class. + * + * All tests have two escher groups available to them, + * one anchored at 0,0,1022,255 and another anchored + * at 20,30,500,200 * * @author Glen Stampoultzis (glens at apache.org) */ public class TestEscherGraphics extends TestCase { - private HSSFShapeGroup escherGroup; + private HSSFWorkbook workbook; + private HSSFPatriarch patriarch; + private HSSFShapeGroup escherGroupA; + private HSSFShapeGroup escherGroupB; private EscherGraphics graphics; protected void setUp() throws Exception { - HSSFWorkbook workbook = new HSSFWorkbook(); + workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.createSheet("test"); - escherGroup = sheet.createDrawingPatriarch().createGroup(new HSSFClientAnchor(0,0,1023,255,(short)0,0,(short) 0,0)); - escherGroup = new HSSFShapeGroup(null, new HSSFChildAnchor()); - graphics = new EscherGraphics(this.escherGroup, workbook, Color.black, 1.0f); + patriarch = sheet.createDrawingPatriarch(); + escherGroupA = patriarch.createGroup(new HSSFClientAnchor(0,0,1022,255,(short)0,0,(short) 0,0)); + escherGroupB = patriarch.createGroup(new HSSFClientAnchor(20,30,500,200,(short)0,0,(short) 0,0)); +// escherGroup = new HSSFShapeGroup(null, new HSSFChildAnchor()); + graphics = new EscherGraphics(this.escherGroupA, workbook, Color.black, 1.0f); super.setUp(); } @@ -74,7 +86,7 @@ public class TestEscherGraphics extends TestCase public void testFillRect() throws Exception { graphics.fillRect( 10, 10, 20, 20 ); - HSSFSimpleShape s = (HSSFSimpleShape) escherGroup.getChildren().get(0); + HSSFSimpleShape s = (HSSFSimpleShape) escherGroupA.getChildren().get(0); assertEquals(HSSFSimpleShape.OBJECT_TYPE_RECTANGLE, s.getShapeType()); assertEquals(10, s.getAnchor().getDx1()); assertEquals(10, s.getAnchor().getDy1()); @@ -85,8 +97,198 @@ public class TestEscherGraphics extends TestCase public void testDrawString() throws Exception { graphics.drawString("This is a test", 10, 10); - HSSFTextbox t = (HSSFTextbox) escherGroup.getChildren().get(0); + HSSFTextbox t = (HSSFTextbox) escherGroupA.getChildren().get(0); assertEquals("This is a test", t.getString().getString().toString()); } + public void testGetDataBackAgain() throws Exception { + HSSFSheet s; + HSSFShapeGroup s1; + HSSFShapeGroup s2; + + patriarch.setCoordinates(10, 20, 30, 40); + + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook(new ByteArrayInputStream(baos.toByteArray())); + s = workbook.getSheetAt(0); + + patriarch = s.getDrawingPatriarch(); + + assertNotNull(patriarch); + assertEquals(10, patriarch.getX1()); + assertEquals(20, patriarch.getY1()); + assertEquals(30, patriarch.getX2()); + assertEquals(40, patriarch.getY2()); + + // Check the two groups too + assertEquals(2, patriarch.countOfAllChildren()); + assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup); + assertTrue(patriarch.getChildren().get(1) instanceof HSSFShapeGroup); + + s1 = (HSSFShapeGroup)patriarch.getChildren().get(0); + s2 = (HSSFShapeGroup)patriarch.getChildren().get(1); + + assertEquals(0, s1.getX1()); + assertEquals(0, s1.getY1()); + assertEquals(1023, s1.getX2()); + assertEquals(255, s1.getY2()); + assertEquals(0, s2.getX1()); + assertEquals(0, s2.getY1()); + assertEquals(1023, s2.getX2()); + assertEquals(255, s2.getY2()); + + assertEquals(0, s1.getAnchor().getDx1()); + assertEquals(0, s1.getAnchor().getDy1()); + assertEquals(1022, s1.getAnchor().getDx2()); + assertEquals(255, s1.getAnchor().getDy2()); + assertEquals(20, s2.getAnchor().getDx1()); + assertEquals(30, s2.getAnchor().getDy1()); + assertEquals(500, s2.getAnchor().getDx2()); + assertEquals(200, s2.getAnchor().getDy2()); + + + // Write and re-load once more, to check that's ok + baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook(new ByteArrayInputStream(baos.toByteArray())); + s = workbook.getSheetAt(0); + patriarch = s.getDrawingPatriarch(); + + assertNotNull(patriarch); + assertEquals(10, patriarch.getX1()); + assertEquals(20, patriarch.getY1()); + assertEquals(30, patriarch.getX2()); + assertEquals(40, patriarch.getY2()); + + // Check the two groups too + assertEquals(2, patriarch.countOfAllChildren()); + assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup); + assertTrue(patriarch.getChildren().get(1) instanceof HSSFShapeGroup); + + s1 = (HSSFShapeGroup)patriarch.getChildren().get(0); + s2 = (HSSFShapeGroup)patriarch.getChildren().get(1); + + assertEquals(0, s1.getX1()); + assertEquals(0, s1.getY1()); + assertEquals(1023, s1.getX2()); + assertEquals(255, s1.getY2()); + assertEquals(0, s2.getX1()); + assertEquals(0, s2.getY1()); + assertEquals(1023, s2.getX2()); + assertEquals(255, s2.getY2()); + + assertEquals(0, s1.getAnchor().getDx1()); + assertEquals(0, s1.getAnchor().getDy1()); + assertEquals(1022, s1.getAnchor().getDx2()); + assertEquals(255, s1.getAnchor().getDy2()); + assertEquals(20, s2.getAnchor().getDx1()); + assertEquals(30, s2.getAnchor().getDy1()); + assertEquals(500, s2.getAnchor().getDx2()); + assertEquals(200, s2.getAnchor().getDy2()); + + // Change the positions of the first groups, + // but not of their anchors + s1.setCoordinates(2, 3, 1021, 242); + + baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook(new ByteArrayInputStream(baos.toByteArray())); + s = workbook.getSheetAt(0); + patriarch = s.getDrawingPatriarch(); + + assertNotNull(patriarch); + assertEquals(10, patriarch.getX1()); + assertEquals(20, patriarch.getY1()); + assertEquals(30, patriarch.getX2()); + assertEquals(40, patriarch.getY2()); + + // Check the two groups too + assertEquals(2, patriarch.countOfAllChildren()); + assertEquals(2, patriarch.getChildren().size()); + assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup); + assertTrue(patriarch.getChildren().get(1) instanceof HSSFShapeGroup); + + s1 = (HSSFShapeGroup)patriarch.getChildren().get(0); + s2 = (HSSFShapeGroup)patriarch.getChildren().get(1); + + assertEquals(2, s1.getX1()); + assertEquals(3, s1.getY1()); + assertEquals(1021, s1.getX2()); + assertEquals(242, s1.getY2()); + assertEquals(0, s2.getX1()); + assertEquals(0, s2.getY1()); + assertEquals(1023, s2.getX2()); + assertEquals(255, s2.getY2()); + + assertEquals(0, s1.getAnchor().getDx1()); + assertEquals(0, s1.getAnchor().getDy1()); + assertEquals(1022, s1.getAnchor().getDx2()); + assertEquals(255, s1.getAnchor().getDy2()); + assertEquals(20, s2.getAnchor().getDx1()); + assertEquals(30, s2.getAnchor().getDy1()); + assertEquals(500, s2.getAnchor().getDx2()); + assertEquals(200, s2.getAnchor().getDy2()); + + + // Now add some text to one group, and some more + // to the base, and check we can get it back again + HSSFTextbox tbox1 = + patriarch.createTextbox(new HSSFClientAnchor(1,2,3,4, (short)0,0,(short)0,0)); + tbox1.setString(new HSSFRichTextString("I am text box 1")); + HSSFTextbox tbox2 = + s2.createTextbox(new HSSFChildAnchor(41,42,43,44)); + tbox2.setString(new HSSFRichTextString("This is text box 2")); + + assertEquals(3, patriarch.getChildren().size()); + + + baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook(new ByteArrayInputStream(baos.toByteArray())); + s = workbook.getSheetAt(0); + + patriarch = s.getDrawingPatriarch(); + + assertNotNull(patriarch); + assertEquals(10, patriarch.getX1()); + assertEquals(20, patriarch.getY1()); + assertEquals(30, patriarch.getX2()); + assertEquals(40, patriarch.getY2()); + + // Check the two groups and the text + assertEquals(3, patriarch.countOfAllChildren()); + assertEquals(2, patriarch.getChildren().size()); + + // Should be two groups and a text + assertTrue(patriarch.getChildren().get(0) instanceof HSSFShapeGroup); + assertTrue(patriarch.getChildren().get(1) instanceof HSSFTextbox); +// assertTrue(patriarch.getChildren().get(2) instanceof HSSFShapeGroup); + + s1 = (HSSFShapeGroup)patriarch.getChildren().get(0); + tbox1 = (HSSFTextbox)patriarch.getChildren().get(1); + +// s2 = (HSSFShapeGroup)patriarch.getChildren().get(1); + + assertEquals(2, s1.getX1()); + assertEquals(3, s1.getY1()); + assertEquals(1021, s1.getX2()); + assertEquals(242, s1.getY2()); + assertEquals(0, s2.getX1()); + assertEquals(0, s2.getY1()); + assertEquals(1023, s2.getX2()); + assertEquals(255, s2.getY2()); + + assertEquals(0, s1.getAnchor().getDx1()); + assertEquals(0, s1.getAnchor().getDy1()); + assertEquals(1022, s1.getAnchor().getDx2()); + assertEquals(255, s1.getAnchor().getDy2()); + assertEquals(20, s2.getAnchor().getDx1()); + assertEquals(30, s2.getAnchor().getDy1()); + assertEquals(500, s2.getAnchor().getDx2()); + assertEquals(200, s2.getAnchor().getDy2()); + + // Not working just yet + //assertEquals("I am text box 1", tbox1.getString().getString()); + } } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java index e6ee73f22d..f1e8f49777 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestFormulas.java @@ -1127,6 +1127,17 @@ extends TestCase { cell.setCellFormula("IF(A1=\"A\",1,)"); } + public void testSharedFormula() throws Exception { + String readFilename = System.getProperty("HSSF.testdata.path"); + File inFile = new File(readFilename+"/SharedFormulaTest.xls"); + FileInputStream fis = new FileInputStream(inFile); + HSSFWorkbook wb = new HSSFWorkbook(fis); + + assertEquals("A$1*2", wb.getSheetAt(0).getRow(1).getCell((short)1).toString()); + assertEquals("$A11*2", wb.getSheetAt(0).getRow(11).getCell((short)1).toString()); + assertEquals("DZ2*2", wb.getSheetAt(0).getRow(1).getCell((short)128).toString()); + assertEquals("B32770*2", wb.getSheetAt(0).getRow(32768).getCell((short)1).toString()); + } public static void main(String [] args) { System.out diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java index da9a885e8d..44c03cd20d 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFRow.java @@ -56,6 +56,11 @@ public class TestHSSFRow row.createCell((short) 1); assertEquals(1, row.getFirstCellNum()); assertEquals(2, row.getLastCellNum()); + + // check the exact case reported in 'bug' 43901 - notice that the cellNum is '0' based + row.createCell((short) 3); + assertEquals(1, row.getFirstCellNum()); + assertEquals(3, row.getLastCellNum()); } @@ -97,8 +102,49 @@ public class TestHSSFRow file.delete(); assertEquals(-1, sheet.getRow((short) 0).getLastCellNum()); assertEquals(-1, sheet.getRow((short) 0).getFirstCellNum()); - - + } + + public void testMoveCell() throws Exception { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheet = workbook.createSheet(); + HSSFRow row = sheet.createRow((short) 0); + HSSFRow rowB = sheet.createRow((short) 1); + + HSSFCell cellA2 = rowB.createCell((short)0); + assertEquals(0, rowB.getFirstCellNum()); + assertEquals(0, rowB.getFirstCellNum()); + + assertEquals(-1, row.getLastCellNum()); + assertEquals(-1, row.getFirstCellNum()); + HSSFCell cellB2 = row.createCell((short) 1); + HSSFCell cellB3 = row.createCell((short) 2); + HSSFCell cellB4 = row.createCell((short) 3); + + assertEquals(1, row.getFirstCellNum()); + assertEquals(3, row.getLastCellNum()); + + // Try to move to somewhere else that's used + try { + row.moveCell(cellB2, (short)3); + fail(); + } catch(IllegalArgumentException e) {} + + // Try to move one off a different row + try { + row.moveCell(cellA2, (short)3); + fail(); + } catch(IllegalArgumentException e) {} + + // Move somewhere spare + assertNotNull(row.getCell((short)1)); + row.moveCell(cellB2, (short)5); + assertNull(row.getCell((short)1)); + assertNotNull(row.getCell((short)5)); + + assertEquals(5, cellB2.getCellNum()); + assertEquals(2, row.getFirstCellNum()); + assertEquals(5, row.getLastCellNum()); + } public void testRowBounds() diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java index 6d7feef3b3..5523638d9a 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFSheet.java @@ -19,19 +19,24 @@ package org.apache.poi.hssf.usermodel; -import java.io.*; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileOutputStream; import junit.framework.TestCase; import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.record.HCenterRecord; -import org.apache.poi.hssf.record.ProtectRecord; import org.apache.poi.hssf.record.PasswordRecord; +import org.apache.poi.hssf.record.ProtectRecord; import org.apache.poi.hssf.record.SCLRecord; import org.apache.poi.hssf.record.VCenterRecord; import org.apache.poi.hssf.record.WSBoolRecord; import org.apache.poi.hssf.record.WindowTwoRecord; import org.apache.poi.hssf.util.Region; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.TempFile; /** @@ -224,6 +229,212 @@ public class TestHSSFSheet assertNotNull(workbook.getSheet("Test Clone(2)")); } + /** + * Setting landscape and portrait stuff on new sheets + */ + public void testPrintSetupLandscapeNew() throws Exception { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet sheetL = workbook.createSheet("LandscapeS"); + HSSFSheet sheetP = workbook.createSheet("LandscapeP"); + + // Check two aspects of the print setup + assertFalse(sheetL.getPrintSetup().getLandscape()); + assertFalse(sheetP.getPrintSetup().getLandscape()); + assertEquals(0, sheetL.getPrintSetup().getCopies()); + assertEquals(0, sheetP.getPrintSetup().getCopies()); + + // Change one on each + sheetL.getPrintSetup().setLandscape(true); + sheetP.getPrintSetup().setCopies((short)3); + + // Check taken + assertTrue(sheetL.getPrintSetup().getLandscape()); + assertFalse(sheetP.getPrintSetup().getLandscape()); + assertEquals(0, sheetL.getPrintSetup().getCopies()); + assertEquals(3, sheetP.getPrintSetup().getCopies()); + + // Save and re-load, and check still there + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook(new ByteArrayInputStream(baos.toByteArray())); + + assertTrue(sheetL.getPrintSetup().getLandscape()); + assertFalse(sheetP.getPrintSetup().getLandscape()); + assertEquals(0, sheetL.getPrintSetup().getCopies()); + assertEquals(3, sheetP.getPrintSetup().getCopies()); + } + + /** + * Setting landscape and portrait stuff on existing sheets + */ + public void testPrintSetupLandscapeExisting() throws Exception { + String filename = System.getProperty("HSSF.testdata.path"); + filename = filename + "/SimpleWithPageBreaks.xls"; + HSSFWorkbook workbook = + new HSSFWorkbook(new FileInputStream(filename)); + + assertEquals(3, workbook.getNumberOfSheets()); + + HSSFSheet sheetL = workbook.getSheetAt(0); + HSSFSheet sheetPM = workbook.getSheetAt(1); + HSSFSheet sheetLS = workbook.getSheetAt(2); + + // Check two aspects of the print setup + assertFalse(sheetL.getPrintSetup().getLandscape()); + assertTrue(sheetPM.getPrintSetup().getLandscape()); + assertTrue(sheetLS.getPrintSetup().getLandscape()); + assertEquals(1, sheetL.getPrintSetup().getCopies()); + assertEquals(1, sheetPM.getPrintSetup().getCopies()); + assertEquals(1, sheetLS.getPrintSetup().getCopies()); + + // Change one on each + sheetL.getPrintSetup().setLandscape(true); + sheetPM.getPrintSetup().setLandscape(false); + sheetPM.getPrintSetup().setCopies((short)3); + + // Check taken + assertTrue(sheetL.getPrintSetup().getLandscape()); + assertFalse(sheetPM.getPrintSetup().getLandscape()); + assertTrue(sheetLS.getPrintSetup().getLandscape()); + assertEquals(1, sheetL.getPrintSetup().getCopies()); + assertEquals(3, sheetPM.getPrintSetup().getCopies()); + assertEquals(1, sheetLS.getPrintSetup().getCopies()); + + // Save and re-load, and check still there + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook(new ByteArrayInputStream(baos.toByteArray())); + + assertTrue(sheetL.getPrintSetup().getLandscape()); + assertFalse(sheetPM.getPrintSetup().getLandscape()); + assertTrue(sheetLS.getPrintSetup().getLandscape()); + assertEquals(1, sheetL.getPrintSetup().getCopies()); + assertEquals(3, sheetPM.getPrintSetup().getCopies()); + assertEquals(1, sheetLS.getPrintSetup().getCopies()); + } + + public void testGroupRows() throws Exception { + HSSFWorkbook workbook = new HSSFWorkbook(); + HSSFSheet s = workbook.createSheet(); + HSSFRow r1 = s.createRow(0); + HSSFRow r2 = s.createRow(1); + HSSFRow r3 = s.createRow(2); + HSSFRow r4 = s.createRow(3); + HSSFRow r5 = s.createRow(4); + + assertEquals(0, r1.getOutlineLevel()); + assertEquals(0, r2.getOutlineLevel()); + assertEquals(0, r3.getOutlineLevel()); + assertEquals(0, r4.getOutlineLevel()); + assertEquals(0, r5.getOutlineLevel()); + + s.groupRow(2,3); + + assertEquals(0, r1.getOutlineLevel()); + assertEquals(0, r2.getOutlineLevel()); + assertEquals(1, r3.getOutlineLevel()); + assertEquals(1, r4.getOutlineLevel()); + assertEquals(0, r5.getOutlineLevel()); + + // Save and re-open + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook( + new ByteArrayInputStream(baos.toByteArray()) + ); + + s = workbook.getSheetAt(0); + r1 = s.getRow(0); + r2 = s.getRow(1); + r3 = s.getRow(2); + r4 = s.getRow(3); + r5 = s.getRow(4); + + assertEquals(0, r1.getOutlineLevel()); + assertEquals(0, r2.getOutlineLevel()); + assertEquals(1, r3.getOutlineLevel()); + assertEquals(1, r4.getOutlineLevel()); + assertEquals(0, r5.getOutlineLevel()); + } + + public void testGroupRowsExisting() throws Exception { + String filename = System.getProperty("HSSF.testdata.path"); + filename = filename + "/NoGutsRecords.xls"; + HSSFWorkbook workbook = + new HSSFWorkbook(new FileInputStream(filename)); + + HSSFSheet s = workbook.getSheetAt(0); + HSSFRow r1 = s.getRow(0); + HSSFRow r2 = s.getRow(1); + HSSFRow r3 = s.getRow(2); + HSSFRow r4 = s.getRow(3); + HSSFRow r5 = s.getRow(4); + HSSFRow r6 = s.getRow(5); + + assertEquals(0, r1.getOutlineLevel()); + assertEquals(0, r2.getOutlineLevel()); + assertEquals(0, r3.getOutlineLevel()); + assertEquals(0, r4.getOutlineLevel()); + assertEquals(0, r5.getOutlineLevel()); + assertEquals(0, r6.getOutlineLevel()); + + // This used to complain about lacking guts records + s.groupRow(2, 4); + + assertEquals(0, r1.getOutlineLevel()); + assertEquals(0, r2.getOutlineLevel()); + assertEquals(1, r3.getOutlineLevel()); + assertEquals(1, r4.getOutlineLevel()); + assertEquals(1, r5.getOutlineLevel()); + assertEquals(0, r6.getOutlineLevel()); + + // Save and re-open + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + workbook.write(baos); + workbook = new HSSFWorkbook( + new ByteArrayInputStream(baos.toByteArray()) + ); + + s = workbook.getSheetAt(0); + r1 = s.getRow(0); + r2 = s.getRow(1); + r3 = s.getRow(2); + r4 = s.getRow(3); + r5 = s.getRow(4); + r6 = s.getRow(5); + + assertEquals(0, r1.getOutlineLevel()); + assertEquals(0, r2.getOutlineLevel()); + assertEquals(1, r3.getOutlineLevel()); + assertEquals(1, r4.getOutlineLevel()); + assertEquals(1, r5.getOutlineLevel()); + assertEquals(0, r6.getOutlineLevel()); + } + + public void testGetDrawings() throws Exception { + String filename = System.getProperty("HSSF.testdata.path"); + HSSFWorkbook wb1c = new HSSFWorkbook( + new FileInputStream(new File(filename,"WithChart.xls")) + ); + HSSFWorkbook wb2c = new HSSFWorkbook( + new FileInputStream(new File(filename,"WithTwoCharts.xls")) + ); + + // 1 chart sheet -> data on 1st, chart on 2nd + assertNotNull(wb1c.getSheetAt(0).getDrawingPatriarch()); + assertNotNull(wb1c.getSheetAt(1).getDrawingPatriarch()); + assertFalse(wb1c.getSheetAt(0).getDrawingPatriarch().containsChart()); + assertTrue(wb1c.getSheetAt(1).getDrawingPatriarch().containsChart()); + + // 2 chart sheet -> data on 1st, chart on 2nd+3rd + assertNotNull(wb2c.getSheetAt(0).getDrawingPatriarch()); + assertNotNull(wb2c.getSheetAt(1).getDrawingPatriarch()); + assertNotNull(wb2c.getSheetAt(2).getDrawingPatriarch()); + assertFalse(wb2c.getSheetAt(0).getDrawingPatriarch().containsChart()); + assertTrue(wb2c.getSheetAt(1).getDrawingPatriarch().containsChart()); + assertTrue(wb2c.getSheetAt(2).getDrawingPatriarch().containsChart()); + } + /** * Test that the ProtectRecord is included when creating or cloning a sheet */ @@ -531,8 +742,133 @@ public class TestHSSFSheet assertTrue("No Exceptions while reading file", true); } + + public void testAutoSizeColumn() throws Exception { + String filename = System.getProperty("HSSF.testdata.path"); + filename = filename + "/43902.xls"; + String sheetName = "my sheet"; + FileInputStream is = new FileInputStream(filename); + POIFSFileSystem fs = new POIFSFileSystem(is); + HSSFWorkbook wb = new HSSFWorkbook(fs); + HSSFSheet sheet = wb.getSheet(sheetName); + + // Can't use literal numbers for column sizes, as + // will come out with different values on different + // machines based on the fonts available. + // So, we use ranges, which are pretty large, but + // thankfully don't overlap! + int minWithRow1And2 = 6400; + int maxWithRow1And2 = 7800; + int minWithRow1Only = 3024; + int maxWithRow1Only = 3300; + + // autoSize the first column and check its size before the merged region (1,0,1,1) is set: + // it has to be based on the 2nd row width + sheet.autoSizeColumn((short)0); + assertTrue("Column autosized with only one row: wrong width", sheet.getColumnWidth((short)0) >= minWithRow1And2); + assertTrue("Column autosized with only one row: wrong width", sheet.getColumnWidth((short)0) <= maxWithRow1And2); + + //create a region over the 2nd row and auto size the first column + sheet.addMergedRegion(new Region(1,(short)0,1,(short)1)); + sheet.autoSizeColumn((short)0); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wb.write(out); + out.close(); + + // check that the autoSized column width has ignored the 2nd row + // because it is included in a merged region (Excel like behavior) + HSSFWorkbook wb2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + HSSFSheet sheet2 = wb2.getSheet(sheetName); + assertTrue(sheet2.getColumnWidth((short)0) >= minWithRow1Only); + assertTrue(sheet2.getColumnWidth((short)0) <= maxWithRow1Only); + + // remove the 2nd row merged region and check that the 2nd row value is used to the autoSizeColumn width + sheet2.removeMergedRegion(1); + sheet2.autoSizeColumn((short)0); + out = new ByteArrayOutputStream(); + wb2.write(out); + out.close(); + HSSFWorkbook wb3 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + HSSFSheet sheet3 = wb3.getSheet(sheetName); + assertTrue(sheet3.getColumnWidth((short)0) >= minWithRow1And2); + assertTrue(sheet3.getColumnWidth((short)0) <= maxWithRow1And2); + } + + /** + * Setting ForceFormulaRecalculation on sheets + */ + public void testForceRecalculation() throws Exception { + String filename = System.getProperty("HSSF.testdata.path"); + filename = filename + "/UncalcedRecord.xls"; + HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(filename)); + + HSSFSheet sheet = workbook.getSheetAt(0); + HSSFSheet sheet2 = workbook.getSheetAt(0); + HSSFRow row = sheet.getRow(0); + row.createCell((short) 0).setCellValue(5); + row.createCell((short) 1).setCellValue(8); + assertFalse(sheet.getForceFormulaRecalculation()); + assertFalse(sheet2.getForceFormulaRecalculation()); + + // Save and manually verify that on column C we have 0, value in template + File tempFile = new File(System.getProperty("java.io.tmpdir")+"/uncalced_err.xls" ); + tempFile.delete(); + FileOutputStream fout = new FileOutputStream( tempFile ); + workbook.write( fout ); + fout.close(); + sheet.setForceFormulaRecalculation(true); + assertTrue(sheet.getForceFormulaRecalculation()); + + // Save and manually verify that on column C we have now 13, calculated value + tempFile = new File(System.getProperty("java.io.tmpdir")+"/uncalced_succ.xls" ); + tempFile.delete(); + fout = new FileOutputStream( tempFile ); + workbook.write( fout ); + fout.close(); + + // Try it can be opened + HSSFWorkbook wb2 = new HSSFWorkbook(new FileInputStream(tempFile)); + + // And check correct sheet settings found + sheet = wb2.getSheetAt(0); + sheet2 = wb2.getSheetAt(1); + assertTrue(sheet.getForceFormulaRecalculation()); + assertFalse(sheet2.getForceFormulaRecalculation()); + + // Now turn if back off again + sheet.setForceFormulaRecalculation(false); + + fout = new FileOutputStream( tempFile ); + wb2.write( fout ); + fout.close(); + wb2 = new HSSFWorkbook(new FileInputStream(tempFile)); + + assertFalse(wb2.getSheetAt(0).getForceFormulaRecalculation()); + assertFalse(wb2.getSheetAt(1).getForceFormulaRecalculation()); + assertFalse(wb2.getSheetAt(2).getForceFormulaRecalculation()); + + // Now add a new sheet, and check things work + // with old ones unset, new one set + HSSFSheet s4 = wb2.createSheet(); + s4.setForceFormulaRecalculation(true); + + assertFalse(sheet.getForceFormulaRecalculation()); + assertFalse(sheet2.getForceFormulaRecalculation()); + assertTrue(s4.getForceFormulaRecalculation()); + + fout = new FileOutputStream( tempFile ); + wb2.write( fout ); + fout.close(); + + HSSFWorkbook wb3 = new HSSFWorkbook(new FileInputStream(tempFile)); + assertFalse(wb3.getSheetAt(0).getForceFormulaRecalculation()); + assertFalse(wb3.getSheetAt(1).getForceFormulaRecalculation()); + assertFalse(wb3.getSheetAt(2).getForceFormulaRecalculation()); + assertTrue(wb3.getSheetAt(3).getForceFormulaRecalculation()); + } - public static void main(java.lang.String[] args) { + + public static void main(java.lang.String[] args) { junit.textui.TestRunner.run(TestHSSFSheet.class); } } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java index a66154d759..1be3a90855 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestHSSFWorkbook.java @@ -16,14 +16,25 @@ */ package org.apache.poi.hssf.usermodel; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; +import java.io.File; +import java.io.FileInputStream; + import junit.framework.*; import org.apache.poi.hssf.record.NameRecord; public class TestHSSFWorkbook extends TestCase { HSSFWorkbook hssfWorkbook; + String filename; + + protected void setUp() throws Exception { + super.setUp(); + filename = System.getProperty("HSSF.testdata.path"); + } - public void testSetRepeatingRowsAndColumns() throws Exception + public void testSetRepeatingRowsAndColumns() throws Exception { // Test bug 29747 HSSFWorkbook b = new HSSFWorkbook( ); @@ -34,7 +45,7 @@ public class TestHSSFWorkbook extends TestCase NameRecord nameRecord = b.getWorkbook().getNameRecord( 0 ); assertEquals( 3, nameRecord.getIndexToSheet() ); } - + public void testDuplicateNames() throws Exception { @@ -100,4 +111,103 @@ public class TestHSSFWorkbook extends TestCase assertEquals(b.getSelectedTab(), 1); assertEquals(b.getDisplayedTab(), 1); } + + public void testSheetClone() throws Exception { + // First up, try a simple file + HSSFWorkbook b = new HSSFWorkbook(); + assertEquals(0, b.getNumberOfSheets()); + b.createSheet("Sheet One"); + b.createSheet("Sheet Two"); + + assertEquals(2, b.getNumberOfSheets()); + b.cloneSheet(0); + assertEquals(3, b.getNumberOfSheets()); + + // Now try a problem one with drawing records in it + b = new HSSFWorkbook( + new FileInputStream(new File(filename,"SheetWithDrawing.xls")) + ); + assertEquals(1, b.getNumberOfSheets()); + b.cloneSheet(0); + assertEquals(2, b.getNumberOfSheets()); + } + + public void testReadWriteWithCharts() throws Exception { + HSSFWorkbook b; + HSSFSheet s; + + // Single chart, two sheets + b = new HSSFWorkbook( + new FileInputStream(new File(filename,"44010-SingleChart.xls")) + ); + assertEquals(2, b.getNumberOfSheets()); + s = b.getSheetAt(1); + assertEquals(0, s.getFirstRowNum()); + assertEquals(0, s.getLastRowNum()); + + // Has chart on 1st sheet?? + // FIXME + assertNotNull(b.getSheetAt(0).getDrawingPatriarch()); + assertNull(b.getSheetAt(1).getDrawingPatriarch()); + assertFalse(b.getSheetAt(0).getDrawingPatriarch().containsChart()); + + // We've now called getDrawingPatriarch() so + // everything will be all screwy + // So, start again + b = new HSSFWorkbook( + new FileInputStream(new File(filename,"44010-SingleChart.xls")) + ); + + b = writeRead(b); + assertEquals(2, b.getNumberOfSheets()); + s = b.getSheetAt(1); + assertEquals(0, s.getFirstRowNum()); + assertEquals(0, s.getLastRowNum()); + + + // Two charts, three sheets + b = new HSSFWorkbook( + new FileInputStream(new File(filename,"44010-TwoCharts.xls")) + ); + assertEquals(3, b.getNumberOfSheets()); + + s = b.getSheetAt(1); + assertEquals(0, s.getFirstRowNum()); + assertEquals(0, s.getLastRowNum()); + s = b.getSheetAt(2); + assertEquals(0, s.getFirstRowNum()); + assertEquals(0, s.getLastRowNum()); + + // Has chart on 1st sheet?? + // FIXME + assertNotNull(b.getSheetAt(0).getDrawingPatriarch()); + assertNull(b.getSheetAt(1).getDrawingPatriarch()); + assertNull(b.getSheetAt(2).getDrawingPatriarch()); + assertFalse(b.getSheetAt(0).getDrawingPatriarch().containsChart()); + + // We've now called getDrawingPatriarch() so + // everything will be all screwy + // So, start again + b = new HSSFWorkbook( + new FileInputStream(new File(filename,"44010-TwoCharts.xls")) + ); + + b = writeRead(b); + assertEquals(3, b.getNumberOfSheets()); + + s = b.getSheetAt(1); + assertEquals(0, s.getFirstRowNum()); + assertEquals(0, s.getLastRowNum()); + s = b.getSheetAt(2); + assertEquals(0, s.getFirstRowNum()); + assertEquals(0, s.getLastRowNum()); + } + + private HSSFWorkbook writeRead(HSSFWorkbook b) throws Exception { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + b.write(baos); + return new HSSFWorkbook( + new ByteArrayInputStream(baos.toByteArray()) + ); + } } \ No newline at end of file diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java b/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java index 8af9b2f3cf..f804822d24 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestNamedRange.java @@ -26,6 +26,8 @@ import org.apache.poi.hssf.util.CellReference; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.util.TempFile; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -316,7 +318,23 @@ public class TestNamedRange assertTrue("Name is "+nm2.getNameName(),"RangeTest2".equals(nm2.getNameName())); assertTrue("Reference is "+nm2.getReference(),(wb.getSheetName(1)+"!$A$1:$O$21").equals(nm2.getReference())); } - + + public void testUnicodeNamedRange() throws Exception { + HSSFWorkbook workBook = new HSSFWorkbook(); + HSSFSheet sheet = workBook.createSheet("Test"); + HSSFName name = workBook.createName(); + name.setNameName("\u03B1"); + name.setReference("Test!$D$3:$E$8"); + + ByteArrayOutputStream out = new ByteArrayOutputStream(); + workBook.write(out); + + HSSFWorkbook workBook2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + HSSFName name2 = workBook2.getNameAt(0); + + assertEquals("\u03B1", name2.getNameName()); + assertEquals("Test!$D$3:$E$8", name2.getReference()); + } /** * Test to see if the print areas can be retrieved/created in memory diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestSheetHiding.java b/src/testcases/org/apache/poi/hssf/usermodel/TestSheetHiding.java index 9628ab23e4..038b6cce55 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestSheetHiding.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestSheetHiding.java @@ -19,12 +19,11 @@ package org.apache.poi.hssf.usermodel; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; -import java.io.FileNotFoundException; - -import org.apache.poi.poifs.filesystem.POIFSFileSystem; import junit.framework.TestCase; +import org.apache.poi.poifs.filesystem.POIFSFileSystem; + /** * Tests for how HSSFWorkbook behaves with XLS files * with a WORKBOOK directory entry (instead of the more @@ -34,11 +33,21 @@ public class TestSheetHiding extends TestCase { private String dirPath; private String xlsHidden = "TwoSheetsOneHidden.xls"; private String xlsShown = "TwoSheetsNoneHidden.xls"; + private HSSFWorkbook wbH; + private HSSFWorkbook wbU; protected void setUp() throws Exception { super.setUp(); - - dirPath = System.getProperty("HSSF.testdata.path"); + + dirPath = System.getProperty("HSSF.testdata.path"); + FileInputStream isH = new FileInputStream(dirPath + "/" + xlsHidden); + POIFSFileSystem fsH = new POIFSFileSystem(isH); + + FileInputStream isU = new FileInputStream(dirPath + "/" + xlsShown); + POIFSFileSystem fsU = new POIFSFileSystem(isU); + + wbH = new HSSFWorkbook(fsH); + wbU = new HSSFWorkbook(fsU); } /** @@ -47,36 +56,27 @@ public class TestSheetHiding extends TestCase { * the hidden flags are */ public void testTextSheets() throws Exception { - FileInputStream isH = new FileInputStream(dirPath + "/" + xlsHidden); - POIFSFileSystem fsH = new POIFSFileSystem(isH); - - FileInputStream isU = new FileInputStream(dirPath + "/" + xlsShown); - POIFSFileSystem fsU = new POIFSFileSystem(isU); - - HSSFWorkbook wbH = new HSSFWorkbook(fsH); - HSSFWorkbook wbU = new HSSFWorkbook(fsU); - // Both should have two sheets assertEquals(2, wbH.sheets.size()); assertEquals(2, wbU.sheets.size()); - + // All sheets should have one row assertEquals(0, wbH.getSheetAt(0).getLastRowNum()); assertEquals(0, wbH.getSheetAt(1).getLastRowNum()); assertEquals(0, wbU.getSheetAt(0).getLastRowNum()); assertEquals(0, wbU.getSheetAt(1).getLastRowNum()); - + // All rows should have one column assertEquals(1, wbH.getSheetAt(0).getRow(0).getLastCellNum()); assertEquals(1, wbH.getSheetAt(1).getRow(0).getLastCellNum()); assertEquals(1, wbU.getSheetAt(0).getRow(0).getLastCellNum()); assertEquals(1, wbU.getSheetAt(1).getRow(0).getLastCellNum()); - + // Text should be sheet based - assertEquals("Sheet1A1", wbH.getSheetAt(0).getRow(0).getCell((short)0).getStringCellValue()); - assertEquals("Sheet2A1", wbH.getSheetAt(1).getRow(0).getCell((short)0).getStringCellValue()); - assertEquals("Sheet1A1", wbU.getSheetAt(0).getRow(0).getCell((short)0).getStringCellValue()); - assertEquals("Sheet2A1", wbU.getSheetAt(1).getRow(0).getCell((short)0).getStringCellValue()); + assertEquals("Sheet1A1", wbH.getSheetAt(0).getRow(0).getCell((short)0).getRichStringCellValue().getString()); + assertEquals("Sheet2A1", wbH.getSheetAt(1).getRow(0).getCell((short)0).getRichStringCellValue().getString()); + assertEquals("Sheet1A1", wbU.getSheetAt(0).getRow(0).getCell((short)0).getRichStringCellValue().getString()); + assertEquals("Sheet2A1", wbU.getSheetAt(1).getRow(0).getCell((short)0).getRichStringCellValue().getString()); } /** @@ -84,7 +84,10 @@ public class TestSheetHiding extends TestCase { * as expected */ public void testHideUnHideFlags() throws Exception { - // TODO + assertTrue(wbH.isSheetHidden(0)); + assertFalse(wbH.isSheetHidden(1)); + assertFalse(wbU.isSheetHidden(0)); + assertFalse(wbU.isSheetHidden(1)); } /** @@ -92,7 +95,15 @@ public class TestSheetHiding extends TestCase { * one hidden */ public void testHide() throws Exception { - // TODO + wbU.setSheetHidden(0, true); + assertTrue(wbU.isSheetHidden(0)); + assertFalse(wbU.isSheetHidden(1)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wbU.write(out); + out.close(); + HSSFWorkbook wb2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + assertTrue(wb2.isSheetHidden(0)); + assertFalse(wb2.isSheetHidden(1)); } /** @@ -100,6 +111,14 @@ public class TestSheetHiding extends TestCase { * none hidden */ public void testUnHide() throws Exception { - // TODO + wbH.setSheetHidden(0, false); + assertFalse(wbH.isSheetHidden(0)); + assertFalse(wbH.isSheetHidden(1)); + ByteArrayOutputStream out = new ByteArrayOutputStream(); + wbH.write(out); + out.close(); + HSSFWorkbook wb2 = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); + assertFalse(wb2.isSheetHidden(0)); + assertFalse(wb2.isSheetHidden(1)); } } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestSheetShiftRows.java b/src/testcases/org/apache/poi/hssf/usermodel/TestSheetShiftRows.java index d07a3eea5a..05eee992e1 100755 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestSheetShiftRows.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestSheetShiftRows.java @@ -25,6 +25,8 @@ import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.util.TempFile; import java.io.File; +import java.io.ByteArrayInputStream; +import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; @@ -170,5 +172,113 @@ public class TestSheetShiftRows extends TestCase { assertTrue("Row number 6 should have a pagebreak", s.isRowBroken(6)); } + + + public void testShiftWithComments() throws Exception { + String filename = System.getProperty( "HSSF.testdata.path" ); + filename = filename + "/comments.xls"; + FileInputStream fin = new FileInputStream( filename ); + HSSFWorkbook wb = new HSSFWorkbook( fin ); + fin.close(); + + HSSFSheet sheet = wb.getSheet("Sheet1"); + assertEquals(3, sheet.getLastRowNum()); + + // Verify comments are in the position expected + assertNotNull(sheet.getCellComment(0,0)); + assertNull(sheet.getCellComment(1,0)); + assertNotNull(sheet.getCellComment(2,0)); + assertNotNull(sheet.getCellComment(3,0)); + + String comment1 = sheet.getCellComment(0,0).getString().getString(); + assertEquals(comment1,"comment top row1 (index0)\n"); + String comment3 = sheet.getCellComment(2,0).getString().getString(); + assertEquals(comment3,"comment top row3 (index2)\n"); + String comment4 = sheet.getCellComment(3,0).getString().getString(); + assertEquals(comment4,"comment top row4 (index3)\n"); + + // Shifting all but first line down to test comments shifting + sheet.shiftRows(1, sheet.getLastRowNum(), 1, true, true); + ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); + wb.write(outputStream); + + // Test that comments were shifted as expected + assertEquals(4, sheet.getLastRowNum()); + assertNotNull(sheet.getCellComment(0,0)); + assertNull(sheet.getCellComment(1,0)); + assertNull(sheet.getCellComment(2,0)); + assertNotNull(sheet.getCellComment(3,0)); + assertNotNull(sheet.getCellComment(4,0)); + + String comment1_shifted = sheet.getCellComment(0,0).getString().getString(); + assertEquals(comment1,comment1_shifted); + String comment3_shifted = sheet.getCellComment(3,0).getString().getString(); + assertEquals(comment3,comment3_shifted); + String comment4_shifted = sheet.getCellComment(4,0).getString().getString(); + assertEquals(comment4,comment4_shifted); + + // Write out and read back in again + // Ensure that the changes were persisted + wb = new HSSFWorkbook( new ByteArrayInputStream(outputStream.toByteArray()) ); + sheet = wb.getSheet("Sheet1"); + assertEquals(4, sheet.getLastRowNum()); + + // Verify comments are in the position expected after the shift + assertNotNull(sheet.getCellComment(0,0)); + assertNull(sheet.getCellComment(1,0)); + assertNull(sheet.getCellComment(2,0)); + assertNotNull(sheet.getCellComment(3,0)); + assertNotNull(sheet.getCellComment(4,0)); + + comment1_shifted = sheet.getCellComment(0,0).getString().getString(); + assertEquals(comment1,comment1_shifted); + comment3_shifted = sheet.getCellComment(3,0).getString().getString(); + assertEquals(comment3,comment3_shifted); + comment4_shifted = sheet.getCellComment(4,0).getString().getString(); + assertEquals(comment4,comment4_shifted); + } + + /** + * See bug #34023 + */ + public void testShiftWithFormulas() throws Exception { + String filename = System.getProperty( "HSSF.testdata.path" ); + filename = filename + "/ForShifting.xls"; + FileInputStream fin = new FileInputStream( filename ); + HSSFWorkbook wb = new HSSFWorkbook( fin ); + fin.close(); + + HSSFSheet sheet = wb.getSheet("Sheet1"); + assertEquals(19, sheet.getLastRowNum()); + + assertEquals("cell B1 (ref)", sheet.getRow(0).getCell((short)3).getRichStringCellValue().toString()); + assertEquals("CONCATENATE(B1,\" (ref)\")", sheet.getRow(0).getCell((short)3).getCellFormula()); + assertEquals("cell B2 (ref)", sheet.getRow(1).getCell((short)3).getRichStringCellValue().toString()); + assertEquals("CONCATENATE(B2,\" (ref)\")", sheet.getRow(1).getCell((short)3).getCellFormula()); + assertEquals("cell B3 (ref)", sheet.getRow(2).getCell((short)3).getRichStringCellValue().toString()); + assertEquals("CONCATENATE(B3,\" (ref)\")", sheet.getRow(2).getCell((short)3).getCellFormula()); + assertEquals("cell B2 (ref)", sheet.getRow(6).getCell((short)1).getRichStringCellValue().toString()); + assertEquals("CONCATENATE(B2,\" (ref)\")", sheet.getRow(6).getCell((short)1).getCellFormula()); + + sheet.shiftRows(1, 1, 10); + + // Row 1 => Row 11 + // So strings on row 11 unchanged, but reference in formula is + assertEquals("cell B1 (ref)", sheet.getRow(0).getCell((short)3).getRichStringCellValue().toString()); + assertEquals("CONCATENATE(B1,\" (ref)\")", sheet.getRow(0).getCell((short)3).getCellFormula()); + assertEquals(0, sheet.getRow(1).getPhysicalNumberOfCells()); + + // still save b2 + assertEquals("cell B2 (ref)", sheet.getRow(11).getCell((short)3).getRichStringCellValue().toString()); + // but points to b12 + assertEquals("CONCATENATE(B12,\" (ref)\")", sheet.getRow(11).getCell((short)3).getCellFormula()); + + assertEquals("cell B3 (ref)", sheet.getRow(2).getCell((short)3).getRichStringCellValue().toString()); + assertEquals("CONCATENATE(B3,\" (ref)\")", sheet.getRow(2).getCell((short)3).getCellFormula()); + + // one on a non-shifted row also updated + assertEquals("cell B2 (ref)", sheet.getRow(6).getCell((short)1).getRichStringCellValue().toString()); + assertEquals("CONCATENATE(B12,\" (ref)\")", sheet.getRow(6).getCell((short)1).getCellFormula()); + } } diff --git a/src/testcases/org/apache/poi/hssf/usermodel/TestUnfixedBugs.java b/src/testcases/org/apache/poi/hssf/usermodel/TestUnfixedBugs.java index ef1e410c46..3f876c8663 100644 --- a/src/testcases/org/apache/poi/hssf/usermodel/TestUnfixedBugs.java +++ b/src/testcases/org/apache/poi/hssf/usermodel/TestUnfixedBugs.java @@ -44,72 +44,13 @@ public class TestUnfixedBugs extends TestCase { protected String cwd = System.getProperty("HSSF.testdata.path"); - /* ArrayIndexOutOfBound in BOFRecord */ - public void test28772() throws java.io.IOException { - String filename = System.getProperty("HSSF.testdata.path"); - filename=filename+"/28772.xls"; - FileInputStream in = new FileInputStream(filename); - HSSFWorkbook wb = new HSSFWorkbook(in); - assertTrue("Read book fine!" , true); - } - - /** - * Bug 37684: Unhandled Continue Record Error - * - * BUT NOW(Jan07): It triggers bug 41026!! - * - * java.lang.ArrayIndexOutOfBoundsException: 30 - at org.apache.poi.hssf.record.aggregates.ValueRecordsAggregate.rowHasCells(ValueRecordsAggregate.java:219) - */ - public void test37684() throws Exception { - FileInputStream in = new FileInputStream(new File(cwd, "37684.xls")); - HSSFWorkbook wb = new HSSFWorkbook(in); - in.close(); - - HSSFSheet sheet = wb.getSheetAt( 0 ); - assertNotNull(sheet); - - assertTrue("No Exceptions while reading file", true); - - //serialize and read again - ByteArrayOutputStream out = new ByteArrayOutputStream(); - wb.write(out); - out.close(); - - wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); - assertTrue("No Exceptions while reading file", true); - - } - - /** - * Bug 41139: Constructing HSSFWorkbook is failed,threw threw ArrayIndexOutOfBoundsException for creating UnknownRecord - * - * BUT NOW (Jan07): It throws the following in write!! - * java.lang.RuntimeException: Coding Error: This method should never be called. This ptg should be converted - at org.apache.poi.hssf.record.formula.AreaNPtg.writeBytes(AreaNPtg.java:54) - at org.apache.poi.hssf.record.formula.Ptg.serializePtgStack(Ptg.java:384) - at org.apache.poi.hssf.record.NameRecord.serialize(NameRecord.java:544) - at org.apache.poi.hssf.model.Workbook.serialize(Workbook.java:757) - at org.apache.poi.hssf.usermodel.HSSFWorkbook.getBytes(HSSFWorkbook.java:952) - at org.apache.poi.hssf.usermodel.HSSFWorkbook.write(HSSFWorkbook.java:898) - */ - public void test41139() throws Exception { - FileInputStream in = new FileInputStream(new File(cwd, "41139.xls")); - HSSFWorkbook wb = new HSSFWorkbook(in); - in.close(); - - assertTrue("No Exceptions while reading file", true); - - //serialize and read again - ByteArrayOutputStream out = new ByteArrayOutputStream(); - wb.write(out); - out.close(); - - wb = new HSSFWorkbook(new ByteArrayInputStream(out.toByteArray())); - assertTrue("No Exceptions while reading file", true); - - } - - + public void test43493() throws Exception { + // Has crazy corrup subrecords on + // a EmbeddedObjectRefSubRecord + File f = new File(cwd, "43493.xls"); + HSSFWorkbook wb = new HSSFWorkbook( + new FileInputStream(f) + ); + } } diff --git a/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java index 0663920461..ccd2a58052 100644 --- a/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java +++ b/src/testcases/org/apache/poi/hssf/util/TestAreaReference.java @@ -21,9 +21,16 @@ package org.apache.poi.hssf.util; import junit.framework.TestCase; -import org.apache.poi.hssf.usermodel.HSSFCell; -import org.apache.poi.hssf.usermodel.HSSFRow; -import org.apache.poi.hssf.usermodel.HSSFSheet; +import org.apache.poi.hssf.usermodel.*; +import org.apache.poi.hssf.model.Workbook; +import org.apache.poi.hssf.record.NameRecord; +import org.apache.poi.hssf.record.formula.MemFuncPtg; +import org.apache.poi.hssf.record.formula.Area3DPtg; +import org.apache.poi.hssf.record.formula.UnionPtg; + +import java.io.FileInputStream; +import java.io.InputStream; +import java.util.List; public class TestAreaReference extends TestCase { public TestAreaReference(String s) { @@ -45,6 +52,25 @@ public class TestAreaReference extends TestCase { assertTrue("row is abs",cf.isRowAbsolute()); assertTrue("col is abs",cf.isColAbsolute()); assertTrue("string is $B$2",cf.toString().equals("$B$2")); + + CellReference[] refs = ar.getAllReferencedCells(); + assertEquals(4, refs.length); + + assertEquals(0, refs[0].getRow()); + assertEquals(0, refs[0].getCol()); + assertNull(refs[0].getSheetName()); + + assertEquals(0, refs[1].getRow()); + assertEquals(1, refs[1].getCol()); + assertNull(refs[1].getSheetName()); + + assertEquals(1, refs[2].getRow()); + assertEquals(0, refs[2].getCol()); + assertNull(refs[2].getSheetName()); + + assertEquals(1, refs[3].getRow()); + assertEquals(1, refs[3].getCol()); + assertNull(refs[3].getSheetName()); } /** @@ -52,16 +78,204 @@ public class TestAreaReference extends TestCase { * Reported by Arne.Clauss@gedas.de */ public void testReferenceWithSheet() { - String ref = "Tabelle1!$B$5"; + String ref = "Tabelle1!B5"; AreaReference myAreaReference = new AreaReference(ref); CellReference[] myCellReference = myAreaReference.getCells(); - + + assertEquals(1, myCellReference.length); assertNotNull("cell reference not null : "+myCellReference[0]); assertEquals("Not Column B", (short)1,myCellReference[0].getCol()); assertEquals("Not Row 5", 4,myCellReference[0].getRow()); + assertEquals("Shouldn't be absolute", false, myCellReference[0].isRowAbsolute()); + assertEquals("Shouldn't be absolute", false, myCellReference[0].isColAbsolute()); + + assertEquals(1, myAreaReference.getAllReferencedCells().length); + + + ref = "Tabelle1!$B$5:$B$7"; + myAreaReference = new AreaReference(ref); + myCellReference = myAreaReference.getCells(); + assertEquals(2, myCellReference.length); + + assertEquals("Tabelle1", myCellReference[0].getSheetName()); + assertEquals(4, myCellReference[0].getRow()); + assertEquals(1, myCellReference[0].getCol()); + assertTrue(myCellReference[0].isRowAbsolute()); + assertTrue(myCellReference[0].isColAbsolute()); + + assertEquals("Tabelle1", myCellReference[1].getSheetName()); + assertEquals(6, myCellReference[1].getRow()); + assertEquals(1, myCellReference[1].getCol()); + assertTrue(myCellReference[1].isRowAbsolute()); + assertTrue(myCellReference[1].isColAbsolute()); + + // And all that make it up + myCellReference = myAreaReference.getAllReferencedCells(); + assertEquals(3, myCellReference.length); + + assertEquals("Tabelle1", myCellReference[0].getSheetName()); + assertEquals(4, myCellReference[0].getRow()); + assertEquals(1, myCellReference[0].getCol()); + assertTrue(myCellReference[0].isRowAbsolute()); + assertTrue(myCellReference[0].isColAbsolute()); + + assertEquals("Tabelle1", myCellReference[1].getSheetName()); + assertEquals(5, myCellReference[1].getRow()); + assertEquals(1, myCellReference[1].getCol()); + assertTrue(myCellReference[1].isRowAbsolute()); + assertTrue(myCellReference[1].isColAbsolute()); + + assertEquals("Tabelle1", myCellReference[2].getSheetName()); + assertEquals(6, myCellReference[2].getRow()); + assertEquals(1, myCellReference[2].getCol()); + assertTrue(myCellReference[2].isRowAbsolute()); + assertTrue(myCellReference[2].isColAbsolute()); + } + + private static class HSSFWB extends HSSFWorkbook { + private HSSFWB(InputStream in) throws Exception { + super(in); + } + public Workbook getWorkbook() { + return super.getWorkbook(); + } + } + + public void testContiguousReferences() throws Exception { + String refSimple = "$C$10"; + String ref2D = "$C$10:$D$11"; + String refDCSimple = "$C$10,$D$12,$E$14"; + String refDC2D = "$C$10:$C$11,$D$12,$E$14:$E$20"; + String refDC3D = "Tabelle1!$C$10:$C$14,Tabelle1!$D$10:$D$12"; + + // Check that we detect as contiguous properly + assertTrue(AreaReference.isContiguous(refSimple)); + assertTrue(AreaReference.isContiguous(ref2D)); + assertFalse(AreaReference.isContiguous(refDCSimple)); + assertFalse(AreaReference.isContiguous(refDC2D)); + assertFalse(AreaReference.isContiguous(refDC3D)); + + // Check we can only create contiguous entries + new AreaReference(refSimple); + new AreaReference(ref2D); + try { + new AreaReference(refDCSimple); + fail(); + } catch(IllegalArgumentException e) {} + try { + new AreaReference(refDC2D); + fail(); + } catch(IllegalArgumentException e) {} + try { + new AreaReference(refDC3D); + fail(); + } catch(IllegalArgumentException e) {} + + // Test that we split as expected + AreaReference[] refs; + + refs = AreaReference.generateContiguous(refSimple); + assertEquals(1, refs.length); + assertEquals(1, refs[0].getDim()); + assertEquals("$C$10", refs[0].toString()); + + refs = AreaReference.generateContiguous(ref2D); + assertEquals(1, refs.length); + assertEquals(2, refs[0].getDim()); + assertEquals("$C$10:$D$11", refs[0].toString()); + + refs = AreaReference.generateContiguous(refDCSimple); + assertEquals(3, refs.length); + assertEquals(1, refs[0].getDim()); + assertEquals(1, refs[1].getDim()); + assertEquals(1, refs[2].getDim()); + assertEquals("$C$10", refs[0].toString()); + assertEquals("$D$12", refs[1].toString()); + assertEquals("$E$14", refs[2].toString()); + + refs = AreaReference.generateContiguous(refDC2D); + assertEquals(3, refs.length); + assertEquals(2, refs[0].getDim()); + assertEquals(1, refs[1].getDim()); + assertEquals(2, refs[2].getDim()); + assertEquals("$C$10:$C$11", refs[0].toString()); + assertEquals("$D$12", refs[1].toString()); + assertEquals("$E$14:$E$20", refs[2].toString()); + + refs = AreaReference.generateContiguous(refDC3D); + assertEquals(2, refs.length); + assertEquals(2, refs[0].getDim()); + assertEquals(2, refs[1].getDim()); + assertEquals("$C$10:$C$14", refs[0].toString()); + assertEquals("$D$10:$D$12", refs[1].toString()); + assertEquals("Tabelle1", refs[0].getCells()[0].getSheetName()); + assertEquals("Tabelle1", refs[0].getCells()[1].getSheetName()); + assertEquals("Tabelle1", refs[1].getCells()[0].getSheetName()); + assertEquals("Tabelle1", refs[1].getCells()[1].getSheetName()); + } + + public void testDiscontinousReference() throws Exception { + String filename = System.getProperty( "HSSF.testdata.path" ); + filename = filename + "/44167.xls"; + FileInputStream fin = new FileInputStream( filename ); + HSSFWB wb = new HSSFWB( fin ); + Workbook workbook = wb.getWorkbook(); + fin.close(); + + assertEquals(1, wb.getNumberOfNames()); + String sheetName = "Tabelle1"; + String rawRefA = "$C$10:$C$14"; + String rawRefB = "$C$16:$C$18"; + String refA = sheetName + "!" + rawRefA; + String refB = sheetName + "!" + rawRefB; + String ref = refA + "," + refB; + + // Check the low level record + NameRecord nr = workbook.getNameRecord(0); + assertNotNull(nr); + assertEquals("test", nr.getNameText()); + + List def =nr.getNameDefinition(); + assertEquals(4, def.size()); + + MemFuncPtg ptgA = (MemFuncPtg)def.get(0); + Area3DPtg ptgB = (Area3DPtg)def.get(1); + Area3DPtg ptgC = (Area3DPtg)def.get(2); + UnionPtg ptgD = (UnionPtg)def.get(3); + assertEquals("", ptgA.toFormulaString(workbook)); + assertEquals(refA, ptgB.toFormulaString(workbook)); + assertEquals(refB, ptgC.toFormulaString(workbook)); + assertEquals(",", ptgD.toFormulaString(workbook)); + + assertEquals(ref, nr.getAreaReference(workbook)); + + // Check the high level definition + int idx = wb.getNameIndex("test"); + assertEquals(0, idx); + HSSFName aNamedCell = wb.getNameAt(idx); + + // Should have 2 references + assertEquals(ref, aNamedCell.getReference()); + + // Check the parsing of the reference into cells + assertFalse(AreaReference.isContiguous(aNamedCell.getReference())); + AreaReference[] arefs = AreaReference.generateContiguous(aNamedCell.getReference()); + assertEquals(2, arefs.length); + assertEquals(rawRefA, arefs[0].toString()); + assertEquals(rawRefB, arefs[1].toString()); + + for(int i=0; i= data.length) { + return -1; + } + int ret = data[pos]; + pos++; + + if(ret < 0) ret += 256; + return ret; + } + + /** + * Reads the requested number of bytes, or the chunk + * size, whichever is lower. + * Quite often will simply claim to have no data + */ + public int read(byte[] b, int off, int len) throws IOException { + // Keep the length within the chunk size + if(len > chunkSize) { + len = chunkSize; + } + // Don't read off the end of the data + if(pos + len > data.length) { + len = data.length - pos; + + // Spot when we're out of data + if(len == 0) { + return -1; + } + } + + // 75% of the time, claim there's no data + if(claimNoData()) { + return 0; + } + + // Copy, and return what we read + System.arraycopy(data, pos, b, off, len); + pos += len; + return len; + } + + public int read(byte[] b) throws IOException { + return read(b, 0, b.length); + } + + } /** * main method to run the unit tests -- 2.39.5