From 946dea40a7992b14202b53aeb4e8b7aad9e6247f Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Mon, 4 Aug 2008 21:31:51 +0000 Subject: [PATCH] Merged revisions 638786-638802,638805-638811,638813-638814,638816-639230,639233-639241,639243-639253,639255-639486,639488-639601,639603-639835,639837-639917,639919-640056,640058-640710,640712-641156,641158-641184,641186-641795,641797-641798,641800-641933,641935-641963,641965-641966,641968-641995,641997-642230,642232-642562,642564-642565,642568-642570,642572-642573,642576-642736,642739-642877,642879,642881-642890,642892-642903,642905-642945,642947-643624,643626-643653,643655-643669,643671,643673-643830,643832-643833,643835-644342,644344-644472,644474-644508,644510-645347,645349-645351,645353-645559,645561-645565,645568-645951,645953-646193,646195-646311,646313-646404,646406-646665,646667-646853,646855-646869,646871-647151,647153-647185,647187-647277,647279-647566,647568-647573,647575,647578-647711,647714-647737,647739-647823,647825-648155,648157-648202,648204-648273,648275,648277-648302,648304-648333,648335-648588,648590-648622,648625-648673,648675-649141,649144,649146-649556,649558-649795,649799,649801-649910,649912-649913,649915-650128,650131-650132,650134-650137,650140-650914,650916-651991,651993-652284,652286-652287,652289,652291,652293-652297,652299-652328,652330-652425,652427-652445,652447-652560,652562-652933,652935,652937-652993,652995-653116,653118-653124,653126-653483,653487-653519,653522-653550,653552-653607,653609-653667,653669-653674,653676-653814,653817-653830,653832-653891,653893-653944,653946-654055,654057-654355,654357-654365,654367-654648,654651-655215,655217-655277,655279-655281,655283-655911,655913-656212,656214,656216-656251,656253-656698,656700-656756,656758-656892,656894-657135,657137-657165,657168-657179,657181-657354,657356-657357,657359-657701,657703-657874,657876-658032,658034-658284,658286,658288-658301,658303-658307,658309-658321,658323-658335,658337-658348,658351,658353-658832,658834-658983,658985,658987-659066,659068-659402,659404-659428,659430-659451,659453-659454,659456-659461,659463-659477,659479-659524,659526-659571,659574,659576-660255,660257-660262,660264-660279,660281-660343,660345-660473,660475-660827,660829-660833,660835-660888,660890-663321,663323-663435,663437-663764,663766-663854,663856-664219,664221-664489,664494-664514,664516-668013,668015-668142,668144-668152,668154,668156-668256,668258,668260-669139,669141-669455,669457-669657,669659-669808,669810-670189,670191-671321,671323-672229,672231-672549,672551-672552,672554-672561,672563-672566,672568,672571-673049,673051-673852,673854-673862,673864-673986,673988-673996,673998-674347,674349-674890,674892-674910,674912-674936,674938-674952,674954-675078,675080-675085,675087-675217,675219-675660,675662-675670,675672-675716,675718-675726,675728-675733,675735-675775,675777-675782,675784,675786-675791,675794-675852,675854-676200,676202,676204,676206-676220,676222-676309,676311-676456,676458-676994,676996-677027,677030-677040,677042-677056,677058-677375,677377-677968,677970-677971,677973,677975-677994,677996-678286,678288-678538,678540-680393,680395-680469,680471-680529,680531-680852,680854-681529,681531-681571,681573-682224,682226,682228,682231-682281,682283-682335,682337-682511 via svnmerge from https://svn.apache.org/repos/asf/poi/trunk ........ r682508 | josh | 2008-08-04 22:08:11 +0100 (Mon, 04 Aug 2008) | 1 line Patch 44894 - refactoring duplicate logic from EventRecordFactory to RecordFactory ........ r682510 | josh | 2008-08-04 22:14:37 +0100 (Mon, 04 Aug 2008) | 1 line removed debugging code leftover from r682508 (patch 44894) ........ r682511 | nick | 2008-08-04 22:21:16 +0100 (Mon, 04 Aug 2008) | 1 line Fix bug #45538 - Include excel headers and footers in the output of ExcelExtractor ........ git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@682516 13f79535-47bb-0310-9956-ffa450edef68 --- src/documentation/content/xdocs/changes.xml | 2 + src/documentation/content/xdocs/status.xml | 2 + .../hssf/eventmodel/EventRecordFactory.java | 478 ++------------- .../poi/hssf/eventmodel/ModelFactory.java | 3 +- .../poi/hssf/extractor/ExcelExtractor.java | 39 ++ .../apache/poi/hssf/record/RecordFactory.java | 570 ++++++++++-------- .../apache/poi/hssf/usermodel/HSSFFooter.java | 3 +- .../apache/poi/hssf/usermodel/HSSFHeader.java | 2 +- .../poi/hssf/usermodel/HSSFWorkbook.java | 3 - .../poi/hssf/usermodel/HeaderFooter.java | 24 + .../apache/poi/ss/usermodel/HeaderFooter.java | 32 + .../poi/hssf/data/45538_classic_Footer.xls | Bin 0 -> 98816 bytes .../poi/hssf/data/45538_classic_Header.xls | Bin 0 -> 105984 bytes .../poi/hssf/data/45538_form_Footer.xls | Bin 0 -> 103936 bytes .../poi/hssf/data/45538_form_Header.xls | Bin 0 -> 89600 bytes .../eventmodel/TestEventRecordFactory.java | 142 ++--- .../hssf/extractor/TestExcelExtractor.java | 16 + .../org/apache/poi/hssf/model/TestSheet.java | 4 +- .../hssf/usermodel/TestDataValidation.java | 4 +- 19 files changed, 533 insertions(+), 791 deletions(-) create mode 100644 src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java create mode 100644 src/java/org/apache/poi/ss/usermodel/HeaderFooter.java create mode 100644 src/testcases/org/apache/poi/hssf/data/45538_classic_Footer.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/45538_classic_Header.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/45538_form_Footer.xls create mode 100644 src/testcases/org/apache/poi/hssf/data/45538_form_Header.xls diff --git a/src/documentation/content/xdocs/changes.xml b/src/documentation/content/xdocs/changes.xml index 8e167940b..569691b6c 100644 --- a/src/documentation/content/xdocs/changes.xml +++ b/src/documentation/content/xdocs/changes.xml @@ -52,6 +52,8 @@ Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx + 45538 - Include excel headers and footers in the output of ExcelExtractor + 44894 - refactor duplicate logic from EventRecordFactory to RecordFactory Support for Headers / Footers in HSLF 44953 - Extensive fixes for data validation 45519 - Fixed to keep datavalidation records together diff --git a/src/documentation/content/xdocs/status.xml b/src/documentation/content/xdocs/status.xml index 790390b02..1b665f1ae 100644 --- a/src/documentation/content/xdocs/status.xml +++ b/src/documentation/content/xdocs/status.xml @@ -49,6 +49,8 @@ Created a common interface for handling Excel files, irrespective of if they are .xls or .xlsx + 45538 - Include excel headers and footers in the output of ExcelExtractor + 44894 - refactor duplicate logic from EventRecordFactory to RecordFactory Support for Headers / Footers in HSLF 44953 - Extensive fixes for data validation 45519 - Fixed to keep datavalidation records together diff --git a/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java b/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java index 8c4abb76a..5cdd81370 100644 --- a/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java +++ b/src/java/org/apache/poi/hssf/eventmodel/EventRecordFactory.java @@ -18,241 +18,60 @@ package org.apache.poi.hssf.eventmodel; import java.io.InputStream; -import java.lang.reflect.Constructor; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.Map; - -import org.apache.poi.hssf.record.BOFRecord; -import org.apache.poi.hssf.record.BackupRecord; -import org.apache.poi.hssf.record.BlankRecord; -import org.apache.poi.hssf.record.BookBoolRecord; -import org.apache.poi.hssf.record.BoolErrRecord; -import org.apache.poi.hssf.record.BottomMarginRecord; -import org.apache.poi.hssf.record.BoundSheetRecord; -import org.apache.poi.hssf.record.CalcCountRecord; -import org.apache.poi.hssf.record.CalcModeRecord; -import org.apache.poi.hssf.record.CodepageRecord; -import org.apache.poi.hssf.record.ColumnInfoRecord; -import org.apache.poi.hssf.record.ContinueRecord; -import org.apache.poi.hssf.record.CountryRecord; -import org.apache.poi.hssf.record.DBCellRecord; -import org.apache.poi.hssf.record.DSFRecord; -import org.apache.poi.hssf.record.DateWindow1904Record; -import org.apache.poi.hssf.record.DefaultColWidthRecord; -import org.apache.poi.hssf.record.DefaultRowHeightRecord; -import org.apache.poi.hssf.record.DeltaRecord; -import org.apache.poi.hssf.record.DimensionsRecord; -import org.apache.poi.hssf.record.EOFRecord; -import org.apache.poi.hssf.record.ExtSSTRecord; -import org.apache.poi.hssf.record.ExtendedFormatRecord; -import org.apache.poi.hssf.record.ExternSheetRecord; -import org.apache.poi.hssf.record.FnGroupCountRecord; -import org.apache.poi.hssf.record.FontRecord; -import org.apache.poi.hssf.record.FooterRecord; -import org.apache.poi.hssf.record.FormatRecord; -import org.apache.poi.hssf.record.GridsetRecord; -import org.apache.poi.hssf.record.GutsRecord; -import org.apache.poi.hssf.record.HCenterRecord; -import org.apache.poi.hssf.record.HeaderRecord; -import org.apache.poi.hssf.record.HideObjRecord; -import org.apache.poi.hssf.record.IndexRecord; -import org.apache.poi.hssf.record.InterfaceEndRecord; -import org.apache.poi.hssf.record.InterfaceHdrRecord; -import org.apache.poi.hssf.record.IterationRecord; -import org.apache.poi.hssf.record.LabelRecord; -import org.apache.poi.hssf.record.LabelSSTRecord; -import org.apache.poi.hssf.record.LeftMarginRecord; -import org.apache.poi.hssf.record.MMSRecord; -import org.apache.poi.hssf.record.MergeCellsRecord; -import org.apache.poi.hssf.record.MulBlankRecord; -import org.apache.poi.hssf.record.MulRKRecord; -import org.apache.poi.hssf.record.NameRecord; -import org.apache.poi.hssf.record.NumberRecord; -import org.apache.poi.hssf.record.PaneRecord; -import org.apache.poi.hssf.record.PaletteRecord; -import org.apache.poi.hssf.record.PasswordRecord; -import org.apache.poi.hssf.record.PasswordRev4Record; -import org.apache.poi.hssf.record.PrecisionRecord; -import org.apache.poi.hssf.record.PrintGridlinesRecord; -import org.apache.poi.hssf.record.PrintHeadersRecord; -import org.apache.poi.hssf.record.PrintSetupRecord; -import org.apache.poi.hssf.record.ProtectRecord; -import org.apache.poi.hssf.record.ProtectionRev4Record; -import org.apache.poi.hssf.record.RKRecord; -import org.apache.poi.hssf.record.Record; -import org.apache.poi.hssf.record.RecordFormatException; -import org.apache.poi.hssf.record.RecordInputStream; -import org.apache.poi.hssf.record.RefModeRecord; -import org.apache.poi.hssf.record.RefreshAllRecord; -import org.apache.poi.hssf.record.RightMarginRecord; -import org.apache.poi.hssf.record.RowRecord; -import org.apache.poi.hssf.record.SSTRecord; -import org.apache.poi.hssf.record.SaveRecalcRecord; -import org.apache.poi.hssf.record.SelectionRecord; -import org.apache.poi.hssf.record.SharedFormulaRecord; -import org.apache.poi.hssf.record.StringRecord; -import org.apache.poi.hssf.record.StyleRecord; -import org.apache.poi.hssf.record.TabIdRecord; -import org.apache.poi.hssf.record.TableRecord; -import org.apache.poi.hssf.record.TopMarginRecord; -import org.apache.poi.hssf.record.UnknownRecord; -import org.apache.poi.hssf.record.UseSelFSRecord; -import org.apache.poi.hssf.record.VCenterRecord; -import org.apache.poi.hssf.record.WSBoolRecord; -import org.apache.poi.hssf.record.WindowOneRecord; -import org.apache.poi.hssf.record.WindowProtectRecord; -import org.apache.poi.hssf.record.WindowTwoRecord; -import org.apache.poi.hssf.record.WriteAccessRecord; -import org.apache.poi.hssf.record.WriteProtectRecord; -import org.apache.poi.hssf.record.FilePassRecord; -import org.apache.poi.hssf.record.NoteRecord; +import java.util.Arrays; +import org.apache.poi.hssf.record.*; /** * Event-based record factory. As opposed to RecordFactory - * this refactored version throws record events as it comes - * accross the records. I throws the "lazily" one record behind - * to ensure that ContinueRecords are processed first. + * this version sends {@link ERFListener#processRecord(Record) } messages to + * the supplied listener. Record notifications are sent one record behind + * to ensure that {@link ContinueRecord}s are processed first. * * @author Andrew C. Oliver (acoliver@apache.org) - probably to blame for the bugs (so yank his chain on the list) * @author Marc Johnson (mjohnson at apache dot org) - methods taken from RecordFactory * @author Glen Stampoultzis (glens at apache.org) - methods taken from RecordFactory * @author Csaba Nagy (ncsaba at yahoo dot com) */ -public class EventRecordFactory -{ - - /** - * contains the classes for all the records we want to parse. - */ - private static final Class[] records; +public final class EventRecordFactory { - static { - records = new Class[] - { - BOFRecord.class, InterfaceHdrRecord.class, MMSRecord.class, - InterfaceEndRecord.class, WriteAccessRecord.class, - CodepageRecord.class, DSFRecord.class, TabIdRecord.class, - FnGroupCountRecord.class, WindowProtectRecord.class, - ProtectRecord.class, PasswordRecord.class, ProtectionRev4Record.class, - PasswordRev4Record.class, WindowOneRecord.class, BackupRecord.class, - HideObjRecord.class, DateWindow1904Record.class, - PrecisionRecord.class, RefreshAllRecord.class, BookBoolRecord.class, - FontRecord.class, FormatRecord.class, ExtendedFormatRecord.class, - StyleRecord.class, UseSelFSRecord.class, BoundSheetRecord.class, - CountryRecord.class, SSTRecord.class, ExtSSTRecord.class, - EOFRecord.class, IndexRecord.class, CalcModeRecord.class, - CalcCountRecord.class, RefModeRecord.class, IterationRecord.class, - DeltaRecord.class, SaveRecalcRecord.class, PrintHeadersRecord.class, - PrintGridlinesRecord.class, GridsetRecord.class, GutsRecord.class, - DefaultRowHeightRecord.class, WSBoolRecord.class, HeaderRecord.class, - FooterRecord.class, HCenterRecord.class, VCenterRecord.class, - PrintSetupRecord.class, DefaultColWidthRecord.class, - DimensionsRecord.class, RowRecord.class, LabelSSTRecord.class, - RKRecord.class, NumberRecord.class, DBCellRecord.class, - WindowTwoRecord.class, SelectionRecord.class, ContinueRecord.class, - LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class, - MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class, - BoolErrRecord.class, ExternSheetRecord.class, NameRecord.class, - LeftMarginRecord.class, RightMarginRecord.class, - TopMarginRecord.class, BottomMarginRecord.class, - PaletteRecord.class, StringRecord.class, SharedFormulaRecord.class, - WriteProtectRecord.class, FilePassRecord.class, PaneRecord.class, - NoteRecord.class, TableRecord.class - }; - - } - - /** - * cache of the recordsToMap(); - */ - private static Map recordsMap = recordsToMap(records); + private final ERFListener _listener; + private final short[] _sids; /** - * cache of the return of getAllKnownSids so that we don't have to - * expensively get them every time. - */ - private static short[] sidscache; - - /** - * List of the listners that are registred. should all be ERFListener - */ - private List listeners; - - /** - * instance is abortable or not - */ - private boolean abortable; - - /** - * Construct an abortable EventRecordFactory. - * The same as calling new EventRecordFactory(true) - * @see #EventRecordFactory(boolean) - */ - public EventRecordFactory() { - this(true); - } - - /** - * Create an EventRecordFactory - * @param abortable specifies whether the return from the listener - * handler functions are obeyed. False means they are ignored. True - * means the event loop exits on error. - */ - public EventRecordFactory(boolean abortable) { - this.abortable = abortable; - listeners = new ArrayList(recordsMap.size()); - - if (sidscache == null) { - sidscache = getAllKnownRecordSIDs(); - } - - } - - /** - * Register a listener for records. These can be for all records - * or just a subset. - * + * * @param sids an array of Record.sid values identifying the records * the listener will work with. Alternatively if this is "null" then - * all records are passed. + * all records are passed. For all 'known' record types use {@link RecordFactory#getAllKnownRecordSIDs()} */ - public void registerListener(ERFListener listener, short[] sids) { - if (sids == null) - sids = sidscache; - ERFListener wrapped = new ListenerWrapper(listener, sids, abortable); - listeners.add(wrapped); - } - - /** - * used for unit tests to test the registration of record listeners. - * @return Iterator of ERFListeners - */ - protected Iterator listeners() { - return listeners.iterator(); + public EventRecordFactory(ERFListener listener, short[] sids) { + _listener = listener; + if (sids == null) { + _sids = null; + } else { + _sids = (short[]) sids.clone(); + Arrays.sort(_sids); // for faster binary search + } } + private boolean isSidIncluded(short sid) { + if (_sids == null) { + return true; + } + return Arrays.binarySearch(_sids, sid) >= 0; + } + /** * sends the record event to all registered listeners. * @param record the record to be thrown. - * @return boolean abort. If exitability is turned on this aborts - * out of the event loop should any listener specify to do so. + * @return false to abort. This aborts + * out of the event loop should the listener return false */ - private boolean throwRecordEvent(Record record) - { - boolean result = true; - Iterator i = listeners.iterator(); - - while (i.hasNext()) { - result = ((ERFListener) i.next()).processRecord(record); - if (abortable == true && result == false) { - break; - } - } - return result; + private boolean processRecord(Record record) { + if (!isSidIncluded(record.getSid())) { + return true; + } + return _listener.processRecord(record); } /** @@ -264,220 +83,39 @@ public class EventRecordFactory * @exception RecordFormatException on error processing the * InputStream */ - public void processRecords(InputStream in) - throws RecordFormatException - { - Record last_record = null; + public void processRecords(InputStream in) throws RecordFormatException { + Record last_record = null; RecordInputStream recStream = new RecordInputStream(in); while (recStream.hasNextRecord()) { - recStream.nextRecord(); - Record[] recs = createRecord(recStream); // handle MulRK records - if (recs.length > 1) - { - for (int k = 0; k < recs.length; k++) - { - if ( last_record != null ) { - if (throwRecordEvent(last_record) == false && abortable == true) { - last_record = null; - break; - } - } - last_record = - recs[ k ]; // do to keep the algorythm homogenous...you can't - } // actually continue a number record anyhow. - } - else - { - Record record = recs[ 0 ]; - - if (record != null) - { - if (last_record != null) { - if (throwRecordEvent(last_record) == false && abortable == true) { - last_record = null; - break; - } - } - - last_record = record; - } + recStream.nextRecord(); + Record[] recs = RecordFactory.createRecord(recStream); // handle MulRK records + if (recs.length > 1) { + for (int k = 0; k < recs.length; k++) { + if ( last_record != null ) { + if (!processRecord(last_record)) { + return; } } + last_record = recs[ k ]; // do to keep the algorithm homogeneous...you can't + } // actually continue a number record anyhow. + } else { + Record record = recs[ 0 ]; - - if (last_record != null) { - throwRecordEvent(last_record); - } - } - - /** - * create a record, if there are MUL records than multiple records - * are returned digested into the non-mul form. - */ - public static Record [] createRecord(RecordInputStream in) - { - Record retval = null; - Record[] realretval = null; - - try - { - Constructor constructor = - ( Constructor ) recordsMap.get(new Short(in.getSid())); - - if (constructor != null) - { - retval = ( Record ) constructor.newInstance(new Object[] - { - in - }); - } - else - { - retval = new UnknownRecord(in); - } - } - catch (Exception introspectionException) - { - throw new RecordFormatException("Unable to construct record instance" , introspectionException); - } - if (retval instanceof RKRecord) - { - RKRecord rk = ( RKRecord ) retval; - NumberRecord num = new NumberRecord(); - - num.setColumn(rk.getColumn()); - num.setRow(rk.getRow()); - num.setXFIndex(rk.getXFIndex()); - num.setValue(rk.getRKNumber()); - retval = num; - } - else if (retval instanceof DBCellRecord) - { - retval = null; - } - else if (retval instanceof MulRKRecord) - { - MulRKRecord mrk = ( MulRKRecord ) retval; - - realretval = new Record[ mrk.getNumColumns() ]; - for (int k = 0; k < mrk.getNumColumns(); k++) - { - NumberRecord nr = new NumberRecord(); - - nr.setColumn(( short ) (k + mrk.getFirstColumn())); - nr.setRow(mrk.getRow()); - nr.setXFIndex(mrk.getXFAt(k)); - nr.setValue(mrk.getRKNumberAt(k)); - realretval[ k ] = nr; - } - } - else if (retval instanceof MulBlankRecord) - { - MulBlankRecord mb = ( MulBlankRecord ) retval; - - realretval = new Record[ mb.getNumColumns() ]; - for (int k = 0; k < mb.getNumColumns(); k++) - { - BlankRecord br = new BlankRecord(); - - br.setColumn(( short ) (k + mb.getFirstColumn())); - br.setRow(mb.getRow()); - br.setXFIndex(mb.getXFAt(k)); - realretval[ k ] = br; - } - } - if (realretval == null) - { - realretval = new Record[ 1 ]; - realretval[ 0 ] = retval; - } - return realretval; - } - - /** - * @return an array of all the SIDS for all known records - */ - public static short [] getAllKnownRecordSIDs() - { - short[] results = new short[ recordsMap.size() ]; - int i = 0; - - for (Iterator iterator = recordsMap.keySet().iterator(); - iterator.hasNext(); ) - { - Short sid = ( Short ) iterator.next(); - - results[ i++ ] = sid.shortValue(); - } - return results; - } - - /** - * gets the record constructors and sticks them in the map by SID - * @return map of SIDs to short,short,byte[] constructors for Record classes - * most of org.apache.poi.hssf.record.* - */ - private static Map recordsToMap(Class [] records) - { - Map result = new HashMap(); - Constructor constructor; - - for (int i = 0; i < records.length; i++) - { - Class record = null; - short sid = 0; - - record = records[ i ]; - try - { - sid = record.getField("sid").getShort(null); - constructor = record.getConstructor(new Class[] - { - RecordInputStream.class - }); - } - catch (Exception illegalArgumentException) - { - throw new RecordFormatException( - "Unable to determine record types"); - } - result.put(new Short(sid), constructor); - } - return result; - } - -} - -/** - * ListenerWrapper just wraps an ERFListener and adds support for throwing - * the event to multiple SIDs - */ -class ListenerWrapper implements ERFListener { - private ERFListener listener; - private short[] sids; - private boolean abortable; - - ListenerWrapper(ERFListener listener, short[] sids, boolean abortable) { - this.listener = listener; - this.sids = sids; - this.abortable = abortable; - } - - - public boolean processRecord(Record rec) - { - boolean result = true; - for (int k = 0; k < sids.length; k++) { - if (sids[k] == rec.getSid()) { - result = listener.processRecord(rec); - - if (abortable == true && result == false) { - break; + if (record != null) { + if (last_record != null) { + if (!processRecord(last_record)) { + return; + } + } + last_record = record; } } } - return result; - } -} + + if (last_record != null) { + processRecord(last_record); + } + } +} \ No newline at end of file diff --git a/src/java/org/apache/poi/hssf/eventmodel/ModelFactory.java b/src/java/org/apache/poi/hssf/eventmodel/ModelFactory.java index ade453204..d75ca6c2e 100644 --- a/src/java/org/apache/poi/hssf/eventmodel/ModelFactory.java +++ b/src/java/org/apache/poi/hssf/eventmodel/ModelFactory.java @@ -65,8 +65,7 @@ public class ModelFactory implements ERFListener * Start processing the Workbook stream into Model events. */ public void run(InputStream stream) { - EventRecordFactory factory = new EventRecordFactory(true); - factory.registerListener(this,null); + EventRecordFactory factory = new EventRecordFactory(this,null); lastEOF = true; factory.processRecords(stream); } diff --git a/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java b/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java index 75a73c654..efa75e0d5 100644 --- a/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java +++ b/src/java/org/apache/poi/hssf/extractor/ExcelExtractor.java @@ -19,8 +19,11 @@ package org.apache.poi.hssf.extractor; import java.io.IOException; import org.apache.poi.POIOLE2TextExtractor; +import org.apache.poi.hssf.usermodel.HeaderFooter; import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFComment; +import org.apache.poi.hssf.usermodel.HSSFFooter; +import org.apache.poi.hssf.usermodel.HSSFHeader; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; @@ -89,6 +92,13 @@ public class ExcelExtractor extends POIOLE2TextExtractor { } } + // Header text, if there is any + if(sheet.getHeader() != null) { + text.append( + extractHeaderFooter(sheet.getHeader()) + ); + } + int firstRow = sheet.getFirstRowNum(); int lastRow = sheet.getLastRowNum(); for(int j=firstRow;j<=lastRow;j++) { @@ -154,8 +164,37 @@ public class ExcelExtractor extends POIOLE2TextExtractor { // Finish off the row text.append("\n"); } + + // Finally Feader text, if there is any + if(sheet.getFooter() != null) { + text.append( + extractHeaderFooter(sheet.getFooter()) + ); + } } return text.toString(); } + + private String extractHeaderFooter(HeaderFooter hf) { + StringBuffer text = new StringBuffer(); + + if(hf.getLeft() != null) { + text.append(hf.getLeft()); + } + if(hf.getCenter() != null) { + if(text.length() > 0) + text.append("\t"); + text.append(hf.getCenter()); + } + if(hf.getRight() != null) { + if(text.length() > 0) + text.append("\t"); + text.append(hf.getRight()); + } + if(text.length() > 0) + text.append("\n"); + + return text.toString(); + } } diff --git a/src/java/org/apache/poi/hssf/record/RecordFactory.java b/src/java/org/apache/poi/hssf/record/RecordFactory.java index aaee94991..6f03c2c11 100644 --- a/src/java/org/apache/poi/hssf/record/RecordFactory.java +++ b/src/java/org/apache/poi/hssf/record/RecordFactory.java @@ -1,4 +1,3 @@ - /* ==================================================================== Licensed to the Apache Software Foundation (ASF) under one or more contributor license agreements. See the NOTICE file distributed with @@ -15,294 +14,359 @@ See the License for the specific language governing permissions and limitations under the License. ==================================================================== */ - package org.apache.poi.hssf.record; import java.io.InputStream; import java.lang.reflect.Constructor; -import java.util.*; +import java.lang.reflect.InvocationTargetException; +import java.lang.reflect.Modifier; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Map; +import java.util.Set; /** * Title: Record Factory

* Description: Takes a stream and outputs an array of Record objects.

* - * @deprecated use {@link org.apache.poi.hssf.eventmodel.EventRecordFactory} instead * @see org.apache.poi.hssf.eventmodel.EventRecordFactory * @author Andrew C. Oliver (acoliver at apache dot org) * @author Marc Johnson (mjohnson at apache dot org) * @author Glen Stampoultzis (glens at apache.org) * @author Csaba Nagy (ncsaba at yahoo dot com) */ +public final class RecordFactory { + private static final int NUM_RECORDS = 512; -public class RecordFactory -{ - private static int NUM_RECORDS = 10000; - private static final Class[] records; + private static final Class[] CONSTRUCTOR_ARGS = { RecordInputStream.class, }; - static { - records = new Class[] - { - BOFRecord.class, InterfaceHdrRecord.class, MMSRecord.class, - InterfaceEndRecord.class, WriteAccessRecord.class, - CodepageRecord.class, DSFRecord.class, TabIdRecord.class, - FnGroupCountRecord.class, WindowProtectRecord.class, - ProtectRecord.class, PasswordRecord.class, ProtectionRev4Record.class, - PasswordRev4Record.class, WindowOneRecord.class, BackupRecord.class, - HideObjRecord.class, DateWindow1904Record.class, - PrecisionRecord.class, RefreshAllRecord.class, BookBoolRecord.class, - FontRecord.class, FormatRecord.class, ExtendedFormatRecord.class, - StyleRecord.class, UseSelFSRecord.class, BoundSheetRecord.class, - CountryRecord.class, SSTRecord.class, ExtSSTRecord.class, - EOFRecord.class, IndexRecord.class, CalcModeRecord.class, - CalcCountRecord.class, RefModeRecord.class, IterationRecord.class, - DeltaRecord.class, SaveRecalcRecord.class, PrintHeadersRecord.class, - PrintGridlinesRecord.class, GridsetRecord.class, GutsRecord.class, - DefaultRowHeightRecord.class, WSBoolRecord.class, HeaderRecord.class, - FooterRecord.class, HCenterRecord.class, VCenterRecord.class, - PrintSetupRecord.class, DefaultColWidthRecord.class, - DimensionsRecord.class, RowRecord.class, LabelSSTRecord.class, - RKRecord.class, NumberRecord.class, DBCellRecord.class, - WindowTwoRecord.class, SelectionRecord.class, ContinueRecord.class, - LabelRecord.class, BlankRecord.class, ColumnInfoRecord.class, - MulRKRecord.class, MulBlankRecord.class, MergeCellsRecord.class, - FormulaRecord.class, BoolErrRecord.class, ExternSheetRecord.class, - NameRecord.class, LeftMarginRecord.class, RightMarginRecord.class, - TopMarginRecord.class, BottomMarginRecord.class, - DrawingRecord.class, DrawingGroupRecord.class, DrawingSelectionRecord.class, - ObjRecord.class, TextObjectRecord.class, - PaletteRecord.class, StringRecord.class, RecalcIdRecord.class, SharedFormulaRecord.class, - HorizontalPageBreakRecord.class, VerticalPageBreakRecord.class, - WriteProtectRecord.class, FilePassRecord.class, PaneRecord.class, - NoteRecord.class, ObjectProtectRecord.class, ScenarioProtectRecord.class, - FileSharingRecord.class, ChartTitleFormatRecord.class, - DVRecord.class, DVALRecord.class, UncalcedRecord.class, - ChartRecord.class, LegendRecord.class, ChartTitleFormatRecord.class, - SeriesRecord.class, SeriesTextRecord.class, - HyperlinkRecord.class, - ExternalNameRecord.class, // TODO - same changes in non-@deprecated version of this class - SupBookRecord.class, - CRNCountRecord.class, - CRNRecord.class, - CFHeaderRecord.class, - CFRuleRecord.class, - TableRecord.class - }; - } - private static Map recordsMap = recordsToMap(records); + /** + * contains the classes for all the records we want to parse.
+ * Note - this most but not *every* subclass of Record. + */ + private static final Class[] records = { + BackupRecord.class, + BlankRecord.class, + BOFRecord.class, + BookBoolRecord.class, + BoolErrRecord.class, + BottomMarginRecord.class, + BoundSheetRecord.class, + CalcCountRecord.class, + CalcModeRecord.class, + CFHeaderRecord.class, + CFRuleRecord.class, + ChartRecord.class, + ChartTitleFormatRecord.class, + CodepageRecord.class, + ColumnInfoRecord.class, + ContinueRecord.class, + CountryRecord.class, + CRNCountRecord.class, + CRNRecord.class, + DateWindow1904Record.class, + DBCellRecord.class, + DefaultColWidthRecord.class, + DefaultRowHeightRecord.class, + DeltaRecord.class, + DimensionsRecord.class, + DrawingGroupRecord.class, + DrawingRecord.class, + DrawingSelectionRecord.class, + DSFRecord.class, + DVALRecord.class, + DVRecord.class, + EOFRecord.class, + ExtendedFormatRecord.class, + ExternalNameRecord.class, + ExternSheetRecord.class, + ExtSSTRecord.class, + FilePassRecord.class, + FileSharingRecord.class, + FnGroupCountRecord.class, + FontRecord.class, + FooterRecord.class, + FormatRecord.class, + FormulaRecord.class, + GridsetRecord.class, + GutsRecord.class, + HCenterRecord.class, + HeaderRecord.class, + HideObjRecord.class, + HorizontalPageBreakRecord.class, + HyperlinkRecord.class, + IndexRecord.class, + InterfaceEndRecord.class, + InterfaceHdrRecord.class, + IterationRecord.class, + LabelRecord.class, + LabelSSTRecord.class, + LeftMarginRecord.class, + LegendRecord.class, + MergeCellsRecord.class, + MMSRecord.class, + MulBlankRecord.class, + MulRKRecord.class, + NameRecord.class, + NoteRecord.class, + NumberRecord.class, + ObjectProtectRecord.class, + ObjRecord.class, + PaletteRecord.class, + PaneRecord.class, + PasswordRecord.class, + PasswordRev4Record.class, + PrecisionRecord.class, + PrintGridlinesRecord.class, + PrintHeadersRecord.class, + PrintSetupRecord.class, + ProtectionRev4Record.class, + ProtectRecord.class, + RecalcIdRecord.class, + RefModeRecord.class, + RefreshAllRecord.class, + RightMarginRecord.class, + RKRecord.class, + RowRecord.class, + SaveRecalcRecord.class, + ScenarioProtectRecord.class, + SelectionRecord.class, + SeriesRecord.class, + SeriesTextRecord.class, + SharedFormulaRecord.class, + SSTRecord.class, + StringRecord.class, + StyleRecord.class, + SupBookRecord.class, + TabIdRecord.class, + TableRecord.class, + TextObjectRecord.class, + TopMarginRecord.class, + UncalcedRecord.class, + UseSelFSRecord.class, + VCenterRecord.class, + VerticalPageBreakRecord.class, + WindowOneRecord.class, + WindowProtectRecord.class, + WindowTwoRecord.class, + WriteAccessRecord.class, + WriteProtectRecord.class, + WSBoolRecord.class, + }; + + /** + * cache of the recordsToMap(); + */ + private static Map recordsMap = recordsToMap(records); - /** - * changes the default capacity (10000) to handle larger files - */ + private static short[] _allKnownRecordSIDs; + + /** + * create a record, if there are MUL records than multiple records + * are returned digested into the non-mul form. + */ + public static Record [] createRecord(RecordInputStream in) { + Constructor constructor = (Constructor) recordsMap.get(new Short(in.getSid())); - public static void setCapacity(int capacity) - { - NUM_RECORDS = capacity; - } + if (constructor == null) { + return new Record[] { new UnknownRecord(in), }; + } + + Record retval; - /** - * Create an array of records from an input stream - * - * @param in the InputStream from which the records will be - * obtained - * - * @return an array of Records created from the InputStream - * - * @exception RecordFormatException on error processing the - * InputStream - */ + try { + retval = ( Record ) constructor.newInstance(new Object[] { in }); + } catch (InvocationTargetException e) { + throw new RecordFormatException("Unable to construct record instance" , e.getTargetException()); + } catch (IllegalArgumentException e) { + throw new RuntimeException(e); + } catch (InstantiationException e) { + throw new RuntimeException(e); + } catch (IllegalAccessException e) { + throw new RuntimeException(e); + } + + if (retval instanceof RKRecord) { + // RK record is a slightly smaller alternative to NumberRecord + // POI likes NumberRecord better + RKRecord rk = ( RKRecord ) retval; + NumberRecord num = new NumberRecord(); - public static List createRecords(InputStream in) - throws RecordFormatException - { - ArrayList records = new ArrayList(NUM_RECORDS); + num.setColumn(rk.getColumn()); + num.setRow(rk.getRow()); + num.setXFIndex(rk.getXFIndex()); + num.setValue(rk.getRKNumber()); + return new Record[] { num, }; + } + if (retval instanceof DBCellRecord) { + // Not needed by POI. Regenerated from scratch by POI when spreadsheet is written + return new Record[] { null, }; + } + // expand multiple records where necessary + if (retval instanceof MulRKRecord) { + MulRKRecord mrk = ( MulRKRecord ) retval; - RecordInputStream recStream = new RecordInputStream(in); - DrawingRecord lastDrawingRecord = new DrawingRecord( ); - Record lastRecord = null; - while (recStream.hasNextRecord()) { - recStream.nextRecord(); - if (recStream.getSid() != 0) - { - Record[] recs = createRecord(recStream); // handle MulRK records + Record[] mulRecs = new Record[ mrk.getNumColumns() ]; + for (int k = 0; k < mrk.getNumColumns(); k++) { + NumberRecord nr = new NumberRecord(); - if (recs.length > 1) - { - for (int k = 0; k < recs.length; k++) - { - records.add( - recs[ k ]); // these will be number records - } - } - else - { - Record record = recs[ 0 ]; + nr.setColumn(( short ) (k + mrk.getFirstColumn())); + nr.setRow(mrk.getRow()); + nr.setXFIndex(mrk.getXFAt(k)); + nr.setValue(mrk.getRKNumberAt(k)); + mulRecs[ k ] = nr; + } + return mulRecs; + } + if (retval instanceof MulBlankRecord) { + MulBlankRecord mb = ( MulBlankRecord ) retval; - if (record != null) - { - if (record.getSid() == DrawingGroupRecord.sid - && lastRecord instanceof DrawingGroupRecord) - { - DrawingGroupRecord lastDGRecord = (DrawingGroupRecord) lastRecord; - lastDGRecord.join((AbstractEscherHolderRecord) record); - } - else if (record.getSid() == ContinueRecord.sid && - ((lastRecord instanceof ObjRecord) || (lastRecord instanceof TextObjectRecord))) { - // Drawing records have a very strange continue behaviour. - //There can actually be OBJ records mixed between the continues. - lastDrawingRecord.processContinueRecord( ((ContinueRecord)record).getData() ); - //we must rememeber the position of the continue record. - //in the serialization procedure the original structure of records must be preserved - records.add(record); - } else if (record.getSid() == ContinueRecord.sid && - (lastRecord instanceof DrawingGroupRecord)) { - ((DrawingGroupRecord)lastRecord).processContinueRecord(((ContinueRecord)record).getData()); - } else if (record.getSid() == ContinueRecord.sid && - (lastRecord instanceof StringRecord)) { - ((StringRecord)lastRecord).processContinueRecord(((ContinueRecord)record).getData()); - } else if (record.getSid() == ContinueRecord.sid) { - if (lastRecord instanceof UnknownRecord) { - //Gracefully handle records that we dont know about, - //that happen to be continued - records.add(record); - } else - throw new RecordFormatException("Unhandled Continue Record"); - } - else { - lastRecord = record; - if (record instanceof DrawingRecord) - lastDrawingRecord = (DrawingRecord) record; - records.add(record); - } - } - } - } - } + Record[] mulRecs = new Record[ mb.getNumColumns() ]; + for (int k = 0; k < mb.getNumColumns(); k++) { + BlankRecord br = new BlankRecord(); - return records; - } + br.setColumn(( short ) (k + mb.getFirstColumn())); + br.setRow(mb.getRow()); + br.setXFIndex(mb.getXFAt(k)); + mulRecs[ k ] = br; + } + return mulRecs; + } + return new Record[] { retval, }; + } - public static Record [] createRecord(RecordInputStream in) - { - Record retval; - Record[] realretval = null; + /** + * @return an array of all the SIDS for all known records + */ + public static short[] getAllKnownRecordSIDs() { + if (_allKnownRecordSIDs == null) { + short[] results = new short[ recordsMap.size() ]; + int i = 0; - try - { - Constructor constructor = - ( Constructor ) recordsMap.get(new Short(in.getSid())); + for (Iterator iterator = recordsMap.keySet().iterator(); iterator.hasNext(); ) { + Short sid = (Short) iterator.next(); - if (constructor != null) - { - retval = ( Record ) constructor.newInstance(new Object[] - { - in - }); - } - else - { - retval = new UnknownRecord(in); - } - } - catch (Exception introspectionException) - { - throw new RecordFormatException("Unable to construct record instance",introspectionException); - } - if (retval instanceof RKRecord) - { - RKRecord rk = ( RKRecord ) retval; - NumberRecord num = new NumberRecord(); + results[i++] = sid.shortValue(); + } + Arrays.sort(results); + _allKnownRecordSIDs = results; + } - num.setColumn(rk.getColumn()); - num.setRow(rk.getRow()); - num.setXFIndex(rk.getXFIndex()); - num.setValue(rk.getRKNumber()); - retval = num; - } - else if (retval instanceof DBCellRecord) - { - retval = null; - } - else if (retval instanceof MulRKRecord) - { - MulRKRecord mrk = ( MulRKRecord ) retval; + return (short[]) _allKnownRecordSIDs.clone(); + } - realretval = new Record[ mrk.getNumColumns() ]; - for (int k = 0; k < mrk.getNumColumns(); k++) - { - NumberRecord nr = new NumberRecord(); + /** + * gets the record constructors and sticks them in the map by SID + * @return map of SIDs to short,short,byte[] constructors for Record classes + * most of org.apache.poi.hssf.record.* + */ + private static Map recordsToMap(Class [] records) { + Map result = new HashMap(); + Set uniqueRecClasses = new HashSet(records.length * 3 / 2); - nr.setColumn(( short ) (k + mrk.getFirstColumn())); - nr.setRow(mrk.getRow()); - nr.setXFIndex(mrk.getXFAt(k)); - nr.setValue(mrk.getRKNumberAt(k)); - realretval[ k ] = nr; - } - } - else if (retval instanceof MulBlankRecord) - { - MulBlankRecord mb = ( MulBlankRecord ) retval; + for (int i = 0; i < records.length; i++) { - realretval = new Record[ mb.getNumColumns() ]; - for (int k = 0; k < mb.getNumColumns(); k++) - { - BlankRecord br = new BlankRecord(); + Class recClass = records[ i ]; + if(!Record.class.isAssignableFrom(recClass)) { + throw new RuntimeException("Invalid record sub-class (" + recClass.getName() + ")"); + } + if(Modifier.isAbstract(recClass.getModifiers())) { + throw new RuntimeException("Invalid record class (" + recClass.getName() + ") - must not be abstract"); + } + if(!uniqueRecClasses.add(recClass)) { + throw new RuntimeException("duplicate record class (" + recClass.getName() + ")"); + } + + short sid; + Constructor constructor; + try { + sid = recClass.getField("sid").getShort(null); + constructor = recClass.getConstructor(CONSTRUCTOR_ARGS); + } catch (Exception illegalArgumentException) { + throw new RecordFormatException( + "Unable to determine record types"); + } + Short key = new Short(sid); + if (result.containsKey(key)) { + Class prev = (Class)result.get(key); + throw new RuntimeException("duplicate record sid 0x" + Integer.toHexString(sid).toUpperCase() + + " for classes (" + recClass.getName() + ") and (" + prev.getName() + ")"); + } + result.put(key, constructor); + } + return result; + } - br.setColumn(( short ) (k + mb.getFirstColumn())); - br.setRow(mb.getRow()); - br.setXFIndex(mb.getXFAt(k)); - realretval[ k ] = br; - } - } - if (realretval == null) - { - realretval = new Record[ 1 ]; - realretval[ 0 ] = retval; - } - return realretval; - } + /** + * Create an array of records from an input stream + * + * @param in the InputStream from which the records will be obtained + * + * @return an array of Records created from the InputStream + * + * @exception RecordFormatException on error processing the InputStream + */ + public static List createRecords(InputStream in) throws RecordFormatException { - public static short [] getAllKnownRecordSIDs() - { - short[] results = new short[ recordsMap.size() ]; - int i = 0; + List records = new ArrayList(NUM_RECORDS); - for (Iterator iterator = recordsMap.keySet().iterator(); - iterator.hasNext(); ) - { - Short sid = ( Short ) iterator.next(); + RecordInputStream recStream = new RecordInputStream(in); + DrawingRecord lastDrawingRecord = new DrawingRecord( ); + Record lastRecord = null; + while (recStream.hasNextRecord()) { + recStream.nextRecord(); + if (recStream.getSid() != 0) { + Record[] recs = createRecord(recStream); // handle MulRK records - results[ i++ ] = sid.shortValue(); - } - return results; - } + if (recs.length > 1) { + for (int k = 0; k < recs.length; k++) { + records.add(recs[ k ]); // these will be number records + } + } else { + Record record = recs[ 0 ]; - private static Map recordsToMap(Class [] records) - { - Map result = new HashMap(); - Constructor constructor; - - for (int i = 0; i < records.length; i++) - { - Class record; - short sid; - - record = records[ i ]; - try - { - sid = record.getField("sid").getShort(null); - constructor = record.getConstructor(new Class[] - { - RecordInputStream.class - }); - } - catch (Exception illegalArgumentException) - { - throw new RecordFormatException( - "Unable to determine record types", illegalArgumentException); - } - result.put(new Short(sid), constructor); - } - return result; - } + if (record != null) { + if (record.getSid() == DrawingGroupRecord.sid + && lastRecord instanceof DrawingGroupRecord) { + DrawingGroupRecord lastDGRecord = (DrawingGroupRecord) lastRecord; + lastDGRecord.join((AbstractEscherHolderRecord) record); + } else if (record.getSid() == ContinueRecord.sid && + ((lastRecord instanceof ObjRecord) || (lastRecord instanceof TextObjectRecord))) { + // Drawing records have a very strange continue behaviour. + //There can actually be OBJ records mixed between the continues. + lastDrawingRecord.processContinueRecord( ((ContinueRecord)record).getData() ); + //we must remember the position of the continue record. + //in the serialization procedure the original structure of records must be preserved + records.add(record); + } else if (record.getSid() == ContinueRecord.sid && + (lastRecord instanceof DrawingGroupRecord)) { + ((DrawingGroupRecord)lastRecord).processContinueRecord(((ContinueRecord)record).getData()); + } else if (record.getSid() == ContinueRecord.sid && + (lastRecord instanceof StringRecord)) { + ((StringRecord)lastRecord).processContinueRecord(((ContinueRecord)record).getData()); + } else if (record.getSid() == ContinueRecord.sid) { + if (lastRecord instanceof UnknownRecord) { + //Gracefully handle records that we dont know about, + //that happen to be continued + records.add(record); + } else + throw new RecordFormatException("Unhandled Continue Record"); + } else { + lastRecord = record; + if (record instanceof DrawingRecord) { + lastDrawingRecord = (DrawingRecord) record; + } + records.add(record); + } + } + } + } + } + return records; + } } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFFooter.java b/src/java/org/apache/poi/hssf/usermodel/HSSFFooter.java index 4e62e8b47..d85f1b60e 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFFooter.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFFooter.java @@ -33,8 +33,7 @@ import org.apache.poi.ss.usermodel.Footer; *

* @author Shawn Laubach (slaubach at apache dot org) */ -public class HSSFFooter implements Footer { - +public class HSSFFooter implements Footer, HeaderFooter { FooterRecord footerRecord; String left; String center; diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFHeader.java b/src/java/org/apache/poi/hssf/usermodel/HSSFHeader.java index e1cd0b009..535b70efa 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFHeader.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFHeader.java @@ -33,7 +33,7 @@ import org.apache.poi.ss.usermodel.Header; * * @author Shawn Laubach (slaubach at apache dot org) */ -public class HSSFHeader implements Header +public class HSSFHeader implements Header, HeaderFooter { HeaderRecord headerRecord; diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index d5b801c5c..5422776fc 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -34,7 +34,6 @@ import org.apache.poi.ddf.EscherBSERecord; import org.apache.poi.ddf.EscherBitmapBlip; import org.apache.poi.ddf.EscherBlipRecord; import org.apache.poi.ddf.EscherRecord; -import org.apache.poi.hssf.eventmodel.EventRecordFactory; import org.apache.poi.hssf.model.Sheet; import org.apache.poi.hssf.model.Workbook; import org.apache.poi.hssf.record.AbstractEscherHolderRecord; @@ -264,8 +263,6 @@ public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.userm // it happens to be spelled. InputStream stream = directory.createDocumentInputStream(workbookName); - EventRecordFactory factory = new EventRecordFactory(); - List records = RecordFactory.createRecords(stream); workbook = Workbook.createWorkbook(records); diff --git a/src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java b/src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java new file mode 100644 index 000000000..44dfd7956 --- /dev/null +++ b/src/java/org/apache/poi/hssf/usermodel/HeaderFooter.java @@ -0,0 +1,24 @@ +/* ==================================================================== + 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; + +/** + * Common interface for {@link HSSFHeader} and + * {@link HSSFFooter}. + */ +public interface HeaderFooter extends org.apache.poi.ss.usermodel.HeaderFooter { +} diff --git a/src/java/org/apache/poi/ss/usermodel/HeaderFooter.java b/src/java/org/apache/poi/ss/usermodel/HeaderFooter.java new file mode 100644 index 000000000..c58f929e4 --- /dev/null +++ b/src/java/org/apache/poi/ss/usermodel/HeaderFooter.java @@ -0,0 +1,32 @@ +/* ==================================================================== + 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.ss.usermodel; + +/** + * Common interface for {@link Header} and + * {@link Footer}. + */ +public interface HeaderFooter { + public String getLeft(); + public void setLeft( String newLeft ); + + public String getCenter(); + public void setCenter( String newCenter ); + + public String getRight(); + public void setRight( String newRight ); +} diff --git a/src/testcases/org/apache/poi/hssf/data/45538_classic_Footer.xls b/src/testcases/org/apache/poi/hssf/data/45538_classic_Footer.xls new file mode 100644 index 0000000000000000000000000000000000000000..2ab1d241ca3db452dc2986b8980872dc617061e2 GIT binary patch literal 98816 zcmeHQ2YeL8_n*5ILJz&e5fXX|gf5Uk=mZE&Kxs#EAqQ#Z5;_v8DhLQFRY1T3DpdjL zARq`TD2fOuMQm8Gck=&!XLs-R_AU|er+Gme+I_IV^SnIXYX5t1y%zys-|=4}fx3Ped&z^~5=glJ-jw-B9mmlCQ#+9*?7}KiMI%vNoCh#S$fss;w2&!IKCz1t66-&M;l=|} zap!?gP2g}hg;c;(WWeiFXYLAknqOSACK->o)kTWQB-#p%D@8JCs$8s)U1ibG4a1l# z{{o+$N1k2Ojd58jrJSYW?P+j;Hjo(p6QxI z;R53p$v3V}zdcH^vefUw`NnnEeowCQ*N=jATG5^s&K!Aa4{M%TRB&>ZU(Ivz?uk)Z zG=gHgYOj(1>(H_M%Q_bNng7#X`BJX#AC1dqR_NjM2L9K5+d%vbvR(2 zPpbR3LDN+=zi4-hKEfuF#E=3A#GvJ@rY8`AvKzjS%36=;W!y=Q&pJT-|@Ps3)THOLQ0tL5ad*@J!P6oLGGB zO3?k8mfU?P%C_E;Gm0a>WWD3LCm$nX3e59F(Ew8PB4`(J7x$hy_lD)20T&fM*JMyp ztQBR12w4+St6{BLQFjau*DkC3R})W)in?ca_pv1n(IZqBPoaBvMvjQm$H!fD|61Z{ zbi{5L1}YM*sdxs;E`~Aj`WDH_uyBPJ*RA?ABs>JqhK0ut3$O0qP^=Sm7}13`Sa(gh z8-5$HUbJve2n-m~QXsD6Vq#ngHWAN?NL_+jY&Cr?s!UcNueo?mG)BC-A)(G3*1JQ! z9b8vtd9V{eo_P~HtX_5h81cMlP`}c#RlOoL{vmnSatv6Vk24# z0Y+r1Eay!u=etA0n?$u7l7?fjC24TO!Itqj?ufl8%A(5_;`=;{{8vuE2 z2~C&lQ0SWgkn(>)ed51T%HI?Id_M5?`M@{i17DU8d}BWF=kkF+o)3I>KJfhb$&db4 zNyp+LpB4GQ6@EPN6@EP7YxAMAIUo275?F1a3pOsI3bn=65uIOD3%kq(rQZAly$WQ)F zDto7&pL{k}@Gc((jw!#PzCSO^y_^Prq*SRzMHdwf_J6>ibSgOE$;ta_?5h#%uas9c zbXT(7_z4K|P}-Af=r_H=1JKuagI7Zb?G4V!yM$})Qi}(q{&<0xAfKM_!cq@wXmq|) zxYXL!k{Vp2@2}`pF%5oNB*a=`s|2gcc^g(A*zVu5O@xS($_-^zAFu;-UZ1;32PYKU-hx1ORYk=$WrAAQrFRalq z&B0>olkM6 zue4X5@=@>sH>4Y&wI_!1a<(&u{5s(tdhTqO4Dxrv-Q*mkrE8E6>8s`ImS3Ua8~AaK zH@djXArMOuvb{CnJL_+%u^&;}y;S%9!r3nv=rA>J?V-|d*7v9v0{w+Id}lct_;A>?3yEA1-a9_7OJP|D5ZK3;OdJ<|0yUM(!!LrKRC-U3aKTv7S3rrC8rZQRcdV z3oF`1v7tLur5NrGRVhZeC`yS%y0DtKC`P$MRf>(=p(@43E{amx(Jri}E{aXup(@3u z?ogFtGZ#gvEzMn6&0G{)xI_%>Q>+fV z!-9HTQnYsiK?O>RI5!Z=upFk0!H766Gu4`I&CbXgZ|P?nm%Y$jSajq&sm>W0;If41 zgce_Pv00Ps=_5(Kgy^h?fOrWE0(3Z_T|#u#Lr}g&L^r&^7hTgcbC5)^=+3;y+tWwe zlGKbA6Y-RGPg_oQmQ`k4ubga2$6xfy4FFCsx;4=2 zn_{zNTl(3vQ-NAU^k$0AyFT(RBb&5KiM}v{5(BJR>C6@LJ=|nQ%Q*w@+a}-1CKM#I zGLr47HcLjbB`($KaLm9f)pry5td!_t&$2lzBgR`g<)kOF?D+6(j`FZyMy92&eVp@| zjJfqiL(Hz}NjZ+}tnoAO?m;mkEF&1RlYNZMqCT|SWZW~=P4212XCz9EnSr+Xi>7=C z`NF`gZ$?g5qHPZ3#j*MZlRqSC@~;46FJ{gx&;EFNz!ZcaM73)sksQ<$fy^m~88dQm zy@k99yj~IiAR}Wk9es!u)xU-Y!Dx}lc_KGASNsUcT@w=|jVyviprmC2A&wDH!Yl_T z9fdE!S|MRbN~WdZM2n)=xn{Z#Z$^W}eWrG>J=t%H#aT-oZDkP3G6*Z}K}`KOaewe- z#8`-c)DmovNP0HX?wOM|!j^@L9=0UAH671-WTa=Oq>e}CwZb6Ko^DUeN#m7u9IvQE zR2!garCnMCnN)gI52+1x8`Ud`1c9YNAR9GxCsI?;O0ik`r=yUw9QN$-QoB;@iPn)B zmd;t$q#SFu&C)k9B_ku1kJ{%r?CCa#qbL*9=pv;cq*R2kzSdN0*7&-O>sbN;f~5M| zY@?~uXb@5}#-}0cSQDjg{w123>)>K*OSwKoEPvLg3rDcrFvSy-uENW{2Ntc13!Mc~a3h}$duEkIkLbf1i zqQH!nQB)-qn&@L2iL?v56(-A)YS*h@yLh}I>0!%G$w*>GsA(YBOVv547TS%f7SsVn ze>zzc?Wy)`XjD=SnH@w<%(k%1t@s~n&rZQjTBbF9yaoBHDisLXW=q21M`pGa!g8pJ zU7RHNs8@0_bQe$>mBtW?YYPe|6Kx_(#{xOC&XHkNe;k&vDH#@PmJM2==%=Dd)X#_j zN&!wG9xzNT(20^TyCd74=xAlZcqpoAI8M!~Lgid-bT;ahlrodWy|_M&w6Z_UI~Yyuayb8>`f8eLD{vMPqu%jHBLJ^jcz1PtJh0QkyL3j7L}< z$PuoSb5c{ov+Zd%OON*LTtWe6mR;%o(??Pa#$>g2$(d}5Q{I-2skSk;bQdvX)I$cA zEL&zq7R8!k9m9&*81kUPJ5ubKjyu2_N<^u6z(}%0>mO?c(+gy?P`*|NS_Noq$DFK; zOdDG2b`HB0Ekiu=i+Y!a+LdUvSksdfKCD^x5hG9|5u;r)AEAtUf|(Qzm1Bks@YEeA z*~pF_pMn3rwv3!qM2bgyk&%u%gBCg6X3fkQPyXz_d4lfv6&WAFmKknMKT zSeqjoL}eo2HXAGsP(bJyvs3t(^m#o|$}t+n*FGaX$AN4+3$B%=ag#7AkyX|K7NFF4 zmn>CDCqf)KsmS|Cl&>-j08XL}ZF`c%YH^@>3P;(GU;+&-ppQymPfU^0VPQjmsi0}H zJ5tarW33KLXw!yKQBe^Evl#tnS+uL;jX%Yr#ZV1ggAAue8dX*sn>Z1WO)qVw^KqEk z29L3$zCm1x*0f9%NH~gQ3>pNBBQXVCQ>v|2et6JD)B+W&Asff!aFvMEbxGJEM@H1l ztc;wIN*Q$S+a8T;yVRVtbh`zG$yO1KMnaYyMWyv?+5-$P&=H{qSW_dDt!ehu@!As% zm*Q>Ns8o`5D@q+oChH73Sgiv`D>25Fnvux{k0X4i>Y%yqY)iLc$ZP3=arj6ZG1!J< z6r7E&0X+{?oSiCkypuhhO)_-6hc#=ojj9J??NU=MGCc=Gt)fWrj)B6HoTa@ror8jU z`8;+d9EobK^xH5fago9(1H)a`?0y)dfD)u3vw%8pNw6l42H!~*&KMjR2Xtf$lWn!9 zGwsNDo86IW{ZCPXN=vu%fIv@~9Bvj=R3Z&!B9>P_p-AxQf)bDksVQ_ zBgaQUX;Q4{5E3z~K?|4~+1`$MOkzrUMry{$@sXHTrDmrjvR~9hf)=ii4Z=%B!S-`v zLLoe5k{_ELl)+^(hA|e;SV*8f25K4UY>rXo261eJ!Pa=(_r>_B6J>07BxZ1emf^6p zOCM=N=|lVClyPdPki!6u_Mi!lNN7wBI<`JG3=62nYEHs6mTgKY%VCD5Qgz#*9*xI* zHL_n8TI!sv@%8HJ@w=uwi_%prOi7L@(Sd7(!ZFNJ3L!2PV>=FW71e?sx^U2UrCK^V zII?g{rr-iaMxE6Rd1w#8B%#bRFi_6cRaT7Yl^zo9iA8B=EOl)WBO}n}ThX~^kB>yk z$;mj&v9x6*nxITaJ+uy;GcXNMs!7j`^h^$BveBF%%Q=V&U4wuv7GxLIE*%4C)G9f& z&@vfG&68~k>{&RJ%R$Wx?_<@Z0a#&zLMjsiZI(c$bu-RR z9F+G{2jvYd-7=u*=%+_Qunm=J!oj*WU2BW+8Y;%SpDV!Ty#&g@rc9ZVr;lKs z9MsN`0vH8tEd_|nEd{KLGHF{f#`;1r%(qxPi7;z_NaRF(!9-B{IwH97#!2Jof{CD| z(GkfvJ1Fh~vV#`=kBOX!FPI3LFdY%xc+XD3M9>%Lh~%3cXl()6;UeQrlup4!Fl^Kj z!HxIq6ifu`IyxfxW(Sq8fb7t=^d_=XFcBKwx`^P$dv*#Yg6>gAB;V|?M(1C5Xlm`^ zBp)It;tM8XaU+5o@7XDs2*z}O%!w@-O<@7qp{4vyWT#*vHQk8d#(Q@3L>2_~5DRo| zr^&y1UU7VS6oq$q7JT?+!Hb+k{A?m!WaCp`a%n=pQOMtxeD3Pkc>%np^s&?)hPKu0 zNid`Ug6I=8f&sSVZ!Vm_8G^M7Ac)RIBN%8){_N`uH$$*~0R+)YX#@+|lCNI;{ALJ7 z6hIK&oklPSGW_z}n<3b^0D{e21Pj}efB*FC%@C{sf=zCsluyL(IPu}l5Uf=IL47Ho zi2vxN9XCU;P5}hnL47GVjy}8S(VHPyw*Z3r zQf?f5@SUYML$F~11ofrdIC{$yuiOm5r~(M;OSy6M!q?Q+reGO1DS)89lp9C?vVXoe z4ny5q>;V62d4)V$X#pG~UQGiY3(Ol{m;sOF;0>>y0gvMKh8J$Yqtv|NH8S8)7{sgU zo?layJU`eHSn-Lx^1Pw@b94E;qA)DrwjPNh2WKmKF1yG;52oPPH{e&uD+2r!^l^z| zGd&kF)>4mKId zlD%xA7_VYR7%&Uv74yJ!r`_2-hPi28Fw7>#VY?SfAzex$1L=%MF8d+1agYpWO60X&neGCjEEqcy8;L|XU|S4)5AgCnM>C`KX7pKElTEEU7FAjlv_ze+L^nRI2uU2_A> zMWML^@H`9R)>Ol#e?rU+8i*kCC{OcoE`?t|#2F!(=?nVfeZ z$c4cI8;SbN@oF=%G^iqii?&I<T?etAN6unaK|5K+?aN9+q+pi>puDJ z>#Mtto!s!vk`+JP96oB^^d^OmeK7X(9SJ*w!n11yk9d8_#Qq!RU0GG4;=*tHecFF$ z%8aDRSDtzHyI;Sox9d#(MhSk?>OA*d;e|uboEdQS%d%1RmORz((-kdSS6rAnuh!c0 zg+j;MCs)1iYUMl1?7ug5)<@gwemUp+LtU1CeduJ)&-IITIJ0WPw4;$x55BT#)%9P0 zE*6@*xah!VUx~KfwffEAgBKfa>JU|E)V-fXf3WTK5m&yrx2(PGv+Gg(}! zJ0&Hg%DF1n&h>gFu*j~U>1)6Gab24m8)pA}>5-2u<(IAxeED)*%<+^D&Up2fi^rg^IZDw~K@X1?0*1O#CT7%j}%q_e#|5lx#FCM_0{W7Na<-IZAh-`m8 zXh=rYrWN*13A-_^>5ubMx9sY%I=%Opt>@ZTsT|h5)S~w*y)mcCyf*K?A3AZ?t6`-} zUyeI(x#yJtbN%}c_4v8z)wtce`{bEl`QgNd3y+6&f4f4$qk~ghuXyF-sw*A8{q(Nm z_qS(HeIh!fT)Ev9UL1OMPVlA8UFyCu;ncD#r;guIs!!!_{i6?bja*u)+@1+np3EEk z%EVT60@_8bc(%>?*;&sY-}6xMa&gV?+<5sd1UgL9JLfaO4Dd60@@16fV zz3k#|g6_-;o^G36W>mWkXNMmADs{}cU+*@(Keg)KtU?I*t}lW!+O=HsTXx|zbF0ez-~4!fzfE^PbiG>cSE+Yi4=A$5x?)JDj`ep8eROod z-pCJwMBvd)PgVVNP}e?H4gcz)YY)ENXVIw{{TkZWO+0liY-YL5 z^MCyC)R|t@C(l~ZdcsdX9r$rxjo+^SwCBg_F+aU?tVrPd2U~wz=*Eq!v+{oZZOC^Y ze6{zd->>vq`t_@?)H^!(&XWgM4{JO5r)xi!obvPM(>~by%MR1t$gdC0 znrClUcEYsfYZ80!KmS}}`{Tzt+<39nm8yNG9BTVU*^k~$vCoe=JwEr|#F>N2t=d1g zZQ(ZKdYPv+F=h1ps!-s{53|2|7Azw zoHv$cmy9ZT`Htm}#Xg>s99X8thoMp5-f!J-Pp1~Aj_xk=^z7=(toD9D!c5reJ$INks_O{$T>zAobU;8C@`HU_D%PnqNF{XCI z%qu-wzr7=+bju?F-&VV~(6!yijxJm>XY%<3`~BIS7RSCkz3$shKH4z-=LzlhJ#^m- zm0!O1XmZENi*LTmHuD7;sr_Sx0A1K*zNBa}e zhfLo-dTDRxuEAd(KYOvq(tz6Gr4Q|1(ydJQ;n#Af7kxEv&cl@gx{Ya>dHCp_lo~%g z{Z!aJ*XmUtI%DF}$%We2{_cZbdkc+wbzabizkX99`|zFt=d0|wety@eHXD!cD7qlv zM$>@l4d$o4H2Asa9_#z+yAP~rl-2p{)IkSkK0IgDTXVM7>DV}?&7&=wG?-d4bIGAG z#TK;R*D>eb1y@Qx_{E(`)05Vhe!O14A_22npSw`^+{Gt`pZW6scN@(r^h%*3*Ww=D z@nzauLspjhXvF8+7M`7!@_fp{v z(CT~tDs@JDbZNm86UWbKop#5Ir=z-z9({M6E-Q9k7};lg@*|%W8``08VB0-aEB#oZ z&XrGgSIDWku~ykDTPk#25&LZ2nxDLS`rgI1%+6&;f4b$yn=htT_&H?pvmX_0UcN#3 z!Lfc%_WMOVd)_v4a(`RMl}-zzr#$P|^4sN~j~#!bSf|wOW4E`;d!$tG$59(Xdvty7 z_bwCL9C3WP`Eu_@Z+BSn;jxxWH?3=ZB>1-ygO}#^8uC-q<+Iv{Y)Cn_@5RQ)%g?NM zY4M{i$27XO^y=W~-P7(K`uMXi^jgt0>d{VpzZm?^=1CLJq;x3UKXX@~Cp)#jRR3hs z1LJMepE({rcJQ#PFV9YU>1?Ho*Y`bM@ywyjmJJ#;?!K`?;dKtvq&^=tsou4&Dddp{ zw@!Fv#`4@{cjn%=@6!5rZ!9{rcg($xEpz$>j%+zOK037C=TWT|O|N=iRF#Tpaarp& z-8KESif;_>pI+yk^Kr%O#X3Je)c?#I?_H?Z>u4ow;v;eO_YZse^$ry;hYfx7ZtG|L zM<*^=^4{TLT}>@dZ11<|%PGCuT}i7uvvZaDOJDqPW7GPTd!2i6>9)LiyRNRjD|*28 z;*N8_eA`W|-qEvb--U0E*gE~5H@2>QDZBdU0gq4Fd}LErkJYoGa+6f4=YWm9H*->B*$}4{UBRb8^6e($CImzv-82wKG#MEI+ZVC-f=1 zU&OYOy*7q#s`-4$^5uueH2-(5Upy_YJylZn>rv-(NW5)iT!>F29&`w9LefXJ@yV)MQTlph3aU zgjKq4@_`o`_DOv8opw`8Z8*4WKw#AQfr0IsU0QyBQsAYT^A`US@!Q(?+`WrWl`i{o zdcfgpcl2#|px6(UXZeljADHs1xHSLXuhxF~_+y(|UakGa3iyl8#Cb9ARjZ)TE4r=x3qxUR5khbIVxv_o9_k7^&9Z8#pPo105{EKoUAMRea zNA1u)bt4)r&MHx-+rs51AME#Y?uHg?=H2;W$eO3x9o==Z%a1veSAD(AH0f~Yo)N(l z-xie~OIVt>_4gK)9~c=~qx_H?z1um?&IqWx`pAikwU(`q_kZ>7ojVVG;LN(o9FBKu z`3=Q^raQb0%oDo16EF@?U9lTLp1R?xF`{w6=ZaVs(*oVVPZU{Lj7s35F&D31_1qMo5((V{_#O(Y0RdtNa{mBF>|z<_NXvBdAv_Rs0Gp$O5fAAI zW%Jo!q2GMAsF^R)l!GfeM+XY=`7j~2jSzT$%57SU;hY4M3|^PQnV&fXiQm?J{br95 z2{FSYyuO4tkmsoqk}GFp3f(Zga7En^_u>Y1C|0fx`rmA&YR^u<-4u;J*?I4W*DIlg6A??n z=cgs1Rb27$>e!?`7iL&T;GkkEpMV76vmNC+PyP!NY={7(^a7w_@=#$^RU?eX21XdO zXN2(uwh_kK7a*!B1*N9JSE)uk*1P~wLc_C=Kfcs6;<5f3VU(v42I~tC80BKbgVmG= zOfiITmy2Re;0`N|xPAutaq+|mW92o%P>}(1my2R-;GTx^#@-#Ky!Lj7DesQmVaf|w zcbH;Y;hwHypWu$CyySO>)iC7aciBJ+)P0r!?^t{`EDS4m)TKmjc_E)si_Xc_(|hsB z81-kP7+&Z~tjSCxBJS%!3e=ZLXmz+tdoij1CDDwQ1U{cqb2bSJ&dQw$3uZi&J2Mu@ z$N?!*pEgT)5MUWt;!?1JP=iLHwkmhjutZwUA*CA7HRb~cS^*eCGI7?=!+LcbRl z9SRHc{_4%mfn*!kB3X!4xv@-=%9zM+`w+bf?ihXG+G4FQEZrCrL~>Y1G!eYpzYHFu z#$ogF!e}#v$w{%OLNT|Uq)0(dM313REG8+wJ96815p|ycMUc`ck{Na~U`9mCsMPq0 za`BGL6qivie)`UDo4P!Js34_}%3g|5tIDXX7!&zTlgvj68Fl|%rqKb<%|KL;(nsYd zZj4${My2c~V)UX!Eh(dl@z2d2e04CQf|Ncg`$I;(9z*F-ZWFl|sZ5p4(H5aZO+{3Y z(nk$eql(zQh)MxX1iDF(5E)NI_eerDa3=}jPB}mrE9f1t{kl`;+=`uiD5_FMMj#<( zBT+6Fkx*G3q3ciw5WWFIWp#vbEw&1=<31@1)@d6I45+(BK*oeuFE0Rtq*=EU<=GGI zGxk>&?+SB+S>?~Z{#6Y1wF2-aOH9`IMD9i^SjH74CPhZ9icT!H0g19ckX|K;^<34v zlJ59Gp~pSvCrdsm02Uyz?T1c!q$jJ_w1Im1Zprn|yx(Y3MpNqzB(_Ov4ZzDw@+v}JQLd4=a`kJZdQCixGoLjDSD%Xo zxH|*M&orYRAb0#xgKI_H9TSaKG#9W6>*KXWkL#IvZ2tVHQPXJjP)U+ZNjxY?DZ_@|+~k)ku$Q zlTcG;!2A_h5@I{zjKtTzBbl~(KzV3N;nzWkB|}yv@tRkwo^)tI&1R=RA{qsz&1}mb+e#?a?G~!ReU#tB>E|c*POfEU?X#)*t_T?;9_-{MhmO zr=R>ZC2D%}s8_$(RQ}xJ<3E+!9rW?4qTdX!Q1(Fi9n;=ATl0rPzb<=zRr&W~zj`zI zy>>ND-TTXo*WU`huzJ!B^RNRST=AQ=Wm%>-^n=el4GhJY@ZP zjjdH!;9;9-=$`HGU)vVH=l$l7)vH$Nh4|ne9ZGh5B5Fv`me^mm^gL3daahu#-+Hc? z|MAuEmJJU~Sr?Q%VpEGxivLikXT_NpYCe)Wr}*LF^(F;WY7+j@;+AQzFX^6q^f%j* z#(}4=ygT&B3*nzF*+hH!wtVJieY<_XVB%w+j~dl#RE-?dn@NL< zcUv`g)erOMu5Q%tz9B#FtdXyXk+oyqN8coV5+Fd_CdDv>dXWOy4XD5GlPvcLz zK2yEjqZz}dCH`>m%&O5fj$B0vH|03K|{ zIW)(&5Ez&#*RFwzwh$3$m`JmAGQv28G{V@;7-8(}j4-AjXqa$wIvEH@KllURCFP<6 z`zbB1HgM!L(FkJ)W`uD*7$|N?dRko0=!|%rsu^LFl@X>)OqIc;MvoFS;wke*MWz}a zCq+g)E>37N(D0P0n|m7Nyu{_?#z>Eo8Y7Go7bA>=OCyX678)?pU*4mD{6ncFkp((;}~V!kRr_2QZb*KbaX*@c2f zoc!ewmJpBxmkYUEViC2UHAK-D@X-IwNwJJ*i{7Nb^#SfRCX-iA(&ts8&;IB0rs2sS3>>WgBbu7 z=7JEGIk7m`KF;&!d)4&VjO>IWDCu$i=(Oni-o|oYR@#pA)MX{+ibCT05!lb|LLu#6 zO~zBCkTSQcsBFc<rAIb`7bL~=-qHH$f@g08ab{rft*MncT%{yXQgnRAQK3-N*BJjXO4(JLO)n349rs)e;gaL)_$i9UR(Gcy)srmOs`N#ou2pGVa;=Io>_X1&-^w#e7-wgu z*?Y1&hc1O2m&f!n1bK}dWk`pH zE*X|_lVKS*8M3E&Rm@b$a;mE*i)8d24=GgIj&6V zRRH8Qa@4HKDmkTgR(4Z?%5Eyaal=5_Gws3B6qh*X19CkEi!wju#*Pzg$Z$p_#Cg*m zHE$eQY!DCO%>I~*pTkkZuVC5#L!s3AYIxR9%vCYC1Zu?KsAGfZhBI3bjyDqVJv1}f z0rPnwQq3V)@+pfD0!j(km9Q_C;4<+tR{0HZ{ts}2Hj^<*$Pu#z>FP%@mR|@>U-bX5_~X9dGYZeOAFZh%)X$w9qn*Z#Ak21Gm$tnvzWpTk3JR`duy7ufJ0$>yKz)IJmdh{_q*WcH} zjYd}w_XhQjr^G7gnLAzI-R&rWf#@B&_D|@-u`Lg!1##B`YBUd)HK$Ts;N+Wc4VV8n zqw$QzsmxzFG=0<`+LvTHe*ZRP=i1S1q`fCNEoHe-iuZ{Eh zl-qMeVWgjl7X`lK-zS06&>e2O=R157@JZnBlK{t?zH0XO$@jm7azDID%*0xiMXp$l z#eZ*%6zzBw!L5Jz9ay$}X2r;nSlkwf8}s}x9b88Y#~`HRz_^a_5giA1R5NG7|KA<7 zF;IU0dO4RNGun}>@D_*HLW42C%fi@xB+e`+i|B+BOhqX<@T`X{O+I%ZB+K&bC0_us zlx@K11^iCf`zH>w!$$ZG#{WQh7Z1y5UTYH368HVzZW5qsP>+4bzgq%|5$9cKxA?m` zBhGCR?nayoO7d$`f$tm?BhIu^{F+p`M>FYRq^Z2Y;Ve!w(lmatNKT9};u~Q!b2GvM zB+UJ*7;bXbxq>qfL_$Rzkwuzer^ZZ~SVL#z6YG zGz8$G85#1NcNIj>==frHB`HV({$}^++AdLyNXQWB_zJZti zngO6moP=SQc4vlZ5G6)TN_~Lb(uqcRGzq+0)E{57&eq>P!I~xQqwt9vYy+hc9xY}R zJ3+(}B6mV8U&2X?nL^a7{ffm5>9XV|N+UCV`2%No;*<#A^7vOzA2}XF?h7IJZ-T@S zX=+7ICrZ0LV$&4xlsNuG$8F#Ken?`|@()L$r`M&Q1xG$o+{sh>0- z8H%^OELoV6AnDJ=5u|3mz85K4)bEqncfsEw;C|Pi!u3smpM*HnVB)9ae?c+jyCu?M zaVEkwA=l)m2!GR6ljfihYv4iqOu@)k?#ndK+lL&PG2%%0qv+$Y@{@~Sv; z5RR0t`!(dPD0Q9ZAuu#5hjOL4ZK+s7h6e>wE##qW|6mdN?H>}bX@3HED^dh|!v)Xr zz#AXwzX*%ce-Q@t{L^2AAr2*O3MOT9Fy*HnxshhE|4vghK&u2>8N9O(W8!UHXVxgfy>A~h|c=KL%U~tz+-JtOVe7C*B$lk4Zf`j z0f*JIS)Fz~VzfR#TLf}*l&SI>o@UPY;WW3E064SPL zk=E8$j?9EC3!sXLYOO2$% zyT~-FJw2o?>A)FUQYU+As=Ub>IU+7K%QD8A+9srvJVGMdwvIHQrKVfPwh4)D)V%2* zkbv_s9NtJ|!dqhpt0P58N;09MrKT$hB7bfBLb!b)JT|^OnxIhpP$=v;3gO2>U_td} z0rCb%?_gM3LiQWb*xkXXY^zKXY?ejh1S{A z1V*d~H7F`E3kSO_yJ-H@1Hab5D2Auyor|w~HEC+)r&di_%L}NF z(aFyGSm{sJN2bVByp>WFK(aoCOp7l@Z1eI1g|MJVrJK-$9%C}H{OvPLI zRew79((PY<>}TWRZqM@LgpEhR?dJ(}U>q2+9`Q4!Khqzw{xKDA<@eQq=dRxVPWLlK+ z?}hoH+;0GI{ZSiKYP!u~nFeY56-awC=9jldyAx=eM7!Y9VB<0x@AsfUXV3_|i;kF@ zs&RTA&)&te%XoGc&&uj%xLOXFZ^o$!)KmRP+7g0F3_Z=<-F`f;C;1n@O_gDi?Vx9uI1bpj`8; zl&)54^MBuZxYUZ%G5$Z6I^Q{SrMd{|!lukBy2(t5&o4w>a?uyAUM}xrL3Je_ehSu_ zqoxE0K`vOf(#wVP@cpO!j+r0ZQ!XK@TufN6@}`q?=fWc&MKWgj7m3aFE*@o@g*|lr z=>su^6E;0{BIUq733NMY#hqWaLb0rQH$=*8?L+XEtzXdGWuor$^X$e5`De@ITm)mb z$m30BYxd7vA=9#zx${VcEqh*$=~j68_YKc4zlChQghs=L66=n9f16KfAy;`5@H`c4 z-cw+<%x>ADC~q=b(|^}zE2mz!alH<%j|qNn;5V-g+U7+;|ERROLBpD(#C8-=THhmE z(}2fHTySamxn&Ddy4h@v{Z*f>UUg2i%-a0?zIJ`WwsraV@GWEu-!zM-P-11lLw=>j z72;#a*2DNOxU~G;vc)=ilcn_rah*!|=Ioh!Hb1jxU(&Vh;g_$iyM=6Jfm$)tn?=wV zI&Jn=x7c-lhjjV*d}oCG>sEkUw%82ZWVU{F%hopAnGgG~-nH-e#K!$DBpW7Jua8>rmJg*x*n)_gR z&Rn&__ocrkiGSz6?@RxGXSw@w{m)7u3CZc(@qadTUuw6D1bkomD{I@nFa3RA`rj^f z@>cj@Th4bhzT@950p%;uPUzeDySXp@7Z|?u7log|H@dDb{X>g9Ds_ur{wwa9o_9W1 z+%-M#e2#b?I|0a7voeOZ6M%m6`Plu1VvWUMh@ubTy&DwER}o!L+zE z>C^Bu7(F)_VRXA-lmVS87-4jyV2n%02}W2A33KhZz%SZ)XgeuTmh_XkP&_4ndUs7x zct*zvtVenbdIaSg_eb!QJ7M^_#pPPYIk|^FF5%pvVX>40v6z=7@>^=< z&QGiZ*V@hw{%&^x>YdAJ(^9bv@fnj&o7UrNekCTIHtFvIba%9)S)+PbQk*ue6_zzi z;a`QOY9C@J0PGiGblUVJA`PGukS{jT{fEJw607GLxt9SQws1R#wW3L{X9DJQeGWcF zJe)ScpRh@k_u{mPskCJ(QJa~H;>4!3=2wNPvj(=ZR5QhC(^}OL%2cF+RQ0Y#xF-b3 zm6dx!aOVw|w;ArW;c^7THX~hn9Vc1t7ja&E{^*V6U;K0tWa;cl=edWznU)|zR_r?A z-PIGDn+dS{R=DKW5^F`@P0hYLlKddZdGXCeE~_%r_pf2574I)eFU2Z#fi2Yp@TZXD zm)&c{lfU0}X~jL8LC%YBCXmZ*Pja!+H;v*<$+BA|S3;7rspPm##ah+XQ##0jyp~z+ z@Il{9Kt@8xzBB79@Zzios)`J|# zYnj%3Gm%_tl2hDeEtTH4_HR*T$cB9lT-qz-=$mP+&cBrx-%KPY-32Kg&lKg}|FlYu zeZm^->Z6dOZ>F_kh;4gV!e?|4uk+1B?&zC|m`cB}$9gKs4Ir6IY-G5kXevZoX9!-O0ln>Af~G1_;HWEIo0{VV^dH?C8so}Rot3_DsD{yhYJ(1 zVTvL{`e4#BJq9vFGFl0fY*m$PkZfV9x{yp5&xj$I1pP;Sh-q)|v#4b6oDK zYJl8oK(5Cum+q>b6KqIuMl*-AbXP@pQV$l@+(}i&XAydLQZ6S_np-L3{{S#g7)S3G zq-7kT)${@j@dB$QVR<;?fR}mF3&o{=B**cE1u&OuEemq^xLDyf@?whp#5|li@~R1p zm130}2GidF8%bqE6aoxo3>SiO*N^|mlj3xXBd1zUyjnUuJ_&U`3DrG0gZ_qZF%qOq z>%uOS4z$W*7{Z;7Oh~C3R77#6r8&?-f+ChD^^j(^%6Bv-6h3}`zXPqxkn$g!*){@> z;|An|&+n?i5}3PCndCS)Np`H*@dyyu)+4{at^4}T9wQQBhDn_I65c?br%FgJaI_=L z%yDrZnisP;;LlE^9OMO<(Stg-KT?j1a{D9g+UHzL6^qATJwTw3UJg&FC&U%4pl2>D z-_`9Z0iVh3?OHNEzW#~?d?vSlMSB1JaeXGY|NUk7S90Jpx&15B^TqvpB;Yf-{d?s4 zzfaX;o&|s&#%q1h%xEbY{k2|F8eIGL(>?T=-0Fn!FTC`b-2Mv--IwKmTmnf*QQwaL z;|%x`ye%Z)Gr9Gd-1?kr-4<2xFEPQkoUgik$G=+wx9VJrCV4cel?H|-C*zg3%jEWt zoNMtlEPZ1j;Dxzz?fw#-+6nI(@|pHxowGh8jIUi`BBcyWOeHO(7a(Dt&b5qjxf7KJ z%QbD2yhxtZbTwFE9iGMuUp8xTH5lv>JYdDVz-W|aWEb&3FhZd!meoH!$qSKu5g0^tvgk?9u&50HqM3$bm z|J5fBOKdvP0yZo$iOoDslvZ+@6Rj-q%e|v^XD{3#vFSvMCVAZ?HcMloG?mhvXl04n zsUQEk?&~cQn+B7_?jW%#y@}H7kk~Ye%o58FSvF;*Y?j!xg9LVNdx=dQQCwwd?zFOm zDYs25=_SP~2CCE?$-SM_}b2U)0*ii0fLHjF?t9MVA+ibnCG z1qWI5RVE!|QSV$1vS`tGH=LHyC6+}jhLZW4O28nbHhyj4EK75V6#?UsfwI0dL=3Z` zo`!pYMROU5LZFHR^4{-4FOD2oNl|A!XnfL zAsWaPv;5q4eNy9gciWYqciRQ4nLq8e3vnoMFK)YH6EV0M=5yQi-|n`Hw*Tz#zBD^SSM!CV6w4;B&iXZT06I^l{k1gB!zgb9-g{ zuGI4U-99bxx$W|~?egOG(C4=6uhu{9g{n8_60E0+8%v+tE}z>jZ~dRoZP#C|f1Jed zD7gOl+;-iLZo6*9?bF9txH*lWl={uPeF}A(199}^>GsJ;`)1ufdD8AAx8_&eKF!4X zpd(O-M-Ud^TJNZ4hWczFo;{4~zsv2DN6vh1pYm~7_5bbmsXiJsE=~`}f1DiLd%As6 z7P#@H6rP6xm)<|zwM8?OF}>nASQ@^zT< zLhRm`x}^`R{dUa0_|_l2uw?}nSdE8w_Y?eL^^aXY{m7+2B=kE%EeyQ8`EmIHZNqnv z%TmxAjF7))5SKf$Kk53(56j22=s+qsaw~ngGBoS)m8j++@N#D{5xLQw{&HfNfRa?yoGET`}5n*N74*`N8rN1 zhyB?xur&SN{XNXS?ai2RQVm|$1=dq|EZ$e>j)<=@b={b>a z_IT)hB%z7Kfx?!4k^WzNB(a%imhpP;@BeuF=6od4YG6*7NsNp%i3&~sA3oluk0j-| zD19Vp*FD6W80WOZwlx`e<`hJy*@9a(DvmzNmN%$`* zHbDVRIP*3C-|HiZD(CG;=+pJi%TeB*{52T248c&L4uAZ2Q9GoKGh86`N;X2cj)JMj z;O>4Rg?&^3N2g9Jzd`Xx0|&UBhYWqkzfl5F(5Q~>JG9dVz0?COP#&C1SYfo0gmV_o zzT@930qTWf7{?Y^_JZQKyiICDb5R|co{TZUaLSBcfrfBA7Sv0Wvq;S_Zd=KH&U+3b zwv{~Lyysq&X~DV9dw;Z0p@kDc#VqLsz_j69DHlDy3EyUN-D6^+?o|oJhM5r$#js8q ztf6(};cqa`Va|*&Hnm0=TUjHF**C(JmNgGgaHu=raQNacT*hoP$^*B6HDvO{lZJZi zO*MMj{)^<@2;)kD3wBr<9&r?}!L)Q)21Xc%S4J3RrNMGd3O&voG?+$@5-eR=ikcaC!5DMpgq{>ccdVSv%Zj)%5aCGSk)6KoHr7_?Cl6m!PCz+??mp7D;O z9Tz4w@f_T+(*%(_xGK-?!xi_yqE2f2Q5M6U>nS;)c8-)gGAVZ^@cPL2H67x8QtUw{K)=pqRxTA#x|g?v?w%`62ryAa>f3?Zd`y`$3+B zDcA#|qe_^f{7iIxZ)3SHE1dyh?j8xkkm>&FHOzrDFr<862H}+0Ls$dY9;=XHeL8|Z zP~ndziwDK-p0o1a|C!SoZafAuuv>JJp$+3JLRgYwkIGHk6f&%WM?`y-3~h1_s$0q} z02z=a8CoA|+;9(4kP)FI)A}WF!)#K*#}M@uaa7GF>+AtJrl$O8sQ8&!SRt$N@p-2} znEOnEFt%KD66W@c$mXgM%;pz+)oikwA3?Dw+2mG>2gUja)?!OYdbkC@B!ev$on*M( zBKR9VocuY-uw^)c(Y`{4TPz+Fla6#OJG&6qn7G9v$OP-i;96$05y@a@P9>XcOx&}{ zrsRNh-OOxqcf`+}dp8PZn}kd22;-XBgqbR`IdB&UQ-7&G2c&wi9XcXiT$3R8M?5G@ z?Tg*Da>3K!l)E>AAZ(_b8Ri~|ERdGu6#EY<1j~TntCAoau_G8DDOu+Zi3io)N|%Em zcSr<5?2PCn$XyaiFoFcJdz(U#JBqz3%bG2qO9e9v*b=K8Y6>3c(6Gg1DC4S0wjNf)$+H zvki9VzM_+Rw#5f96I4XS9SlEHcYmA@Q6V?vzLG96Tubgl$o-bxD)*Hn_pBCd$lVjG z>`aUe`T@~ZO^h27ex~kCIv0s?e?ugOjR>8h;--WYm4%57-Ki#4MNLfEUC`Ccupiik zodT7-a0kKNVqldCiP6PRfIJLyNgmCZBp)c6%UuM~e(~5pB$iE_DX*sJPy;9(LUHoz zP)DBY$ul-q+wVu~aJK2y1gi)4a%HC3+qjxM1rh+=QGP*EDQf`dm}rGFwVXQ$qCS4y z{lI%CcY!-@JqhlZwASq4n#G#igT;!3l=@f$9fpfAHyMmWgPUruij0$y>Y{~cf^%n7 zu+H-5`tL3HtLi-Sss!xOL*;PA0@jROW=$`!5HGM=USOeKU}0WhwY|XVc!AaR0;?xs z$}mp*7NWivyarzI8hXJCmoWElH6nCzwIK&P$-;)=V-#Q}-B64@p9QcZuuE48-69KJ z*?O3bFqD9WZqXGwu4P?rj6%=-QY&5m|@~J4Z_F(#+Yz_?*LTAq4OYJ6qK(Qz0|N_S z=>}L}>#DJUYaI&>gr0>4Zsf@V>#;iv4c&0a0_*iGSy+M4VSb}A7Z4uTA%$=ZZHsbf zi*HlV2PogB04Vo51&;hSB{p1sz`}jgWhdfCVTFUYadODORM=7|U#jqqZA3qr4hIZu z9g^_nM{SW3AVjQb5WWH$1kKaVq4?@U3CYM)3Av?dIdUey0-1|0FB}t8d>sNd+L}v? zZJ-A_@~oWXmZqGsvl-&QpWjz#9fa791V;u{KyYE3QSdnYItZ~ms5XM@k@3pk378!e zEM~i5)<-_k5&{kzSy9IFTA^b|JP2cs+Z@?R z8Hu&ycwxy*$+9|ZoHv;;FEWD_*9NDo0IvM>5JfOT8H`^t29F~V8sRDv=fRk~q+-R~ zirEwA9|axC8hOLYee+ljCb6_=6XzN^KSWa2$lIZl{?8pIl@$M(L+##}!tJ<5o>IYc zjhu2b9;@wB&QRF|G@EPW`R7t1`A+|%5=g=PsO7*u1F7dddc_U=qiiMsp}bV53Vsz4 zsiGfO*{hnHpyF3EFU6ul75S8#^gyTZUQ38^@|-HqTjkj%pN{qGg18UMYr8y;GI4G= zMP6r^$Wx}gzDLH&lIH~yvQVBMk&vT)BY=90=;CV$|3;oakmrl?{Hr`C%kv_6enOrX z%kye^ULwzH#5P~`X5<)EzD{Q;t6>-Ivw#7|c_jr@(VN1*xi^}$D+9sU=Is**CxU_79aRu85 z<4aB>jBDRU7~iKFVTB~j({5P9)7uSeFwKyJZ?uds+Bq6wG+H#mXn|;i(FV~7qd}n& zh8MOTFfM%us75Us&ouTk#-+WU5yq8vBMb}q9x$%F2dJB&A`NL{O@lWrT}>{uS<}P# zLY+s!n~nAWhP%ZrU%j&&@0T`MEWMF<=d0Pq>TPXlH=82$g>hJ>b{U6TdOiprqe>iZ z=Q&CmRgfdTJGMz12$~hpVs^IZzUp+X6Q{m_Splu*q*(zh250~n$ZbVwGdmj5aIBgV zE9lIVyN?!zMW%Vb8M}|dBm?OOp*AGS^kLnFjXL=ji*{phf-dHW-5C!(7xD7@NCV_( zz=54Woz@e$#%pVlkQqxBDYl8Q^I~+xr}`Y#z4!sR)de}a)ul=9ZvQeshFvJ$-|IZL zQ=IC~p}Bn|MXKjc&{QbW40n$BVw-=rHV1cuBF$V?ii}DVTriW{Q%0p0?-YI1s5HHu zBZ^jB*karVI}w$px4NioG8i>pMy0av#OE(cs>Nkg#gb|hqS7i>7nS>pBC2RFqq0s+ z6n)jGw9B32w9s_AM5hSIFl}-fHB?4r)tLx%B~{wu&e8dLr>(0lRodY)YE{?-7J=QW z64fMF46Iu=X$eD3p@;I>PA~6@2{beXx}eh(x_MPKCAWPn)k$hfX_$a2nt}!qno>$= zn!>s|5hf>ORx!+-<7x4$8RjytG|VN#jbvU~ttaAR5hXg!aOVh@<(F#6s+r+3I?Zqy zy|#?b7GNSa;#H#4=ys0Ik`&}<<)azhGCGZJ89hXbi;V>(t%!@w#4K3}DJ~k-J_HC4 z+UtB6Ax&{0#r@J~$4^0W-%FNm+O^t8!OFd4+0-abjww1eG8B=-}Fv7YLq}y1=Z_pm2sWjHdDvn?IRCE8MD@rdaO)qlTu)D(;7qW!h>-&*feu0OIS z5YDlK@9;^$Cjp-Xd=l_Uz$XEp1bhh$_Jg z7h(S2@aGLth!T&9KUX?A|L44)3vV>-=YmZV0_Xjl|8w5XML^E?Cn0d5i0c7d2jDUt z*9Gc=h_`hB&fQDaDJp5PPXay(_$2VpNPzQr&Qm!l<$HMAV9^GG^J>0}=Uku02%N)m&d&Ke?Q}Tr z=NzANZ@%;AJf9P0nul<%&-DPBZP4(O}Lr6v#iI9R|M;L`L8X*-S4Iv#N z10fUP9)v6e2SPSN4#F6Ou?XW3#v@EXpcxp~VJ0Koi!cQt7vVmHsR+{$rX$Qin29h8 z;eLb%5FSLBjW7q{A%wXI^AP4EJdCgaVIjgJ2#+E>hOh`>F~Smrr3lLqmLoilumWKv z!YYI(5LP3sL0F6MB*Ie&Pa`~ounu88!m|j^A<$9v2K;YC*o3edVGF`mgclI_d>j6^ zBkVwU31KI~E`;3(d`@Q+47~ogAAO)n8PFUHG(R2xSyE#lsGB@sJ|#COq8!bL14B_6 zbH5UwRmpioeRSt1aX%b2QSKUW08-C_c8`#JP|N?^0n<2V`sCqeV=o(IlBfZwxjCp+ zX{d?Jdsj#yS@J|kHtJu7tZ(_zt&8+Y$q(UX(|?}Cf_Y+l+W{#gN*-*o1pXX9Ep8$I KFEU{@{r>~r!()B` literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/45538_classic_Header.xls b/src/testcases/org/apache/poi/hssf/data/45538_classic_Header.xls new file mode 100644 index 0000000000000000000000000000000000000000..fe67b84f8593391898d3a0e50d9ab54294497afb GIT binary patch literal 105984 zcmeEP2YeL8_n*5ILJvLkBP7&>1VR@`AanwRCZMzmr+uOSYe)!Wr`n$c)%ndpU+F}{|L^HA^_|={vi@58ia}r3=rikZxlH! zOd`-vi1WfMHv8{GEW`zbAtH-|El?>Rb19;_zvu-7C+TT>}fOcW78A^^M; z7bV0hV3ZP-C6{GoTu#QDWSX5aZY#i|MFG6tb(XG>y9K2+Ym)IuTSKIpOro98xKbpOuFAy<*;Nq{ZWzW= z`4@Wk49e`HZcNKsDdVgaZ+C+Wz1yacyC&4PRw{3l+ZCENwveRK5uxH4OQ^UF=aGPU z-l^f=7F}1hf|A`S`U;y!7DEdm5R0C(x}HEIxjRxQ722QD4Lql<9C(f|7*Q;F+cCKCyV; zm7)7RExWr>mF>J`XB0<4*?Pxw&puYf7Fy;>q9LT{MbIwdF77=`?hVU311>7OugM@p zY!Kyy2wfjqJEC^&=-Y-wYNs{)tBXfPi0Kjc%;IM>r%ZN8X1av!z1H{N7nF<5KoG_Oz1)zqB|$t z4Zp2;O0;y(2n-nVQXsDEVq;wyHWg2cC|!nHYBhf?smxZNu7!9;G(oz0p<&Jv*1t`? z98ymfd59B0o_P^BynYS;Sn;fA?Vgm`IFZ%VfVmMs?oJX##YW*TM0BI*@EZOl#U}I= z0*uI9S=g3MdEwHmzVHP zr%Flh@QTH~(|J+y=}BLKd-7ip{RS1h(=RCB|5QE&(J2W2T!?o$tSmr2O1*f>p&T@2LGsyD$-8_MI3D>8?fqFU>&q*KWWPf6KRb5G4+f2F>v zW4Mz2#?L^Ihti)^$GGVY9)PjN8@xIOXm4;nyi2&&FSWc!>W>$ADe~zFFDmu0rbg#` zg-fkpEv>;d`u>VumC)cPL}HvJu4=H_50`X@7uVpWTyP8UD|)~U`C>|>l*=h+rCus( z@DpML=v2|@l+oZ$KA)EQkJ*tzXH}Up6^mCyeJT1-UW0?aQeR3v2H;WAo1BYl_y#^P zw^Hy8aHpJ42y2|Bxl=wE=Dp$<1ze6h<8dMnMNhc6XcD!A7%$4AycVsz3Ouv`xP@@_ z(9@CdTJCfE|7j1BmOu365ow}046vRp5vY`hod<}42xzq#-|3x)A zhH@3fwC)=}PkwZC+{&xuYY`$&C9mo&=3|A(ANXC}@p&crPjrVX`C5cX6()DNsrci) z!6iQ1g}3_k4j*L9SC#*e0^pMi%vVjI>4{2bvhc`Pm9rb%S?~Sb^9|DUVX`|sP^(7| z{?&T);Gc4n`fre@s#hNJbi&>E48)xK8^7Arb2oiZ>K*!H&?^OAOPCCBmWKS84E0`2 zlvea7!M(f!a*%prkdH#gBE$$0>|XCC;Db+t90H`C1HYp?{Xh+F$TtvF)OKxC_y)KW-ymno2YjZw%Q>(B`2=e6@z76azht1V!VU7FzRB_$;5zzl^-lOV zcse%f1KY26IPp;~gZ@y?-r*{J4}K^gr5yq8RZjpn=$npzLp`eWJ=z83Bg<>3 zM<>1k?v#%~{!aXY;BIo}gRhjQK@Q4z=P3s#{$!OMwSRWvd$dRI^p$#-<#pr7+0UoC z(^vW{Px&bLfE)4+(E1ZYeL4FXLwTKW4?TDGO9uHn;cjvc((*OPhxFC@bt|vX@D2Pp z=Nnz!AxBgHWHye1g3xV;%8@{t14g5R% z+Z^|P)tPUW5l;FRkA79bukX>%D}2`T;8W4Jh93R4f)BW%y({(QiLdYveKY74>rvLP z0bWeX(~}>iKlG%p;Cu2@Owun1AM!ECIY{OU`54Njz&+_xZ%tTfHI8cvemxKQDDnr~ z(C;bu^}XP$5zeu~NYjAwfZ0DH2(>gvv?0tX$Po-8q!6~O{e zV?NlCVhoW_KfF+!UVTGj}SA+($k+LX}pMrboaD;S~839U$IQzH+Rj8Mr# zh!HAzsBDBv9;z6jl835BsN|sgQX$wN&eRPtakLM0Eij8O1ULWJTK zqtMktZDOg{s2|i4r4{B5h1>`YcZZ@Rq*%vAQF30_h1JAGv7S3rrC8q`s#0v=q9{w< z(1jJ_q8Q;0RVhZgLsg26Tok3mqFh)_T@<6;p(@43?ogFt6Bk7(?HCtUGZ)3C?ogFt zGk2&;vAK())Rq=5tmZC?E#09i#a8Z6NihiTi~NM>U`<|P4#wNX;zGn*(~@%2tU30~ zj3wsMq76)SM0~0(X^bV_mX@}}>@V8p`Q`J!U0$I4kInO!|8aRm@LyWAXOd3oS*ccs z-C;pHE-gB^fuI7VMZ6mbbyxw9jKN4aJ}b?dVa>_Ro?z*38=tepTvT-8JE<<2nc%XN z=!_m;bhTNN?HQv;y_D#phk$q~OagQ`pj}FI(?d|d#YA_!z!%*zvT~6{u;{_EC)hK_ z*pk(PmJkV)b}w6QPPSDRT;vH9u&C%sc6w#z*p`@!i(UdlP4Cz8V?<)%ZPq3gAxO+*%>Sq%RRzmM$b75@7t!_&Mp)r zvolldX*Nq{iX}eH>Tt}$E7hDSyjMnawP)KLmXQ-IopUpiSa-acyHL5=KQqhH&pzIH zPo{k1Eknv~8Ogbhoa_m+@b01MHQp>In6k5dtj(g{wA*Cbp{-1~t;;nbGf8U9EcDHe zMBapaVPMuTGdDZQHXrihTz#X-9}+eBSAww@3ul(GKkn``1tADg{jy1<1oc9|ZS^qY ziCkQ5DX#*rhTtD$WJ>0v4{@T#H_#v$EfP6j4cdrfhOwcOEH2B9v4u+kpH+@!j$+jlvT61iceo3jBnQ6S$A=hEgusIyXnW07(IRzo7VubaxrdhKm)N4}T5(p3^ z)z4-dL!Cy4kd`?i9Yx2|I2w<|^9H7N@sNN$BbNzm$+?PBVadE-R%V7HGaGHwk&~MY z8h8!R&z6>Au}P}7et8;Z_lw$v}HJ=Aj5QP2ACibJGpUy z#m->QJ}Se~OEv^+ngfFGX|rZn+K;kTS5HaTK`{=@%pPMwPiM=v+cJ`D(1FgjbZeRo zy3;Kq$Ci!$4{g|*CM!J~NXZo`+>W;N%u(6aEYy!h?F}I5au76F_tI7&ewWy_6pBK~ z9t2$!n9&M~ri4lpeQl$VcTu;>WL;A2diQUifHx#PZ8@o#$t(yp4Fr3uIw#dayHM4F zI-uxJXKRu@&7K2|O0Fr3gTzTW7S_2H|KsdAsklhbvSv)Mpj_3Y0-@OKNjUw;%CSON z4pp&Bk_2z{PDz380!pLOSVD1bLFHtjPh{;_AZNBYGOX&4!!j;4(_+oGK`RvfR5XeD z*(d;IMNOblfK!ME3{wkqq9n}j$gw9mT3aw5if$H(sChN0oU4z{LA#PtX12K90(x)3 zVb6f-XXV(~_+{Eg1<{rxx=I`GZ+h9rDJ@&y&jUx%n4YrWXm=L9me?~=GNG;1CJP4R zkyZyvg!7c#w6w?^d%DfivqO8AP=J|jSBC$LQ51tQTdiMmW}E7ix202>ZLBTBMGOV? zkbx!JmX(=Jv8GzbvSBuXJgD%FRC|`=Hn4^oQ5qgFk}Wa%+gio+2H9-XuhoHG0UFyW zH#;-ShMu~;!)`^-kbv@{-KC>-C0Q-jjAVrmYqovlNVG_#XrIDcsN-H>CRIb_oFNlD z^*|&$*)bC`@!!vunVW`03Ft2}Gtg$xBWKvGS(#~e=HAhohS3;3eouRHWcwUUUZ5AU z-%cK9bL4=i%mm!#fW?6d2m@nIDsPiM&nHPa#-RE-WMac`0i-?YnZd5pnG5;xxc6Gk-AF*gLGy~Tp!>N%*mDT1ZP6QOwOJC`{ z9j^AlW9?{f5Lc2lJqr~Qi7FY34#DC`O2yEWW~*Hg9&{0{K*fq+=a>?y5|O$t2|MJ> zh?<$5nLA3UgD(9#pmS}XmYbeox1ciFE27g#%(kPdv~f+lf$0SXBD4T&T2zWP-JUi< zyMyUcf-MJ)O0sT6twYIVo52994dCb{#@f;{v)JKrhVN7zbk|*M88%FLEj=+0A7vv3 z`*6&Hb1*bu_P)}%4uJK4e~1_$N=o!GT2}tC}}@i_EsZv-ph*L@*XO zszY|>7|3>%t-b8dvm)&yMl!~Cf;Wo&mOW%2a|BZ znt{ZoCpo9Y0Im^=#57B(g!nYf?KsU; zX6fYM%)%|3!YdR7bv84Up#ubyj5^Q6L^(&-STUzpMo9E07NwuD)U!1j)d+pQ6@z=u zgec^kl7d*yr7fe-1!Xzvqj%_%iN^q?ne@uc$l_!s2i*yZoQtH;H3-;ZL2=RSGBANg ztCCX-t&maFJlUtfo`qAnT(rE%zBa5Upzbv+G}ca$YCE&ZR;)~6Y&l>7vxp=pZ3a3T zCoyy*{W4Q>#z8Ns<9tLI6_uDf5(985PN9tbp%O`Gxw%LuS#p%-fXXJCl44I{O<+b@ z0*e4BPS@OY=oKnY_Q4K}DcxM7t)<@t2PS9i3S2c^$6fO6lOZNd0Lcc+;mQ>S&{vVB zAdU2uPq}c4tEq!a_t2ZE%7+IEkEeE+n0dg!r6M~#VkoohNIusn&q{2^=nqq@_H0YW zpPZ-VjLXzd#XM(f7|3ikJ&K&IO_temR?3bQ1EWKoi|Pc9d8q@>a*^89un~&nsy0iq zHOC6N$*frP&}jM&jGCyx#^LG=h)T)X3?^d6IZ~rQ%xk9ne=~u{ssOAoK_Qg~0_`b* zOzWOFJ9ARrU!9akSh{CI(=kquf?y+*X2Qw3_PEv#^EEV#G07=uj=K;$#*9u$Ph*^x zZW%phbXxit%qH$~Bm+9efy?BSG5KNz76jH~?8AIjT*d!j{6B#{sEkR7Nf?hm#(!B1 zPLr?@G9Lfu@jtYo5QnfJ@(Cw1m`e;mSGpVjPvXBUy6-MgLTpBV9E#y(9-aob;J+&7 z1Rr2vjK{FCw}}w-(R;7P08s=PKiL%N(7Vq>PxU4K*R;S=2}Y}=po$1!NIfw3k%w7K z4l0kJUdq3(M6DrLpPUjDDW1W!s zY5DpD<|#q#4LN{O(AIK*xZHBUx+t@@rC_cv6vKRr#ghn&c3mPz6ACAS+Sd`mg*Q%` z#1u{hJ&le?fyF^}7g8Mb=+`H5G@)=J=)!bFaN)f;g%iP8pd(UXaiFz@6o-q9H&8o; z6T!4mM+6t%i&Hoetn28A6j&TIzCwya+tM2-PT@pocM0iM`c9L7jr@}M^e7td@GSW7%Yqjs3Z}J0pPU&N* zJsf?j*^^*sAp|idXaoanDc_zwb0Y-n6haV#i$*Zemh#0nXK#dHgF*;ml+p+mv87x( zcjZP1HY$W5hC7X55M=n(cQ- zAq4fcd^F*cmtVROf^`casITRt2`4|^c_RcH7D7;8%SRKA?)~6K2u2k`P+!YO6SkfG z>_!O26hcs6%SRJ_d-wSpA!q@?<~LBwO=2G0dQu?>W#Ud31+?X`LI~<>xk=2ar4QZ+ z!Fq)d)Yo#8nEmgqxDkR8g%H%&a+8=XkGyfvTfsITQFF-zW1dz->#*t8IW`dV%h z^XuM4-Z%_%>#+m;tLGQ-=%od4jCi#Sc&spQc;N;-)`K^^`UX6T*Bf4>0gqDihS%7D zM_~}JntORoRrCE|OJKz(^2+@P_xt9G`Nd&az->K}L@r`0MlQR^#0aL~H!$E=$}a}| zRE%*+Vhl#Sc$}r-r(j#$uuTDesFHY4OUKWu;?y(X1Y)Bd7mh{Ti8eS?#jRt&_0JCi zZZ0+%$(EyRl9-@kHZouq$uHr7=}xt zJ}Ge&55W6!KKQ6DzlIyB08^EGf0$Tg;-`t-z0d)E!6$M4@idG+~pMK;W?|s6-l;LFVRSkU6n(KvCh(olbzc0_gOXx#>&c z&Xp-309+-4Mz(Vzr%-F`&Xr$jNTfeXn*)xRqoNo^@cdk}+Z3r7ro}-9G5S@OiO8g@ zAnuwQU@i{L9fVg zvFu{36p;&q6*da(ne)}=Vnt90f{V6EJ>~y;EI6#!-Q%r?f=ZNp$N)?1;pbmo1k#K` z)DqM0-C6EeoK?eGK{@>2iI)yJSX&(4e?pecF|^V6^t5O0KQj82=-^I2&H7`;v2E{X zZ?E_0`){u6Hf~D9+oeN3elBwK!kJBr9{yj|Zw?&G{iQ+ijwjbnobg&z^u4cc zUVHW0FD1hAmK7iL^s6z}JJ!7&y#HLp=8n-tMo;}L=A&(Ij=cEg)bjRrGb+9RhJVbS zAtQc>{UYkqz&qbB{miy5pI;a!*nG^`@nURy|$y^6B2M1{T{9G;_n(KRwy@kB#$wIsd??mWnH$3Vh{4eC(0b^JClY znKu3KtPPKc2i-Y7Yxep{r(YPpGx7NPHg7bp`e@f}(GQj_J@-`aoqacUNIrfz`0ehU zPB$GHHtq5I?;3ux=Cak5&oxhY=ZA`YPqrAbap4n(^S8bdeROs2ebY8YT%-uswC6#<3S(`sKafy%u!Lgoi55KmqSX;ED`hPN&>+6WK!(I*>-F9A=fuFteQ~e8_E;p=G%-qsD^Y7FR`tlw;vtPjDeMN7~ zHzwOx1`o}w)~wR*Y2km&X!g^hv@JV&uFL2%cI)X5RjY*eD6{m#%5TlDy0Gp0ABIhu z^LlvMvKQjdSnhf?z}(>O13iCfb}4@6&c6BPSARUZ@$AFlJ>IR9_~4MVHmhI#wAvcS zZ$H29`2F2^(;tZmtx#cSr5A>snjd`rxvurzns|KW#p6eAE7P~icm6T^x<#!hQ(@P{ zi;w0Hd393jx&iH@S3lkM%)IPpkLTdwR& z8MU?gg|@$(?$P|~AFuuXW`=EExzX)6o*K6Q>$I__uia_-aC)`fTW4ne^iz=;8F?>S z=6v1ge3z4BcYGO~*}m2K-*Sqkn_E{I@b;&R`ftATzN^*qzD~RSYCy3q*40BhcWUs` zum{Hk?2h_4NCdvN`LSxB5AN2tT71RQS&i>6Uo~L-!VzEJclq9T`z}2`tAB+3$w|jA zhtIC?+@ha8K7O)yjVW_hx0(3!&-;E_So625KkxdfM(oe;9WEC5;r=$?75U?jOLOwC z{WkRbkG|gh^Y0gXulVNmSMz^+<67+RKlh0VzWvz#b;H|D`T6osrKkOJWyVLle|^cc zJL;PQa~9g$m!CLe)%v79d(S+R)ZxhCj(@yR=3=#e(+;$ItNbVLr`i|Ao|up~HEH(X z3TyW+XjioD_}=CjO--4-zAh5D=Hu+A>@z+&J)w*!J!{02T2*&to&N0GGi_FX`^?~% zSN-}@()_npMRvE^Ip^2u&EEJmZ`G`>gDNa* z77|-0BI{z$Ht)WaTDH}pfbXhLEpmD1;n$WdpFibHqJ3^o=VfuP%&hlr(@!?e{AFVM zJ@?)He3e(GzLwHy?gJ}UH$S{{#;mLN7rBtL=;FGx{i_pKUwi-LiTWGrb?(xk#lF&= zUg~f(=78zD2hZ>B(k=L_Bd5;wToF(wvh0DK%e$BBG2(LG%;K--&%eKNK=-k&vJSqs zE4Aj2k3SZE*X8;(hRvF^VoH$?b-w?o_wFL&UtbvX@wIPDvn1q+xEd$O&d-x zowfYH*b<97?CF#{b@9cr_kMYM^33F?%067bf3bi$ZBC!9clz8TBTjxb_x;9mio9B+ z*yZ^9U-~NjouO;Wd@}ONwk4-#q&}N^I%v?qQ$N1Yy$zeOfv6!HY9r8u9$I zUp#ux^R0jIuUdEHC+8PGGHJs6HtDy$a3Z?vm@#+O?YesV*-?F8OnKmo62m$c4Q#io zTIHWA)xG%H&PutpHq|bFaZ9CctK*)oSL?IaPfT5A%j!~o%;#JFc>9I4O233Id-{{& zEh;vwI3&*R(f+@Rr_b1CPZ?kfz1Vq4%(SQdT79?b%D4%Cl<1uH;#_x7q{qf;eD>gsb=1}l&rG~7?>pk@6W~=6O2;G=^c+U$> zj#Qi-a(>x^t;ROKyyDW3n4L539QN?j&-Y&4Ec(ID{k|OX-gA>DolNambU@aQzK?e9 zaK6E@&NmtL8d{_?5H=dSK~IOODktX2&hH|epdQqda10HD{s%cd(Zi&-v49if!$-LI=0O3A2_Pjl!TbD`d6Y`FP&NK?&zu^ z>G9c5ZoXsY8zFCv7?4r-y)*G8>?OK9Jk0;(TOXXQ-}|-7)}#mG8|)qa_?sO=E`$$z z@J{O&1I8pRUjD(s;oVHFj=tD`=~vTwx4)QPZ+4fe4OYDH)23z(s`Nhn!isJA3wK;v zcSp>?7fU)$|N32bvF@c_-TEzgd*s%ccfGZB!^=4}#teLT+H;3CXZKt;r~Ol-x8Hm0 z%BTwUc7NF*y3@w5x0TJA71nNvX>uCZg9_YEoV;&*jM)H`5iX@dbv(k+Sye{ zSN4KF<@9f~t#t2Ak(+BhTe@P!5wR_P89wvC$L&6g&D-%)eaA<0`xos!cH^b{J1%k5 z`{Mjsv2@b@Ew6WKQ2e{wH`L$0*}qxLp7(CM`e@L>W2dI4SDkn{^u-!wdq23l+sx_< z-pVU=Wo^WhcedPg=QjbHR&L2I9lh>ir|(KO=x}af_b0!Z>Gw+7lnS+;{rOtItC0=z zUjB8|i!qzp^j&-Lh0865&lx;A-#umD^AUZMUVpFs^fDXwuN)W{eP&Q#`{w6Y%}owGKYQV_UmN|lAt7(~ zvg2jTzmgGf@bYc_BKDQ|vC163kplu#uZi=ErhdKQtA`)j-0D)DM;?AI;pJja-99wD z%Ef_|$31x0wD>~EXj#8$YX*g`DR*!9(W=uhG<#05N*-UdW*hEQ#k{1h zVenR_TXGhnn}4X&ub##BN0*=Z)AVscnVIiw55B+7*}2D_J>fU=<7OqB$Ak*PTiKgdBpSunJvDo zFzWsu^?KF`>szl;<7L^U>ULkU>e#*gf63d}a{a>FKMr00So_y@9P9d1?v%CPtTatN z7`AI<@T7M|<%bei8dfIal+?HSRRiBx{04M3Dk+-NXa<+ za#1?&jgp*;8EF`mz(r#LUcKtMDMTd_dj#-36jlQQ#88y}9?sasN<1U2)IAU3hL{i7 zd>xE<$VVuf&jt(q=Cj4ke37OcT+vC+7Gf@zIQmW&cz=q0DzWxp#uHs>d0qxFKXV8Y zzdiZQ+dW4n#txV81`^&-#?vJvPd<$)bi?t&6>US@jXV4Bq*j^J*gEmB6v#==OsdnD zCzh<#Y^%do0f;jsftiw6Pf-l-UWVY8g2&TQ2#s-;g?I>-PSWszX~pBDL&>MW*yL{x zI3pse^ur6BrL45~Nv3mB7A9TH9CIX?NRHsUQAxISB7mc`@xhXoW>gE;b*f?Cm z07b?oEXcvoMaF3|-YR38ygSaXE7IOC&+RfEZDKDnO`d1UFSN4c`CT$qwu~1`$PyVp zAR({$jRc*;2-vhk!oQXAM>0Mq<7+Zbk?~R)KO*C0GF~U+Yy;&{ZbL{@OujJn`RnU9FuWn zNqLNk?KWLfC@JH6WL#dx6(o*Xp8LtzU&^GkJf}$!dIuTLm+`$ao+sniW!i~;SCH>y zDVZrU9z=r_F}PeH>OD%5ut-Qv8OO*N%wt*I^C$?;l@0I5uachkdp@X70zL`&B;b>P zPXay(_$1(yfKLKG3HT)7lYmbGJ_-0F;FG{VT>|a?bOC%66cPS;IVfwkf4V~cg#ZiPadZny!uwdWyk@FxCGT=x zb91l7!70vbKfK2YE1HB<3O={}3ajc$kCkVWc3+tB^(Wne)KoThRbfO2e~|KYnm! zq{nxwMi}L3gyG9r4;bZQ#KRZu9xzIa@6F_)%8EXgmG2f&mb4& zLs0j8m9Ht?Vag|o?l9%MK6jY%ahy9$`RvubK9p}q-SLzUFx_D_4dwVCVEQpDV?eJjC%tN^{!+4n-kRtWzISCH}EK}4{v4TKxG+L{Yh8mUx`rOX0 zCiKlDwutS`Vk7zneibW3%Pw_(FDg0~73RG)T9^aLHqP;yTdd8CW0q9LB<{P2Ea2qWSj%AC&GG3UR6pJeq^V&;_6yzjWa4Qr`NQ&=| z+V*{;dXIo2NNE(w3=IIljEIp*sqvGfVKtd4DU+W2{Jq~ccfAKmK}w&L76eRMO(tc- zn8f|&WI0O7qo`PWQe?ymabmF#NJ0xhF9Ld%CDt?5?nu7vBZVIQ0Z);9RKdMd;ssojtE$c`a>d@j zCL$2?9$agR51bscS8#C*ubBppt2=pNU*Y1ohQ!o3uHnRD@8ROOro_^7TvKA66mjC2 zKx_<#Qfa?p*h#Gcw!w`ReX-4|_A7dWYke=U242!O^a5+-1%@3XJo0S@n0}05?NSCd?m{PPmot

H1Xe0aO+Dm+qgIBgSmh;Fm=lYVOM;Fm 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

-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

F-)^(NQ(H7 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%0A?bIE<_FnMhsOFl1j+P?icG zS4QHgE|(RwSXEl8;2L$0vQc!kX)?B9RES8vKja)4(9J@`BCD0|pE-_Ba}JTT4H1bO zhScJ9F~>fk85GHFa165Uw!EgA3+ovYK6wzAb`|ArkknzZvgodr;x{Wz?G_fA+D$Hn zt816kmy-VcCkJn*=yeeA)1FT2VA9~{Q;iPm=sY|$Fd!l<)Gyp4FhcI{;o~3X=Mm@^ zsPOQYg?Rh>_{zc}g8fF~+n_K_dQlEm;O@w$>eVs|-=MNX=bdiidJtWeIjWA%T3w!A z2!v6p>^%CCR8?F^gvb!oLzQ2EDulA0rz}*bWvjdu9i6=cy%h=tQUX9|TqFX*y+cEN zeS>`?f`dZ?g2Qzk5t}<<9ly@BN9pJ49^Yf8;ghm9)Jmm7w2#<=3hGC zV0TDF&m|MTslIvn7yPqzQ~MWJ4{MuOf~@ke!j~!<^n$4kQlafB{EO{Tz~5+pQ$dmT zGcyrJI_P_xJdA13mqvf}sQow6S0RzVYG+hM*I%`Ns>1bm-u;vGt1AEEuaAGd#Iv!( z?D;7F?!Ru9fw-^W$kw6qPvxHGKzhN^SbPQ?m3u1xRBj95sJxGWqp^Le4^$7P!co2W z0M1xFAk)ykRdt37k0$TUkO5lmt~RB8{y40&1-aFzU+3#_b;* zBJO3G1tz{I52Q4_g`<>RxrpYtSJYj;s|*c^uDG^kqZ}PZa+4cVcu;qT- literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/eventmodel/TestEventRecordFactory.java b/src/testcases/org/apache/poi/hssf/eventmodel/TestEventRecordFactory.java index 0449795b5..c4a5ec84b 100644 --- a/src/testcases/org/apache/poi/hssf/eventmodel/TestEventRecordFactory.java +++ b/src/testcases/org/apache/poi/hssf/eventmodel/TestEventRecordFactory.java @@ -18,80 +18,24 @@ package org.apache.poi.hssf.eventmodel; import java.io.ByteArrayInputStream; -import java.util.Iterator; - -import org.apache.poi.hssf.record.BOFRecord; -import org.apache.poi.hssf.record.EOFRecord; -import org.apache.poi.hssf.record.Record; -import org.apache.poi.hssf.record.UnknownRecord; -import org.apache.poi.hssf.record.ContinueRecord; -import org.apache.poi.hssf.record.TestcaseRecordInputStream; import junit.framework.TestCase; +import org.apache.poi.hssf.record.BOFRecord; +import org.apache.poi.hssf.record.ContinueRecord; +import org.apache.poi.hssf.record.EOFRecord; +import org.apache.poi.hssf.record.Record; +import org.apache.poi.hssf.record.RecordFactory; +import org.apache.poi.hssf.record.TestcaseRecordInputStream; +import org.apache.poi.hssf.record.UnknownRecord; + /** * enclosing_type describe the purpose here * * @author Andrew C. Oliver acoliver@apache.org * @author Csaba Nagy (ncsaba at yahoo dot com) */ -public class TestEventRecordFactory extends TestCase -{ - boolean wascalled; - - private EventRecordFactory factory; - /** - * Constructor for TestEventRecordFactory. - * @param arg0 - */ - public TestEventRecordFactory(String arg0) - { - super(arg0); - } - - public static void main(String[] args) - { - junit.textui.TestRunner.run(TestEventRecordFactory.class); - } - - protected void setUp() throws Exception - { - super.setUp(); - factory = new EventRecordFactory(); - } - - protected void tearDown() throws Exception - { - super.tearDown(); - } - - /** - * tests that a listener can be registered and that once - * registered can be returned as expected. - */ - public void testRegisterListener() - { - factory.registerListener(new ERFListener() { - public boolean processRecord(Record rec) { - return true; - } - },null); - - Iterator i = factory.listeners(); - assertTrue("iterator must have one",i.hasNext()); - - factory.registerListener(new ERFListener() { - public boolean processRecord(Record rec) { - return true; - } - },null); - - i = factory.listeners(); - - i.next(); - assertTrue("iterator must have two",i.hasNext()); - factory = new EventRecordFactory(); - } +public final class TestEventRecordFactory extends TestCase { /** * tests that the records can be processed and properly return @@ -99,17 +43,17 @@ public class TestEventRecordFactory extends TestCase */ public void testProcessRecords() { - byte[] bytes = null; - int offset = 0; - //boolean wascalled = false; - factory.registerListener(new ERFListener() { + final boolean[] wascalled = { false, }; // hack to pass boolean by ref into inner class + + ERFListener listener = new ERFListener() { public boolean processRecord(Record rec) { - wascalled = true; + wascalled[0] = true; assertTrue("must be BOFRecord got SID="+rec.getSid(), (rec.getSid() == BOFRecord.sid)); return true; } - }, new short[] {BOFRecord.sid}); + }; + EventRecordFactory factory = new EventRecordFactory(listener, new short[] {BOFRecord.sid}); BOFRecord bof = new BOFRecord(); bof.setBuild((short)0); @@ -120,23 +64,20 @@ public class TestEventRecordFactory extends TestCase bof.setHistoryBitMask(BOFRecord.HISTORY_MASK); EOFRecord eof = new EOFRecord(); - bytes = new byte[bof.getRecordSize() + eof.getRecordSize()]; + byte[] bytes = new byte[bof.getRecordSize() + eof.getRecordSize()]; + int offset = 0; offset = bof.serialize(offset,bytes); offset = eof.serialize(offset,bytes); factory.processRecords(new ByteArrayInputStream(bytes)); - assertTrue("The record listener must be called",wascalled); + assertTrue("The record listener must be called", wascalled[0]); } /** * tests that the create record function returns a properly * constructed record in the simple case. */ - public void testCreateRecord() - { - byte[] bytes = null; - byte[] nbytes = null; - Record[] records = null; + public void testCreateRecord() { BOFRecord bof = new BOFRecord(); bof.setBuild((short)0); bof.setBuildYear((short)1999); @@ -145,11 +86,11 @@ public class TestEventRecordFactory extends TestCase bof.setVersion((short)0x06); bof.setHistoryBitMask(BOFRecord.HISTORY_MASK); - bytes = bof.serialize(); - nbytes = new byte[bytes.length - 4]; + byte[] bytes = bof.serialize(); + byte[] nbytes = new byte[bytes.length - 4]; System.arraycopy(bytes,4,nbytes,0,nbytes.length); - records = factory.createRecord(new TestcaseRecordInputStream(bof.getSid(),(short)nbytes.length,nbytes)); + Record[] records = RecordFactory.createRecord(new TestcaseRecordInputStream(bof.getSid(),(short)nbytes.length,nbytes)); assertTrue("record.length must be 1, was ="+records.length,records.length == 1); assertTrue("record is the same", compareRec(bof,records[0])); @@ -162,24 +103,19 @@ public class TestEventRecordFactory extends TestCase * @param second the second record to compare * @return boolean whether or not the record where equal */ - private boolean compareRec(Record first, Record second) - { - boolean retval = true; + private static boolean compareRec(Record first, Record second) { byte[] rec1 = first.serialize(); byte[] rec2 = second.serialize(); - if (rec1.length == rec2.length) { - for (int k=0; k * */ - public void testContinuedUnknownRecord() - { - final byte[] data = new byte[] - { + public void testContinuedUnknownRecord() { + final byte[] data = { 0, -1, 0, 0, // an unknown record with 0 length 0x3C , 0, 3, 0, 1, 2, 3, // a continuation record with 3 bytes of data 0x3C , 0, 1, 0, 4 // one more continuation record with 1 byte of data @@ -213,8 +147,7 @@ public class TestEventRecordFactory extends TestCase final int[] recCnt = { 0 }; final int[] offset = { 0 }; - factory.registerListener( - new ERFListener() { + ERFListener listener = new ERFListener() { private String[] expectedRecordTypes = { UnknownRecord.class.getName(), ContinueRecord.class.getName(), @@ -238,14 +171,11 @@ public class TestEventRecordFactory extends TestCase assertEquals(message + " data byte " + i, data[offset[0]++], recData[i]); } } - }, - new short[] {-256, 0x3C} - ); + }; + EventRecordFactory factory = new EventRecordFactory(listener, new short[] {-256, 0x3C}); factory.processRecords(new ByteArrayInputStream(data)); assertEquals("nr. of processed records", 3, recCnt[0]); assertEquals("nr. of processed bytes", data.length, offset[0]); } - - } diff --git a/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java b/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java index 9bb137ff6..0913ab725 100644 --- a/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java +++ b/src/testcases/org/apache/poi/hssf/extractor/TestExcelExtractor.java @@ -255,4 +255,20 @@ public final class TestExcelExtractor extends TestCase { ex.getText()); assertEquals("Excel With Embeded", ex.getSummaryInformation().getTitle()); } + + /** + * Test that we get text from headers and footers + */ + public void test45538() throws Exception { + String[] files = new String[] { + "45538_classic_Footer.xls", "45538_form_Footer.xls", + "45538_classic_Header.xls", "45538_form_Header.xls" + }; + for(int i=0; i