This commit was manufactured by cvs2svn to create tag 'REL_2_0_RC1'.

git-svn-id: https://svn.apache.org/repos/asf/jakarta/poi/tags/REL_2_0_RC1@353435 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
No Author 2003-11-02 11:20:31 +00:00
parent a70452b9dd
commit 833cb722b1
156 changed files with 4655 additions and 1345 deletions

View File

@ -1,10 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<classpath>
<classpathentry kind="src" path="src/testcases"/>
<classpathentry kind="src" path="src/java"/>
<classpathentry kind="src" path="src/examples/src"/>
<classpathentry kind="var" path="JRE_LIB" rootpath="JRE_SRCROOT" sourcepath="JRE_SRC"/>
<classpathentry kind="lib" path="tools/cents/junit.cent/lib/junit-3.7.jar"/>
<classpathentry kind="lib" path="lib/core/commons-logging-1.0.jar"/>
<classpathentry kind="output" path="build"/>
</classpath>

View File

@ -1,4 +1,5 @@
dist
build
scripts
*.el
*.ipr
@ -8,3 +9,5 @@ build.number
log*.*
*.log
build
.classpath
.project

View File

@ -1,17 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<projectDescription>
<name>POI</name>
<comment></comment>
<projects>
</projects>
<buildSpec>
<buildCommand>
<name>org.eclipse.jdt.core.javabuilder</name>
<arguments>
</arguments>
</buildCommand>
</buildSpec>
<natures>
<nature>org.eclipse.jdt.core.javanature</nature>
</natures>
</projectDescription>

View File

@ -6,7 +6,7 @@
Glen Stampoultzis glens at apache.org
This build was tested with and 1.5.3 although it will probably work with
This build was tested with ant 1.5.3 although it will probably work with
other versions. The following jar files should be installed
into the ant lib directory:
@ -15,6 +15,7 @@
junit(3.8+) http://www.ibiblio.org/maven/junit/jars/
xerces http://www.ibiblio.org/maven/xerces/jars/
jdepend http://www.ibiblio.org/maven/jdepend/jars/
xalan http://www.ibiblio.org/maven/xalan/jars/
The ant jar "optional.jar" should also be available otherwise the
build will fail.
@ -82,7 +83,7 @@
<property name="changelog.file" value="${build.site}/changelog.html"/>
<property name="dist.dir" value="build/dist"/>
<property name="jar.name" value="poi"/>
<property name="version.id" value="2.0-pre1"/>
<property name="version.id" value="2.0-RC1"/>
<property name="halt.on.test.failure" value="true"/>
<path id="main.classpath">
@ -141,14 +142,17 @@
<target name="check-jars">
<condition property="jars.present">
<or>
<and>
<available file="${main.jar1.dir}"/>
<available file="${main.jar2.dir}"/>
<available file="${contrib.jar1.dir}"/>
<available file="${contrib.jar2.dir}"/>
<available file="${contrib.jar3.dir}"/>
<available file="${junit.jar1.dir}"/>
<available file="${contrib.jar3.dir}"/>
<available file="${junit.jar1.dir}"/>
</and>
<isset property="disconnected"/>
</or>
</condition>
</target>
@ -214,15 +218,16 @@
</uptodate>
</target>
<target name="test-main" depends="compile-main,-test-main-check" unless="main.test.notRequired">
<junit printsummary="yes" showoutput="true" filtertrace="no" fork="no"
haltonfailure="${halt.on.test.failure}" failureproperty="main.test.failed">
<classpath>
<path id="test.classpath">
<path refid="main.classpath"/>
<pathelement location="${main.output.dir}"/>
<pathelement location="${main.output.test.dir}"/>
<pathelement location="${junit.jar1.dir}"/>
</classpath>
</path>
<target name="test-main" depends="compile-main,-test-main-check" unless="main.test.notRequired">
<junit printsummary="yes" showoutput="true" filtertrace="no" fork="no"
haltonfailure="${halt.on.test.failure}" failureproperty="main.test.failed">
<classpath refid="test.classpath"/>
<sysproperty key="HSSF.testdata.path" value="${main.src.test}/org/apache/poi/hssf/data"/>
<sysproperty key="HPSF.testdata.path" value="${main.src.test}/org/apache/poi/hpsf/data"/>
<formatter type="plain"/>
@ -238,14 +243,9 @@
<antcall target="-test-main-write-testfile"/>
</target>
<target name="single-test" depends="compile-main">
<junit printsummary="no" showoutput="true" filtertrace="no" fork="no" haltonfailure="${halt.on.test.failure}" failureproperty="main.test.failed" >
<classpath>
<path refid="main.classpath"/>
<pathelement location="${main.output.dir}"/>
<pathelement location="${main.output.test.dir}"/>
<pathelement location="${junit.jar1.dir}"/>
</classpath>
<target name="single-test" depends="-test-property-check,compile-main">
<junit printsummary="no" showoutput="true" filtertrace="no" haltonfailure="${halt.on.test.failure}" failureproperty="main.test.failed" >
<classpath refid="test.classpath"/>
<sysproperty key="HSSF.testdata.path" value="${main.src.test}/org/apache/poi/hssf/data"/>
<sysproperty key="HPSF.testdata.path" value="${main.src.test}/org/apache/poi/hpsf/data"/>
<formatter type="plain" usefile="no"/>
@ -254,6 +254,24 @@
</junit>
</target>
<target name="debug-test" depends="-test-property-check,compile-main">
<junit printsummary="no" showoutput="true" filtertrace="no" fork="yes" haltonfailure="${halt.on.test.failure}" failureproperty="main.test.failed" >
<jvmarg value="-Xdebug"/>
<jvmarg value="-Xrunjdwp:transport=dt_socket,address=5001,server=y,suspend=y"/>
<sysproperty key="java.compiler" value="NONE"/>
<classpath refid="test.classpath"/>
<sysproperty key="HSSF.testdata.path" value="${main.src.test}/org/apache/poi/hssf/data"/>
<sysproperty key="HPSF.testdata.path" value="${main.src.test}/org/apache/poi/hpsf/data"/>
<formatter type="plain" usefile="no"/>
<test name="${testcase}" />
</junit>
</target>
<target name="-test-property-check" unless="testcase">
<echo message="Please use -Dtestcase=org.your.testcase to run a single test"/>
<fail/>
</target>
<target name="-test-main-write-testfile" unless="main.test.failed">
<echo file="${main.testokfile}" append="false" message="testok"/>
</target>
@ -334,11 +352,10 @@
</target>
<target name="-check-forrest-installed" unless="env.FORREST_HOME">
<echo>
Please install apache forrest and set the
FORREST_HOME environment variable.
</echo>
<fail/>
<echo>Please install Apache Forrest (see
&lt;http://xml.apache.org/forrest/index.html&gt;) and set the
FORREST_HOME environment variable!</echo>
<fail message="Apache Forrest is not installed."/>
</target>
<!-- <target name="check-docs">-->
@ -386,6 +403,18 @@
</condition>
</target>
<target name="-cvschangelog" unless="disconnected">
<cvschangelog destfile="${changelog.file}" daysinpast="30"/>
<style in="${changelog.file}"
out="${build.site.src}/src/documentation/content/changelog.html"
style="changelog.xsl">
<param name="title" expression="POI Change Log"/>
<param name="module" expression="jakarta-poi"/>
<param name="cvsweb" expression="http://cvs.apache.org/viewcvs/"/>
</style>
</target>
<target name="reports" depends="-check-reports" unless="reports.notRequired"
description="Creates junit,jdepend and javadoc reports">
<antcall target="test">
@ -425,15 +454,7 @@
out="${jdepend.report.out.dir}/index.html"
style="jdepend.xsl"/>
<cvschangelog destfile="${changelog.file}" daysinpast="30"/>
<style in="${changelog.file}"
out="${build.site.src}/src/documentation/content/changelog.html"
style="changelog.xsl">
<param name="title" expression="POI Change Log"/>
<param name="module" expression="jakarta-poi"/>
<param name="cvsweb" expression="http://cvs.apache.org/viewcvs/"/>
</style>
<antcall target="-cvschangelog"/>
<javadoc
destdir="${apidocs.report.dir}"
@ -547,9 +568,9 @@
<tar destfile="${dist.dir}/${jar.name}-bin-${version.id}-${DSTAMP}.tar.gz" compression="gzip">
<tarfileset dir="${build.site}" prefix="docs"/>
<tarfileset file="${dist.dir}/${jar.name}-${version.id}.jar"/>
<tarfileset file="${dist.dir}/${jar.name}-contrib-${version.id}.jar"/>
<tarfileset file="${dist.dir}/${jar.name}-scratchpad-${version.id}.jar"/>
<tarfileset file="${dist.dir}/${jar.name}-${version.id}-${DSTAMP}.jar"/>
<tarfileset file="${dist.dir}/${jar.name}-contrib-${version.id}-${DSTAMP}.jar"/>
<tarfileset file="${dist.dir}/${jar.name}-scratchpad-${version.id}-${DSTAMP}.jar"/>
<tarfileset dir="legal" prefix="legal"/>
</tar>
@ -570,6 +591,6 @@
<target name="clean-dist" depends="clean,dist" description="Cleans the build directory then creates a distribution"/>
<target name="gump" depends="jar"/>
<target name="gump" depends="jar,test"/>
</project>

View File

@ -9,7 +9,7 @@
<menu label="Community">
<menu-item label="News" href="news.html"/>
<menu-item label="Mirrors" href="mirrors.html"/>
<menu-item label="Changes" href="changes.html"/>
<menu-item label="Changes" href="site:changes"/>
<menu-item label="To Do" href="todo.html"/>
<menu-item label="Get Involved" href="getinvolved/index.html"/>
<menu-item label="Mailing Lists" href="http://jakarta.apache.org/site/mail.html"/>

View File

@ -1,129 +0,0 @@
<?xml version="1.0"?>
<!DOCTYPE changes PUBLIC "-//APACHE//DTD Changes V1.1//EN" "./dtd/changes-v11.dtd">
<changes>
<title>History of Changes</title>
<devs>
<!-- in strict alphabetical order -->
<person id="AO" name="Andrew C. Oliver" email="acoliver2@users.sourceforge.net"/>
<person id="GJS" name="Glen Stampoultzis" email="glens@apache.org"/>
<person id="MJ" name="Marc Johnson" email="mjohnson@apache.org"/>
<person id="NKB" name="Nicola Ken Barozzi" email="barozzi@nicolaken.com"/>
<person id="POI-DEVELOPERS" name="Poi Developers" email="poi-dev@jakarta.apache.org"/>
</devs>
<release version="2.0-pre1" date="unreleased">
<action dev="POI-DEVELOPERS" type="add">Patch applied for deep cloning of worksheets was provided</action>
<action dev="POI-DEVELOPERS" type="add">Patch applied to allow sheet reordering</action>
<action dev="POI-DEVELOPERS" type="add">Added additional print area setting methods using row/column numbers</action>
<action dev="POI-DEVELOPERS" type="fix">HDF: Negative Array size fix</action>
<action dev="POI-DEVELOPERS" type="update">Added argument pointers to support the IF formula</action>
<action dev="POI-DEVELOPERS" type="update">Formulas: Added special character support for string literals, specifically for SUMIF formula support and addresses a bug as well</action>
<action dev="POI-DEVELOPERS" type="fix">BlockingInputStream committed to help ensure reads</action>
<action dev="POI-DEVELOPERS" type="fix">Fixed problem with NaN values differing from the investigated value from file reads in FormulaRecords</action>
<action dev="POI-DEVELOPERS" type="fix">Patch for getColumnWidth in HSSF</action>
<action dev="POI-DEVELOPERS" type="add">Patch for dealing with mult-level numbered lists in HDF</action>
<action dev="POI-DEVELOPERS" type="fix">Due to named reference work, several named-ranged bugs were closed</action>
<action dev="POI-DEVELOPERS" type="fix">Patch applied to prevent sheet corruption after a template modification</action>
<action dev="POI-DEVELOPERS" type="update">Shared Formulas now Supported</action>
<action dev="POI-DEVELOPERS" type="update">Added GreaterEqual, LessEqual and NotEqual to Formula Parser</action>
<action dev="POI-DEVELOPERS" type="update">Added GreaterThan and LessThan functionality to formulas</action>
<action dev="POI-DEVELOPERS" type="fix">Patches for i10n</action>
<action dev="POI-DEVELOPERS" type="update">POI Build System Updated</action>
<action dev="POI-DEVELOPERS" type="fix">font names can now be null</action>
</release>
<release version="1.10-dev" date="19 Feb 2003">
<action dev="POI-DEVELOPERS" type="add">Support for zoom level</action>
<action dev="POI-DEVELOPERS" type="add">Freeze and split pane support</action>
<action dev="POI-DEVELOPERS" type="add">Row and column headers on printouts</action>
</release>
<release version="1.8-dev" date="20 Sep 2002">
<action dev="POI-DEVELOPERS" type="add">Custom Data Format Support</action>
<action dev="POI-DEVELOPERS" type="add">Enhanced Unicode Support for Russian and Japanese</action>
<action dev="POI-DEVELOPERS" type="add">Enhanced formula support including read-only for
"optimized if" statements.</action>
<action dev="POI-DEVELOPERS" type="add">Support for cloning objects</action>
<action dev="POI-DEVELOPERS" type="add">Fixes for header/footer</action>
<action dev="POI-DEVELOPERS" type="add">Spanish Documentation translations</action>
<action dev="POI-DEVELOPERS" type="add">Support for preserving VBA macros</action>
</release>
<release version="1.7-dev" date="???">
<action dev="NKB" type="update">Removed runtime dependency on commons logging.</action>
<action dev="POI-DEVELOPERS" type="update">Formula support</action>
</release>
<release version="1.5.1" date="16 June 2002">
<action dev="GJS" type="update">Removed depedency on commons logging. Now define poi.logging system property to enable logging to standard out.</action>
<action dev="GJS" type="fix">Fixed SST string handling so that spreadsheets with rich text or extended text will be read correctly.</action>
</release>
<release version="1.5" date="06 May 2002">
<action dev="NKB" type="update">New project build.</action>
<action dev="NKB" type="update">New project documentation system based on Cocoon.</action>
<action dev="POI-DEVELOPERS" type="update">Package rename</action>
<action dev="POI-DEVELOPERS" type="fix">Various bug fixes</action>
<action dev="POI-DEVELOPERS" type="add">Early stages of HSF development (not ready for development)</action>
<action dev="POI-DEVELOPERS" type="add">Initial low level record support for charting (not complete)</action>
</release>
<release version="1.1.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Created new event model</action>
<action dev="POI-DEVELOPERS">Optimizations made to HSSF including aggregate records for
values, rows, etc.</action>
<action dev="POI-DEVELOPERS">predictive sizing, offset based writing (instead of lots of
array copies)</action>
<action dev="POI-DEVELOPERS">minor re-factoring and bug fixes.</action>
</release>
<release version="1.0.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Minor documentation updates.</action>
</release>
<release version="0.14.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Added DataFormat helper class and exposed set and get format
on HSSFCellStyle</action>
<action dev="POI-DEVELOPERS">Fixed column width apis (unit wise) and various javadoc on
the subject</action>
<action dev="POI-DEVELOPERS">Fix for Dimensions record (again)... (one of these days I'll
write a unit test for this ;-p).</action>
<action dev="POI-DEVELOPERS">Some optimization on sheet creation.</action>
</release>
<release version="0.13.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Changes not recorded.</action>
</release>
<release version="0.12.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Added MulBlank, Blank, ColInfo</action>
<action dev="POI-DEVELOPERS">Added log4j facility and removed all sys.out type logging</action>
<action dev="POI-DEVELOPERS">Added support for adding font's, styles and corresponding
high level api for styling cells</action>
<action dev="POI-DEVELOPERS">added support for changing row height, cell width and default
row height/cell width.</action>
<action dev="POI-DEVELOPERS">Added fixes for internationalization (UTF-16 should work now
from HSSFCell.setStringValue, etc when the encoding is set)</action>
<action dev="POI-DEVELOPERS">added support for adding/removing and naming sheets.</action>
</release>
<release version="0.11.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Bugfix release. We were throwing an exception when reading
RKRecord objects.</action>
</release>
<release version="0.10.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Got continuation records to work (read/write)</action>
<action dev="POI-DEVELOPERS">Added various pre-support for formulas</action>
<action dev="POI-DEVELOPERS">Massive API reorganization, repackaging.</action>
<action dev="POI-DEVELOPERS">BiffViewer class added for validating HSSF &amp; POI and/or
HSSF Output.</action>
<action dev="POI-DEVELOPERS">Better API support for modification.</action>
</release>
<release version="0.7 (and interim releases)" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Added encoding flag to high and low level api to use utf-16
when needed (HSSFCell.setEncoding())</action>
<action dev="POI-DEVELOPERS">added read only support for Label records (which are
reinterpreted as LabelSST when written)</action>
<action dev="POI-DEVELOPERS">Broken continuation record implementation (oops)</action>
<action dev="POI-DEVELOPERS">BiffViewer class added for validating HSSF &amp; POI and/or
HSSF Output.</action>
</release>
<release version="0.6 (release)" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Support for read/write and modify.</action>
<action dev="POI-DEVELOPERS">Read only support for MulRK records (converted to Number when
writing)
</action>
</release>
</changes>

View File

@ -46,6 +46,10 @@
<td>jdepend</td>
<td>http://www.ibiblio.org/maven/jdepend/jars/</td>
</tr>
<tr>
<td>xalan</td>
<td>http://www.ibiblio.org/maven/xalan/jars/</td>
</tr>
</table>
<p>
Just pick the latest versions of these jars and place

View File

@ -478,7 +478,7 @@
recordid = 0x1034, size =0
[END]
[/END]
<!-- break -->
============================================
Offset 0x1006 (4102)
rectype = 0x1044, recsize = 0x4
@ -801,6 +801,7 @@
.crossesFarRight = false
.reversed = false
[/CATSERRANGE]
<!-- break -->
============================================
Offset 0x1124 (4388)
@ -1220,7 +1221,7 @@
[UNKNOWN RECORD]
.id = 104f
[/UNKNOWN RECORD]
<!-- break -->
============================================
Offset 0x12c4 (4804)
rectype = 0x1051, recsize = 0x8

View File

@ -31,7 +31,7 @@
<li><link href="#ReadWriteWorkbook">Reading and writing</link></li>
<li><link href="#NewLinesInCells">Use newlines in cells.</link></li>
<li><link href="#DataFormats">Create user defined data formats.</link></li>
<li><link href="#PrintArea">Fit sheet to one page</link></li>
<li><link href="#FitTo">Fit Sheet to One Page</link></li>
<li><link href="#PrintArea2">Set print area for a sheet.</link></li>
<li><link href="#FooterPageNumbers">Set page numbers on the footer of a sheet.</link></li>
<li><link href="#ShiftRows">Shift rows.</link></li>
@ -420,14 +420,14 @@
fileOut.close();
</source>
</section>
<anchor id="PrintArea"/>
<section><title>Set Print Area to One Page</title>
<anchor id="FitTo"/>
<section><title>Fit Sheet to One Page</title>
<source>
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("format sheet");
HSSFPrintSetup ps = sheet.getPrintSetup()
HSSFPrintSetup ps = sheet.getPrintSetup();
sheet.setAutobreaks(true)
sheet.setAutobreaks(true);
ps.setFitHeight((short)1);
ps.setFitWidth((short)1);

View File

@ -18,11 +18,15 @@
<section><title>Purpose</title>
<p>
The POI project consists of APIs for manipulating various file formats
based upon Microsoft's OLE 2 Compound Document format using pure Java.
based upon Microsoft's OLE 2 Compound Document format using pure Java. In short, you can
read and write MS Excel files using Java. Soon, you'll be able to read and write
Word files using Java. POI is your Java Excel solution as well as your Word Excel solution.
However, we have a complete API for porting other OLE 2 Compound Document formats and welcome
others to participate.
</p>
<p>
OLE 2 Compound Document Format based files include most Microsoft Office
files such as XLS and DOC.
files such as XLS and DOC as well as MFC serialization API based file formats.
</p>
<p>
As a general policy we try to collaborate as much as possible with other projects to
@ -46,7 +50,7 @@
we say that POIFS is the most complete and correct port of this file format to date!
</p>
<p>
You'd use HSSF if you needed to read or write an XLS (Excel) file using Java. You can also read and modify
You'd use HSSF if you needed to read or write an Excel file using Java (XLS). You can also read and modify
spreadsheets using this API, although right now writing is more mature.
</p>
</section>

View File

@ -16,6 +16,7 @@ See http://xml.apache.org/forrest/linking.html for more info
<site label="POI" href="" xmlns="http://apache.org/forrest/linkmap/1.0">
<external-refs>
<xml.apache.org href="http://xml.apache.org/">
<forrest href="forrest/">
@ -31,7 +32,8 @@ See http://xml.apache.org/forrest/linking.html for more info
<junit href="junit/index.html"/>
<jdepend href="jdepend/index.html"/>
<javadoc href="apidocs/index.html"/>
<download href="http://jakarta.apache.org/builds/jakarta-poi/"/>
<download href="http://jakarta.apache.org/builds/jakarta-poi/"/>
<changes href="changes.html"/>
</external-refs>
</site>

View File

@ -1,18 +1,191 @@
<?xml version="1.0"?>
<status>
<devs>
<developers>
<!-- in strict alphabetical order -->
<person id="AO" name="Andrew C. Oliver" email="acoliver2@users.sourceforge.net"/>
<person id="GS" name="Glen Stampoultzis" email="gstamp@iprimus.com.au"/>
<person id="MJ" name="Marc Johnson" email="mjohnson at apache dot org"/>
<person id="NKB" name="Nicola Ken Barozzi" email="barozzi@nicolaken.com"/>
<person id="open" name="Poi Developers" email="poi-dev@jakarta.apache.org"/>
</devs>
</developers>
<changes>
<release verion="2.0-RC1" date="2 November 2003">
<action dev="POI-DEVELOPERS" type="fix" context="All">12561 (Min) HSSFWorkbook throws Exceptions</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">12730 (Nor) values dont get copied to another sheet.</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">13224 (Maj) Exception thrown when cell has =Names call</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">13796 (Nor) Error Reading Formula Record (optimized if, external link)</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">13921 (Nor) Sheet name cannot exceed 31 characters and cannot contain :</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">14330 (Nor) Error reading FormulaRecord</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">14460 (Nor) Name in Formula - ArrayOutOfBoundsException</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">15228 (Cri) [Urgent] ArrayIndexoutofbounds Exception. POI - Version 1.8</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">16488 (Maj) Unable to open written spreadsheet in Excel, but can in Open</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">16559 (Nor) testCustomPalette.xls crashes Excel 97</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">16560 (Nor) testBoolErr.xls crashes Excel '97</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">17374 (Min) HSSFFont - BOLDWEIGHT_NORMAL</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">18800 (Maj) The sheet made by HSSFWorkbook#cloneSheet() doesn't work cor</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">18846 (Min) [PATCH][RFE]Refactor the transformation between byte array a</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">19599 (Min) java.lang.IllegalArgumentException</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">19961 (Nor) [PATCH] Sheet.getColumnWidth() returns wrong value</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">21066 (Blo) Can not modify a blank spreadsheet</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">21444 (Enh) [PATCH] Macro functions</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">21447 (Nor) [RFE]String Formula Cells</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">21674 (Enh) [PATCH] Documentation changes for @(Greater|Less|Not)EqualPt</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">21863 (Enh) [PATCH] build.xml fixes</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">22195 (Nor) [RFE] [PATCH] Support for Storage Class ID</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">22742 (Cri) Failed to create HSSFWorkbook!</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">22922 (Cri) HSSFSheet.shiftRows() throws java.lang.IndexOutOfBoundsExcep</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">22963 (Nor) org.apache.poi.hpsf.SummaryInformation.getEditTime() should</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">24149 (Maj) Error passing inputstream to POIFSFileSystem</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">21722 (Nor) [PATCH] Add a ProtectRecord to Sheets and give control over</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">9576 (Nor) [PATCH] DBCELL, INDEX EXTSST (was Acess 97 import)</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">13478 (Blo) [PATCH] [RFE] POIFS, RawDataBlock: Missing workaround for lo</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">14824 (Nor) Unable to modify empty sheets</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">12843 (Cri) [PATCH] Make POI handle chinese better</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">15353 (Nor) [RFE] creating a cell with a hyperlink</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">15375 (Blo) Post 1.5.1 POI causes spreadsheet to become unopenable.</action>
</release>
<release version="2.0-pre3" date="29 July 2003">
<action dev="POI-DEVELOPERS" type="add" context="All">HPSF is now able to read properties which are given in the property set stream but which don't have a value ("variant" type VT_EMPTY). The getXXX() methods of the PropertySet class return null if their return type is a reference (like a string) or 0 if the return type is numeric. Details about the return types and about how to distinguish between a property value of zero and a property value that is not present can be found in the API documentation.</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Gridlines can now be turned on and off</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">NamePTG refactoring/fixes</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">minor fixes to ExternSheet and formula strings</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Sheet comparisons now ignore case</action>
</release>
<release version="2.0-pre2" date="6 July 2003">
<action dev="POI-DEVELOPERS" type="fix" context="All" >A nasty concurrency problem has been fixed. Any users working in a multithreaded environment should seriously consider upgrading to this release.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">The EXTSST record has been implemented. This record is used by excel for optimized reading of strings.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">When rows are shifted, the merged regions now move with them. If a row contains 2 merged cells, the resulting shifted row should have those cells merged as well.</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">There were some issues when removing merged
regions (specifically, removing all of them and then adding some more) and have been resolved.</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">When a sheet contained shared formulas (when a formula is
dragged across greater than 6 cells), the clone would fail. We now support cloning of
sheets that contain this Excel optimization. </action>
<action dev="POI-DEVELOPERS" type="add" context="All">Support added for reading formulas with UnaryPlus and UnaryMinus operators.</action>
</release>
<release version="2.0-pre1" date="17 May 2003">
<action dev="POI-DEVELOPERS" type="add" context="All">Patch applied for deep cloning of worksheets was provided</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Patch applied to allow sheet reordering</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Added additional print area setting methods using row/column numbers</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">HDF: Negative Array size fix</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Added argument pointers to support the IF formula</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Formulas: Added special character support for string literals, specifically for SUMIF formula support and addresses a bug as well</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">BlockingInputStream committed to help ensure reads</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Fixed problem with NaN values differing from the investigated value from file reads in FormulaRecords</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Patch for getColumnWidth in HSSF</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Patch for dealing with mult-level numbered lists in HDF</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Due to named reference work, several named-ranged bugs were closed</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Patch applied to prevent sheet corruption after a template modification</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Shared Formulas now Supported</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Added GreaterEqual, LessEqual and NotEqual to Formula Parser</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Added GreaterThan and LessThan functionality to formulas</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Patches for i10n</action>
<action dev="POI-DEVELOPERS" type="update" context="All">POI Build System Updated</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">font names can now be null</action>
</release>
<release version="1.10-dev" date="19 Feb 2003">
<action dev="POI-DEVELOPERS" type="add" context="All">Support for zoom level</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Freeze and split pane support</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Row and column headers on printouts</action>
</release>
<release version="1.8-dev" date="20 Sep 2002">
<action dev="POI-DEVELOPERS" type="add" context="All">Custom Data Format Support</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Enhanced Unicode Support for Russian and Japanese</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Enhanced formula support including read-only for
"optimized if" statements.</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Support for cloning objects</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Fixes for header/footer</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Spanish Documentation translations</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Support for preserving VBA macros</action>
</release>
<release version="1.7-dev" date="???">
<action dev="NKB" type="update" context="All">Removed runtime dependency on commons logging.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Formula support</action>
</release>
<release version="1.5.1" date="16 June 2002">
<action dev="GJS" type="update" context="All">Removed depedency on commons logging. Now define poi.logging system property to enable logging to standard out.</action>
<action dev="GJS" type="fix" context="All">Fixed SST string handling so that spreadsheets with rich text or extended text will be read correctly.</action>
</release>
<release version="1.5" date="06 May 2002">
<action dev="NKB" type="update" context="All">New project build.</action>
<action dev="NKB" type="update" context="All">New project documentation system based on Cocoon.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Package rename</action>
<action dev="POI-DEVELOPERS" type="fix" context="All">Various bug fixes</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Early stages of HSF development (not ready for development)</action>
<action dev="POI-DEVELOPERS" type="add" context="All">Initial low level record support for charting (not complete)</action>
</release>
<release version="1.1.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Created new event model</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Optimizations made to HSSF including aggregate records for
values, rows, etc.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">predictive sizing, offset based writing (instead of lots of
array copies)</action>
<action dev="POI-DEVELOPERS" type="update" context="All">minor re-factoring and bug fixes.</action>
</release>
<release version="1.0.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Minor documentation updates.</action>
</release>
<release version="0.14.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Added DataFormat helper class and exposed set and get format
on HSSFCellStyle</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Fixed column width apis (unit wise) and various javadoc on
the subject</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Fix for Dimensions record (again)... (one of these days I'll
write a unit test for this ;-p).</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Some optimization on sheet creation.</action>
</release>
<release version="0.13.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Changes not recorded.</action>
</release>
<release version="0.12.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Added MulBlank, Blank, ColInfo</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Added log4j facility and removed all sys.out type logging</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Added support for adding font's, styles and corresponding
high level api for styling cells</action>
<action dev="POI-DEVELOPERS" type="update" context="All">added support for changing row height, cell width and default
row height/cell width.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Added fixes for internationalization (UTF-16 should work now
from HSSFCell.setStringValue, etc when the encoding is set)</action>
<action dev="POI-DEVELOPERS" type="update" context="All">added support for adding/removing and naming sheets.</action>
</release>
<release version="0.11.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Bugfix release. We were throwing an exception when reading
RKRecord objects.</action>
</release>
<release version="0.10.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Got continuation records to work (read/write)</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Added various pre-support for formulas</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Massive API reorganization, repackaging.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">BiffViewer class added for validating HSSF &amp; POI and/or
HSSF Output.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Better API support for modification.</action>
</release>
<release version="0.7 (and interim releases)" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Added encoding flag to high and low level api to use utf-16
when needed (HSSFCell.setEncoding())</action>
<action dev="POI-DEVELOPERS" type="update" context="All">added read only support for Label records (which are
reinterpreted as LabelSST when written)</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Broken continuation record implementation (oops)</action>
<action dev="POI-DEVELOPERS" type="update" context="All">BiffViewer class added for validating HSSF &amp; POI and/or
HSSF Output.</action>
</release>
<release version="0.6 (release)" date="Release date not recorded">
<action dev="POI-DEVELOPERS" type="update" context="All">Support for read/write and modify.</action>
<action dev="POI-DEVELOPERS" type="update" context="All">Read only support for MulRK records (converted to Number when
writing)
</action>
</release>
</changes>
<todo>
<title>Things To Do for POI</title>
<!-- <title>Things To Do for POI</title>-->
<actions priority="high">
<actions context="all" priority="high">
<action context="code" dev="NKB">
Finish HDF
</action>
@ -24,7 +197,7 @@
</action>
</actions>
<actions priority="medium">
<actions context="all" priority="medium">
<action context="code" dev="open">
Expose functionality in low level records in higher level API
</action>
@ -50,103 +223,4 @@
</todo>
<changes>
<title>History of Changes</title>
<release version="1.10-dev" date="19 Feb 2003">
<action dev="POI-DEVELOPERS" type="add">Support for zoom level</action>
<action dev="POI-DEVELOPERS" type="add">Freeze and split pane support</action>
<action dev="POI-DEVELOPERS" type="add">Row and column headers on printouts</action>
</release>
<release version="1.8-dev" date="20 Sep 2002">
<action dev="POI-DEVELOPERS" type="add">Custom Data Format Support</action>
<action dev="POI-DEVELOPERS" type="add">Enhanced Unicode Support for Russian and Japanese</action>
<action dev="POI-DEVELOPERS" type="add">Enhanced formula support including read-only for
"optimized if" statements.</action>
<action dev="POI-DEVELOPERS" type="add">Support for cloning objects</action>
<action dev="POI-DEVELOPERS" type="add">Fixes for header/footer</action>
<action dev="POI-DEVELOPERS" type="add">Spanish Documentation translations</action>
<action dev="POI-DEVELOPERS" type="add">Support for preserving VBA macros</action>
</release>
<release version="1.7-dev" date="???">
<action dev="NKB" type="update">Removed runtime dependency on commons logging.</action>
<action dev="POI-DEVELOPERS" type="update">Formula support</action>
</release>
<release version="1.5.1" date="16 June 2002">
<action dev="GJS" type="update">Removed depedency on commons logging. Now define poi.logging system property to enable logging to standard out.</action>
<action dev="GJS" type="fix">Fixed SST string handling so that spreadsheets with rich text or extended text will be read correctly.</action>
</release>
<release version="1.5" date="06 May 2002">
<action dev="NKB" type="update">New project build.</action>
<action dev="NKB" type="update">New project documentation system based on Cocoon.</action>
<action dev="POI-DEVELOPERS" type="update">Package rename</action>
<action dev="POI-DEVELOPERS" type="fix">Various bug fixes</action>
<action dev="POI-DEVELOPERS" type="add">Early stages of HSF development (not ready for development)</action>
<action dev="POI-DEVELOPERS" type="add">Initial low level record support for charting (not complete)</action>
</release>
<release version="1.1.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Created new event model</action>
<action dev="POI-DEVELOPERS">Optimizations made to HSSF including aggregate records for
values, rows, etc.</action>
<action dev="POI-DEVELOPERS">predictive sizing, offset based writing (instead of lots of
array copies)</action>
<action dev="POI-DEVELOPERS">minor re-factoring and bug fixes.</action>
</release>
<release version="1.0.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Minor documentation updates.</action>
</release>
<release version="0.14.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Added DataFormat helper class and exposed set and get format
on HSSFCellStyle</action>
<action dev="POI-DEVELOPERS">Fixed column width apis (unit wise) and various javadoc on
the subject</action>
<action dev="POI-DEVELOPERS">Fix for Dimensions record (again)... (one of these days I'll
write a unit test for this ;-p).</action>
<action dev="POI-DEVELOPERS">Some optimization on sheet creation.</action>
</release>
<release version="0.13.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Changes not recorded.</action>
</release>
<release version="0.12.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Added MulBlank, Blank, ColInfo</action>
<action dev="POI-DEVELOPERS">Added log4j facility and removed all sys.out type logging</action>
<action dev="POI-DEVELOPERS">Added support for adding font's, styles and corresponding
high level api for styling cells</action>
<action dev="POI-DEVELOPERS">added support for changing row height, cell width and default
row height/cell width.</action>
<action dev="POI-DEVELOPERS">Added fixes for internationalization (UTF-16 should work now
from HSSFCell.setStringValue, etc when the encoding is set)</action>
<action dev="POI-DEVELOPERS">added support for adding/removing and naming sheets.</action>
</release>
<release version="0.11.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Bugfix release. We were throwing an exception when reading
RKRecord objects.</action>
</release>
<release version="0.10.0" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Got continuation records to work (read/write)</action>
<action dev="POI-DEVELOPERS">Added various pre-support for formulas</action>
<action dev="POI-DEVELOPERS">Massive API reorganization, repackaging.</action>
<action dev="POI-DEVELOPERS">BiffViewer class added for validating HSSF &amp; POI and/or
HSSF Output.</action>
<action dev="POI-DEVELOPERS">Better API support for modification.</action>
</release>
<release version="0.7 (and interim releases)" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Added encoding flag to high and low level api to use utf-16
when needed (HSSFCell.setEncoding())</action>
<action dev="POI-DEVELOPERS">added read only support for Label records (which are
reinterpreted as LabelSST when written)</action>
<action dev="POI-DEVELOPERS">Broken continuation record implementation (oops)</action>
<action dev="POI-DEVELOPERS">BiffViewer class added for validating HSSF &amp; POI and/or
HSSF Output.</action>
</release>
<release version="0.6 (release)" date="Release date not recorded">
<action dev="POI-DEVELOPERS">Support for read/write and modify.</action>
<action dev="POI-DEVELOPERS">Read only support for MulRK records (converted to Number when
writing)
</action>
</release>
</changes>
</status>
</status>

View File

@ -1,9 +1,9 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE tabs PUBLIC "-//APACHE//DTD Cocoon Documentation Tab V1.0//EN" "tab-cocoon-v10.dtd">
<tabs software="MyProj"
title="MyProj"
copyright="Foo"
<tabs software="POI"
title="POI"
copyright="Apache Foundation"
xmlns:xlink="http://www.w3.org/1999/xlink">
<!-- The rules are:

View File

@ -8,7 +8,7 @@
<menu label="Gemeinschaft">
<menu-item label="Neuigkeiten" href="../../news.html"/>
<menu-item label="Änderungen" href="../../changes.html"/>
<menu-item label="Änderungen" href="/changes.html"/>
<menu-item label="Aufgaben" href="../../todo.html"/>
<menu-item label="Mitmachen" href="../../getinvolved/index.html"/>
<menu-item label="Unsere Vision" href="../../plan/POI20Vision.html"/>

View File

@ -9,7 +9,7 @@
<menu label="Comunidad">
<menu-item label="Noticias" href="news.html"/>
<menu-item label="Espejos" href="../../mirrors.html"/>
<menu-item label="Cambios" href="changes.html"/>
<menu-item label="Cambios" href="site:changes"/>
<menu-item label="Tareas" href="todo.html"/>
<menu-item label="Contribuya" href="../../getinvolved/index.html"/>
<menu-item label="Listas de Correo" href="http://jakarta.apache.org/site/mail.html"/>

View File

@ -1,106 +0,0 @@
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE changes PUBLIC "-//APACHE//DTD Changes V1.1//EN" "../../dtd/changes-v11.dtd">
<changes><title>Historial de Cambios</title>
<devs>
<!-- in strict alphabetical order -->
<person id="AO" name="Andrew C. Oliver" email="acoliver2@users.sourceforge.net"/>
<person id="GJS" name="Glen Stampoultzis" email="glens@apache.org"/>
<person id="MJ" name="Marc Johnson" email="mjohnson@apache.org"/>
<person id="NKB" name="Nicola Ken Barozzi" email="barozzi@nicolaken.com"/>
<person id="POI-DEVELOPERS" name="Poi Developers" email="poi-dev@jakarta.apache.org"/>
</devs>
<release version="1.8-dev" date="20 Septiembre 2002">
<action dev="POI-DEVELOPERS" type="add">Soporte para Formato de Datos Personalizado (Custom)</action>
<action dev="POI-DEVELOPERS" type="add">Soporte Unicode Mejorado para Ruso y Japonés</action>
<action dev="POI-DEVELOPERS" type="add">Soporte para Fórmulas Mejorado, incluyendo
sólo-lectura para sentencias tipo "optimizado si" (optimized if).</action>
<action dev="POI-DEVELOPERS" type="add">Soporte para la clonación de objetos</action>
<action dev="POI-DEVELOPERS" type="add">Arreglos en la cabecera/pie</action>
<action dev="POI-DEVELOPERS" type="add">Traducciones de la documentación al Español</action>
<action dev="POI-DEVELOPERS" type="add">Soporte para preservar macros VBA</action>
</release>
<release version="1.7-dev" date="???">
<action dev="NKB" type="update">Se quita la dependencia en tiempo de ejecución del registro
(logging) de "commons".</action>
<action dev="POI-DEVELOPERS" type="update">Soporte para fórmulas</action>
</release>
<release version="1.5.1" date="16 Junio 2002">
<action dev="GJS" type="update">Se quita la dependencia del registro de "commons". Ahora hay que definir la propiedad del sistema poi.loggin para permitir
que los registros (logs) vayan a la salida estándar.</action>
<action dev="GJS" type="fix">Se arregla la gestión de la cadena SST para que las hojas de cálculo con texto rico (rich text) o texto
extendido se lean correctamente.</action>
</release>
<release version="1.5" date="06 Mayo 2002">
<action dev="NKB" type="update">Nueva versión (build) del proyecto.</action>
<action dev="NKB" type="update">Nuevo sistema de documentación del proyecto basada en Cocoon.</action>
<action dev="POI-DEVELOPERS" type="update">Cambio de nombre del paquete</action>
<action dev="POI-DEVELOPERS" type="fix">Varios errores (bugs) corregidos</action>
<action dev="POI-DEVELOPERS" type="add">Etapas preliminares del desarrollo de HFS (no esta listo para el desarrollo)</action>
<action dev="POI-DEVELOPERS" type="add">Soporte inicial de registros de bajo nivel para gráficas (no está completo)</action>
</release>
<release version="1.1.0" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Se crea un nuevo modelo de eventos</action>
<action dev="POI-DEVELOPERS">Se optimiza HSSF, incluyendo registros (records) para
valores, filas, etc.</action>
<action dev="POI-DEVELOPERS">predicción de tamaño, escritura basada en desplazamiento (en lugar de
multitud de copias de arrays)</action>
<action dev="POI-DEVELOPERS">un poco de re-factoring (¿re-factorización? mejor no) y corrección de errores.</action>
</release>
<release version="1.0.0" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Actualizaciones menores a la documentación.</action>
</release>
<release version="0.14.0" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Se añade la clase de ayuda DataFormat y se expone el formato set y get en
HSSFCellStyle</action>
<action dev="POI-DEVELOPERS">Correcciones a las apis de anchura de columna (en cuanto a las unidades) y
varios comentarios javadoc al respecto</action>
<action dev="POI-DEVELOPERS">Corrección para el registro de "Dimensions" (de nuevo)... (uno de estos días
escribiré una prueba unitaria (unit test) para esto ;-p).</action>
<action dev="POI-DEVELOPERS">Alguna optimización en la creación de páginas.</action>
</release>
<release version="0.13.0" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Mejoras no registradas</action>
</release>
<release version="0.12.0" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Se añaden MulBlank, Blank, ColInfo</action>
<action dev="POI-DEVELOPERS">Se añade facilidad log4j y se quitan las anotaciones (logs) del tipo sys.out</action>
<action dev="POI-DEVELOPERS">Se añade soporte para la adición de fuentes, estilos y el api de alto
nivel correspondiente para dar estilo a las celdas</action>
<action dev="POI-DEVELOPERS">Se añade soporte para cambiar el alto de una fila, el ancho de una celda, y
sus valores por defecto.</action>
<action dev="POI-DEVELOPERS">Correcciones para internacionalización (UTF-16 debería funcionar ahora
desde HSSFCell.setStringValue, etc cuando se define la codificación)</action>
<action dev="POI-DEVELOPERS">Soporte para la adición / eliminación y cambio de nombre de hojas.</action>
</release>
<release version="0.11.0" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Distribución de corrección de errores.
Lanzamos una excepción cuando leemos objetos de tipo RKRecord.</action>
</release>
<release version="0.10.0" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Registros de continuación ya funcionan (lectura/escritura)</action>
<action dev="POI-DEVELOPERS">Se añade soporte previo para fórmulas</action>
<action dev="POI-DEVELOPERS">Reorganización del API masiva, re-enpaquetado.</action>
<action dev="POI-DEVELOPERS">Se añade la clase BiffViewer para validar HSSF &amp; POI y/o la
salida de HSSF.</action>
<action dev="POI-DEVELOPERS">Se mejora el soporte a la modificación del API.</action>
</release>
<release version="0.7 (y distribuciones internas)" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Se añade una bandera de codificación para que las apis de alto
y bajo nivel utilicen utf-16 cuando sea necesario (HSSFCell.setEncoding())</action>
<action dev="POI-DEVELOPERS">Se añade soporte de sólo lectura a registros de Etiqueta
(que son reinterpretados como LabelSST cuando se escriben)</action>
<action dev="POI-DEVELOPERS">Se rompe la implementación del registro de continuación (oops)</action>
<action dev="POI-DEVELOPERS">Se añade la clase BiffViewer
para validar HSSF &amp; POI y/o la
salida de HSSF.</action>
</release>
<release version="0.6 (distribución/release)" date="Fecha de distribución no registrada">
<action dev="POI-DEVELOPERS">Soporte para lectura/escritura y modificación.</action>
<action dev="POI-DEVELOPERS">Soporte de sólo lectura para registros de tipo MulRK
(convertidos a Number cuando se escriben)
</action>
</release>
</changes>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.0 KiB

After

Width:  |  Height:  |  Size: 5.1 KiB

View File

@ -9,22 +9,29 @@ be used to configure the chosen Forrest skin.
<!ENTITY % links.att 'name CDATA #REQUIRED'>
<!ENTITY % link.att 'name CDATA #REQUIRED href CDATA #REQUIRED'>
<!ELEMENT skinconfig (disable-search?, disable-compliance-links?, searchsite-domain?, searchsite-name?,
project-name, project-url, project-logo, group-name?, group-url?, group-logo?,
host-url?, host-logo?, year?, vendor?, trail?, credits?)*>
<!ELEMENT skinconfig (disable-search?, disable-print-link?, disable-pdf-link?,
disable-xml-link?, disable-compliance-links?, obfuscate-mail-links?, searchsite-domain?, searchsite-name?,
project-name, project-description?, project-url, project-logo, group-name?, group-description?, group-url?, group-logo?,
host-url?, host-logo?, year?, vendor?, trail?, toc?, credits?)*>
<!ELEMENT credits (credit*)>
<!ELEMENT credit (name, url, image?, width?, height?)>
<!-- id uniquely identifies the tool, and role indicates its function -->
<!ATTLIST credit id CDATA #IMPLIED
role CDATA #IMPLIED>
<!ELEMENT disable-search (#PCDATA)>
<!ELEMENT disable-print-link (#PCDATA)>
<!ELEMENT disable-pdf-link (#PCDATA)>
<!ELEMENT disable-xml-link (#PCDATA)>
<!ELEMENT disable-compliance-links (#PCDATA)>
<!ELEMENT obfuscate-mail-links (#PCDATA)>
<!ELEMENT searchsite-domain (#PCDATA)>
<!ELEMENT searchsite-name (#PCDATA)>
<!ELEMENT searchsite-name (#PCDATA)>
<!ELEMENT project-name (#PCDATA)>
<!ELEMENT project-description (#PCDATA)>
<!ELEMENT project-url (#PCDATA)>
<!ELEMENT project-logo (#PCDATA)>
<!ELEMENT group-name (#PCDATA)>
<!ELEMENT group-description (#PCDATA)>
<!ELEMENT group-url (#PCDATA)>
<!ELEMENT group-logo (#PCDATA)>
<!ELEMENT host-url (#PCDATA)>
@ -44,12 +51,15 @@ be used to configure the chosen Forrest skin.
<!ELEMENT image (#PCDATA)>
<!ELEMENT width (#PCDATA)>
<!ELEMENT height (#PCDATA)>
<!ELEMENT toc EMPTY>
<!ATTLIST toc level CDATA #IMPLIED>
]>
<skinconfig>
<!-- Do we want to disable the Google search box? -->
<disable-search>false</disable-search>
<disable-compliance-links>false</disable-compliance-links>
<disable-xml-link>true</disable-xml-link>
<searchsite-domain>jakarta.apache.org</searchsite-domain>
<searchsite-name>jakarta</searchsite-name>

View File

@ -80,6 +80,8 @@ public class ReadWriteWorkbook
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFRow row = sheet.getRow(2);
if (row == null)
row = sheet.createRow(2);
HSSFCell cell = row.getCell((short)3);
if (cell == null)
cell = row.createCell((short)3);

View File

@ -56,6 +56,8 @@
package org.apache.poi.hpsf;
import java.io.*;
import org.apache.poi.util.HexDump;
import org.apache.poi.util.LittleEndian;
/**
@ -98,15 +100,21 @@ public class ClassID
*/
public ClassID()
{
bytes = new byte[LENGTH];
for (int i = 0; i < LENGTH; i++)
bytes[i] = 0x00;
bytes = new byte[LENGTH];
for (int i = 0; i < LENGTH; i++)
bytes[i] = 0x00;
}
public final static int LENGTH = 16;
/** <p>The number of bytes occupied by this object in the byte
* stream.</p> */
public static final int LENGTH = 16;
/**
* @return The number of bytes occupied by this object in the byte
* stream.
*/
public int length()
{
return LENGTH;
@ -117,10 +125,12 @@ public class ClassID
/**
* <p>Gets the bytes making out the class ID. They are returned in
* correct order, i.e. big-endian.</p>
*
* @return the bytes making out the class ID.
*/
public byte[] getBytes()
{
return bytes;
return bytes;
}
@ -153,9 +163,9 @@ public class ClassID
bytes[6] = src[7 + offset];
bytes[7] = src[6 + offset];
/* Read 8 bytes. */
for (int i = 8; i < 16; i++)
bytes[i] = src[i + offset];
/* Read 8 bytes. */
for (int i = 8; i < 16; i++)
bytes[i] = src[i + offset];
return bytes;
}
@ -170,30 +180,75 @@ public class ClassID
*
* @param offset The offset within the <var>dst</var> byte array.
*
* @throws ArrayIndexOutOfBoundsException if there is not enough
* room for the class ID in the byte array. There must be at least
* 16 bytes in the byte array after the <var>offset</var>
* position.
* @exception ArrayStoreException if there is not enough room for the class
* ID 16 bytes in the byte array after the <var>offset</var> position.
*/
public void write(final byte[] dst, final int offset)
throws ArrayStoreException
{
/* Check array size: */
if (dst.length < 16)
throw new ArrayStoreException
("Destination byte[] must have room for at least 16 bytes, " +
"but has a length of only " + dst.length + ".");
/* Write double word. */
dst[0 + offset] = bytes[3];
dst[1 + offset] = bytes[2];
dst[2 + offset] = bytes[1];
dst[3 + offset] = bytes[0];
dst[0 + offset] = bytes[3];
dst[1 + offset] = bytes[2];
dst[2 + offset] = bytes[1];
dst[3 + offset] = bytes[0];
/* Write first word. */
dst[4 + offset] = bytes[5];
dst[5 + offset] = bytes[4];
dst[4 + offset] = bytes[5];
dst[5 + offset] = bytes[4];
/* Write second word. */
dst[6 + offset] = bytes[7];
dst[7 + offset] = bytes[6];
dst[6 + offset] = bytes[7];
dst[7 + offset] = bytes[6];
/* Write 8 bytes. */
for (int i = 8; i < 16; i++)
dst[i + offset] = bytes[i];
/* Write 8 bytes. */
for (int i = 8; i < 16; i++)
dst[i + offset] = bytes[i];
}
/**
* <p>Checks whether this <code>ClassID</code> is equal to another
* object.</p>
*
* @param o the object to compare this <code>PropertySet</code> with
* @return <code>true</code> if the objects are equal, else
* <code>false</code>.</p>
*/
public boolean equals(final Object o)
{
if (o == null || !(o instanceof ClassID))
return false;
final ClassID cid = (ClassID) o;
if (bytes.length != cid.bytes.length)
return false;
for (int i = 0; i < bytes.length; i++)
if (bytes[i] != cid.bytes[i])
return false;
return true;
}
/**
* Returns a human readable representation of the Class ID
* in standard format <code>"{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}"</code>
* @return String representation of the Class ID represented
* by this object.
*/
public String toString()
{
StringBuffer sbClassId = new StringBuffer( 38);
sbClassId.append( '{');
for( int i=0; i < 16; i++) {
sbClassId.append( HexDump.toHex( bytes[ i]));
if( i == 3 || i == 5 || i == 7 || i == 9) {
sbClassId.append( '-');
}
}
sbClassId.append( '}');
return sbClassId.toString();
}
}

View File

@ -62,7 +62,6 @@
*/
package org.apache.poi.hpsf;
import java.util.*;
import org.apache.poi.util.LittleEndian;
/**
@ -85,6 +84,7 @@ public class TypeReader
* starts
* @param length The length of the variant including the variant
* type field
* @param type The variant type to read
* @return A Java object that corresponds best to the variant
* field. For example, a VT_I4 is returned as a {@link Long}, a
* VT_LPSTR as a {@link String}.
@ -92,15 +92,25 @@ public class TypeReader
* @see Variant
*/
public static Object read(final byte[] src, int offset, int length,
final int type)
final int type)
{
/*
* FIXME: Support reading more types and clean up this code!
*/
Object value;
length = length - LittleEndian.INT_SIZE;
/*
* FIXME: Support reading more types and clean up this code!
*/
Object value;
length = length - LittleEndian.INT_SIZE;
switch (type)
{
{
case Variant.VT_EMPTY:
{
/*
* FIXME: The value returned by this case relies on the
* assumption that the value VT_EMPTY denotes consists of zero
* bytes. I'd be glad if some could confirm or correct this.
*/
value = null;
break;
}
case Variant.VT_I2:
{
/*
@ -137,11 +147,11 @@ public class TypeReader
* Read a byte string. In Java it is represented as a
* String object. The 0x00 bytes at the end must be
* stripped.
*
* FIXME: Reading an 8-bit string should pay attention
* to the codepage. Currently the byte making out the
* property's value are interpreted according to the
* platform's default character set.
*
* FIXME: Reading an 8-bit string should pay attention
* to the codepage. Currently the byte making out the
* property's value are interpreted according to the
* platform's default character set.
*/
final int first = offset + LittleEndian.INT_SIZE;
long last = first + LittleEndian.getUInt(src, offset) - 1;
@ -149,7 +159,7 @@ public class TypeReader
while (src[(int) last] == 0 && first <= last)
last--;
value = new String(src, (int) first, (int) (last - first + 1));
break;
break;
}
case Variant.VT_LPWSTR:
{
@ -160,27 +170,27 @@ public class TypeReader
*/
final int first = offset + LittleEndian.INT_SIZE;
long last = first + LittleEndian.getUInt(src, offset) - 1;
long l = last - first;
long l = last - first;
offset += LittleEndian.INT_SIZE;
StringBuffer b = new StringBuffer((int) (last - first));
for (int i = 0; i <= l; i++)
{
final int i1 = offset + (i * 2);
final int i2 = i1 + 1;
b.append((char) ((src[i2] << 8) + src[i1]));
}
/* Strip 0x00 characters from the end of the string: */
while (b.charAt(b.length() - 1) == 0x00)
b.setLength(b.length() - 1);
value = b.toString();
break;
StringBuffer b = new StringBuffer((int) (last - first));
for (int i = 0; i <= l; i++)
{
final int i1 = offset + (i * 2);
final int i2 = i1 + 1;
b.append((char) ((src[i2] << 8) + src[i1]));
}
/* Strip 0x00 characters from the end of the string: */
while (b.charAt(b.length() - 1) == 0x00)
b.setLength(b.length() - 1);
value = b.toString();
break;
}
case Variant.VT_CF:
{
final byte[] v = new byte[length];
for (int i = 0; i < length; i++)
v[i] = src[(int) (offset + i)];
value = v;
value = v;
break;
}
case Variant.VT_BOOL:
@ -190,24 +200,24 @@ public class TypeReader
* src[offset + 3] contain the DWord for VT_BOOL, so
* skip it, we don't need it.
*/
final int first = offset + LittleEndian.INT_SIZE;
// final int first = offset + LittleEndian.INT_SIZE;
long bool = LittleEndian.getUInt(src, offset);
if (bool != 0)
value = new Boolean(true);
else
value = new Boolean(false);
break;
break;
}
default:
{
final byte[] v = new byte[length];
for (int i = 0; i < length; i++)
v[i] = src[(int) (offset + i)];
value = v;
value = v;
break;
}
}
return value;
return value;
}
}

View File

@ -76,178 +76,178 @@ public class Variant
/**
* <p>[V][P] Nothing.</p>
*/
public final static int VT_EMPTY = 0;
public static final int VT_EMPTY = 0;
/**
* <p>[V][P] SQL style Null.</p>
*/
public final static int VT_NULL = 1;
public static final int VT_NULL = 1;
/**
* <p>[V][T][P][S] 2 byte signed int.</p>
*/
public final static int VT_I2 = 2;
public static final int VT_I2 = 2;
/**
* <p>[V][T][P][S] 4 byte signed int.</p>
*/
public final static int VT_I4 = 3;
public static final int VT_I4 = 3;
/**
* <p>[V][T][P][S] 4 byte real.</p>
*/
public final static int VT_R4 = 4;
public static final int VT_R4 = 4;
/**
* <p>[V][T][P][S] 8 byte real.</p>
*/
public final static int VT_R8 = 5;
public static final int VT_R8 = 5;
/**
* <p>[V][T][P][S] currency. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_CY = 6;
public static final int VT_CY = 6;
/**
* <p>[V][T][P][S] date. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_DATE = 7;
public static final int VT_DATE = 7;
/**
* <p>[V][T][P][S] OLE Automation string. <span
* style="background-color: #ffff00">How long is this? How is it
* to be interpreted?</span></p>
*/
public final static int VT_BSTR = 8;
public static final int VT_BSTR = 8;
/**
* <p>[V][T][P][S] IDispatch *. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_DISPATCH = 9;
public static final int VT_DISPATCH = 9;
/**
* <p>[V][T][S] SCODE. <span style="background-color: #ffff00">How
* long is this? How is it to be interpreted?</span></p>
*/
public final static int VT_ERROR = 10;
public static final int VT_ERROR = 10;
/**
* <p>[V][T][P][S] True=-1, False=0.</p>
*/
public final static int VT_BOOL = 11;
public static final int VT_BOOL = 11;
/**
* <p>[V][T][P][S] VARIANT *. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_VARIANT = 12;
public static final int VT_VARIANT = 12;
/**
* <p>[V][T][S] IUnknown *. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_UNKNOWN = 13;
public static final int VT_UNKNOWN = 13;
/**
* <p>[V][T][S] 16 byte fixed point.</p>
*/
public final static int VT_DECIMAL = 14;
public static final int VT_DECIMAL = 14;
/**
* <p>[T] signed char.</p>
*/
public final static int VT_I1 = 16;
public static final int VT_I1 = 16;
/**
* <p>[V][T][P][S] unsigned char.</p>
*/
public final static int VT_UI1 = 17;
public static final int VT_UI1 = 17;
/**
* <p>[T][P] unsigned short.</p>
*/
public final static int VT_UI2 = 18;
public static final int VT_UI2 = 18;
/**
* <p>[T][P] unsigned int.</p>
*/
public final static int VT_UI4 = 19;
public static final int VT_UI4 = 19;
/**
* <p>[T][P] signed 64-bit int.</p>
*/
public final static int VT_I8 = 20;
public static final int VT_I8 = 20;
/**
* <p>[T][P] unsigned 64-bit int.</p>
*/
public final static int VT_UI8 = 21;
public static final int VT_UI8 = 21;
/**
* <p>[T] signed machine int.</p>
*/
public final static int VT_INT = 22;
public static final int VT_INT = 22;
/**
* <p>[T] unsigned machine int.</p>
*/
public final static int VT_UINT = 23;
public static final int VT_UINT = 23;
/**
* <p>[T] C style void.</p>
*/
public final static int VT_VOID = 24;
public static final int VT_VOID = 24;
/**
* <p>[T] Standard return type. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_HRESULT = 25;
public static final int VT_HRESULT = 25;
/**
* <p>[T] pointer type. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_PTR = 26;
public static final int VT_PTR = 26;
/**
* <p>[T] (use VT_ARRAY in VARIANT).</p>
*/
public final static int VT_SAFEARRAY = 27;
public static final int VT_SAFEARRAY = 27;
/**
* <p>[T] C style array. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_CARRAY = 28;
public static final int VT_CARRAY = 28;
/**
* <p>[T] user defined type. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_USERDEFINED = 29;
public static final int VT_USERDEFINED = 29;
/**
* <p>[T][P] null terminated string.</p>
*/
public final static int VT_LPSTR = 30;
public static final int VT_LPSTR = 30;
/**
* <p>[T][P] wide (Unicode) null terminated string.</p>
*/
public final static int VT_LPWSTR = 31;
public static final int VT_LPWSTR = 31;
/**
* <p>[P] FILETIME. The FILETIME structure holds a date and time
@ -256,50 +256,50 @@ public class Variant
* have passed since January 1, 1601. This 64-bit value is split
* into the two dwords stored in the structure.</p>
*/
public final static int VT_FILETIME = 64;
public static final int VT_FILETIME = 64;
/**
* <p>[P] Length prefixed bytes.</p>
*/
public final static int VT_BLOB = 65;
public static final int VT_BLOB = 65;
/**
* <p>[P] Name of the stream follows.</p>
*/
public final static int VT_STREAM = 66;
public static final int VT_STREAM = 66;
/**
* <p>[P] Name of the storage follows.</p>
*/
public final static int VT_STORAGE = 67;
public static final int VT_STORAGE = 67;
/**
* <p>[P] Stream contains an object. <span
* style="background-color: #ffff00"> How long is this? How is it
* to be interpreted?</span></p>
*/
public final static int VT_STREAMED_OBJECT = 68;
public static final int VT_STREAMED_OBJECT = 68;
/**
* <p>[P] Storage contains an object. <span
* style="background-color: #ffff00"> How long is this? How is it
* to be interpreted?</span></p>
*/
public final static int VT_STORED_OBJECT = 69;
public static final int VT_STORED_OBJECT = 69;
/**
* <p>[P] Blob contains an object. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_BLOB_OBJECT = 70;
public static final int VT_BLOB_OBJECT = 70;
/**
* <p>[P] Clipboard format. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_CF = 71;
public static final int VT_CF = 71;
/**
* <p>[P] A Class ID.</p>
@ -331,34 +331,46 @@ public class Variant
* target="_blank">
* msdn.microsoft.com/library/en-us/com/stgrstrc_0uwk.asp</a>.</p>
*/
public final static int VT_CLSID = 72;
public static final int VT_CLSID = 72;
/**
* <p>[P] simple counted array. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_VECTOR = 0x1000;
public static final int VT_VECTOR = 0x1000;
/**
* <p>[V] SAFEARRAY*. <span style="background-color: #ffff00">How
* long is this? How is it to be interpreted?</span></p>
*/
public final static int VT_ARRAY = 0x2000;
public static final int VT_ARRAY = 0x2000;
/**
* <p>[V] void* for local use. <span style="background-color:
* #ffff00">How long is this? How is it to be
* interpreted?</span></p>
*/
public final static int VT_BYREF = 0x4000;
public static final int VT_BYREF = 0x4000;
public final static int VT_RESERVED = 0x8000;
/**
* <p>FIXME: Document this!</p>
*/
public static final int VT_RESERVED = 0x8000;
public final static int VT_ILLEGAL = 0xFFFF;
/**
* <p>FIXME: Document this!</p>
*/
public static final int VT_ILLEGAL = 0xFFFF;
public final static int VT_ILLEGALMASKED = 0xFFF;
/**
* <p>FIXME: Document this!</p>
*/
public static final int VT_ILLEGALMASKED = 0xFFF;
public final static int VT_TYPEMASK = 0xFFF;
/**
* <p>FIXME: Document this!</p>
*/
public static final int VT_TYPEMASK = 0xFFF;
}
}

View File

@ -77,7 +77,6 @@ import org.apache.poi.hssf.record.*;
import org.apache.poi.hssf.record.formula.*;
import org.apache.poi.hssf.model.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.SheetReferences;
/**
* FormulaViewer - finds formulas in a BIFF8 file and attempts to read them/display
@ -144,7 +143,7 @@ public class FormulaViewer
StringBuffer buf = new StringBuffer();
if (token instanceof ExpPtg) return;
buf.append(name=((OperationPtg) token).toFormulaString((SheetReferences)null));
buf.append(name=((OperationPtg) token).toFormulaString((Workbook)null));
buf.append(sep);
switch (token.getPtgClass()) {
case Ptg.CLASS_REF :
@ -213,7 +212,7 @@ public class FormulaViewer
StringBuffer buf = new StringBuffer();
for (int i=0;i<numptgs;i++) {
token = (Ptg) tokens.get(i);
buf.append( token.toFormulaString((SheetReferences)null));
buf.append( token.toFormulaString((Workbook)null));
switch (token.getPtgClass()) {
case Ptg.CLASS_REF :
buf.append("(R)");
@ -233,7 +232,7 @@ public class FormulaViewer
private String composeFormula(FormulaRecord record)
{
return org.apache.poi.hssf.model.FormulaParser.toFormulaString((SheetReferences)null,record.getParsedExpression());
return org.apache.poi.hssf.model.FormulaParser.toFormulaString((Workbook)null,record.getParsedExpression());
}
/**

View File

@ -64,7 +64,6 @@ import java.util.List;
//import PTG's .. since we need everything, import *
import org.apache.poi.hssf.record.formula.*;
import org.apache.poi.hssf.util.SheetReferences;
/**
@ -335,10 +334,14 @@ public class FormulaParser {
int numArgs = Arguments();
Match(')');
Ptg functionPtg = getFunction(name,(byte)numArgs);
AbstractFunctionPtg functionPtg = getFunction(name,(byte)numArgs);
tokens.add(functionPtg);
if (functionPtg.getName().equals("externalflag")) {
tokens.add(new NamePtg(name, this.book));
}
//remove what we just put in
this.functionTokens.remove(0);
}
@ -382,8 +385,8 @@ public class FormulaParser {
* @param numArgs
* @return Ptg a null is returned if we're in an IF formula, it needs extreme manipulation and is handled in this function
*/
private Ptg getFunction(String name,byte numArgs) {
Ptg retval = null;
private AbstractFunctionPtg getFunction(String name, byte numArgs) {
AbstractFunctionPtg retval = null;
if (name.equals("IF")) {
retval = new FuncVarPtg(AbstractFunctionPtg.ATTR_NAME, numArgs);
@ -795,69 +798,85 @@ end;
/**
* Convience method which takes in a list then passes it to the other toFormulaString
* signature.
* @param lptgs - list of ptgs, can be null
* @param book workbook for 3D and named references
* @param lptgs list of Ptg, can be null or empty
* @return a human readable String
*/
public static String toFormulaString(SheetReferences refs, List lptgs) {
public static String toFormulaString(Workbook book, List lptgs) {
String retval = null;
if (lptgs == null || lptgs.size() == 0) return "#NAME";
Ptg[] ptgs = new Ptg[lptgs.size()];
ptgs = (Ptg[])lptgs.toArray(ptgs);
retval = toFormulaString(refs, ptgs);
retval = toFormulaString(book, ptgs);
return retval;
}
/** Static method to convert an array of Ptgs in RPN order
* to a human readable string format in infix mode
* @param ptgs - array of ptgs, can be null or empty
/**
* Static method to convert an array of Ptgs in RPN order
* to a human readable string format in infix mode.
* @param book workbook for named and 3D references
* @param ptgs array of Ptg, can be null or empty
* @return a human readable String
*/
public static String toFormulaString(SheetReferences refs, Ptg[] ptgs) {
public static String toFormulaString(Workbook book, Ptg[] ptgs) {
if (ptgs == null || ptgs.length == 0) return "#NAME";
java.util.Stack stack = new java.util.Stack();
int numPtgs = ptgs.length;
OperationPtg o;
int numOperands;
String result=null;
String[] operands;
AttrPtg ifptg = null;
for (int i=0;i<numPtgs;i++) {
// Excel allows to have AttrPtg at position 0 (such as Blanks) which
// do not have any operands. Skip them.
if (ptgs[i] instanceof OperationPtg && i>0) {
o = (OperationPtg) ptgs[i];
stack.push(ptgs[0].toFormulaString(book));
if (o instanceof AttrPtg && ((AttrPtg)o).isOptimizedIf()) {
ifptg=(AttrPtg)o;
} else {
for (int i = 1; i < ptgs.length; i++) {
if (! (ptgs[i] instanceof OperationPtg)) {
stack.push(ptgs[i].toFormulaString(book));
continue;
}
numOperands = o.getNumberOfOperands();
operands = new String[numOperands];
if (ptgs[i] instanceof AttrPtg && ((AttrPtg) ptgs[i]).isOptimizedIf()) {
ifptg = (AttrPtg) ptgs[i];
continue;
}
for (int j=0;j<numOperands;j++) {
operands[numOperands-j-1] = (String) stack.pop(); //TODO: catch stack underflow and throw parse exception.
final OperationPtg o = (OperationPtg) ptgs[i];
final String[] operands = new String[o.getNumberOfOperands()];
for (int j = operands.length; j > 0; j--) {
//TODO: catch stack underflow and throw parse exception.
operands[j - 1] = (String) stack.pop();
}
if ( (o instanceof AbstractFunctionPtg) &&
((AbstractFunctionPtg)o).getName().equals("specialflag") &&
ifptg != null
) {
stack.push(o.toFormulaString(operands));
if (!(o instanceof AbstractFunctionPtg)) continue;
final AbstractFunctionPtg f = (AbstractFunctionPtg) o;
final String fname = f.getName();
if (fname == null) continue;
if ((ifptg != null) && (fname.equals("specialflag"))) {
// this special case will be way different.
result = ifptg.toFormulaString(
new String[] {(o.toFormulaString(operands))}
);
ifptg = null;
} else {
result = o.toFormulaString(operands);
stack.push(ifptg.toFormulaString(new String[]{(String) stack.pop()}));
continue;
}
stack.push(result);
if (fname.equals("externalflag")) {
final String top = (String) stack.pop();
final int paren = top.indexOf('(');
final int comma = top.indexOf(',');
if (comma == -1) {
final int rparen = top.indexOf(')');
stack.push(top.substring(paren + 1, rparen) + "()");
}
} else {
stack.push(ptgs[i].toFormulaString(refs));
else {
stack.push(top.substring(paren + 1, comma) + '(' +
top.substring(comma + 1));
}
}
return (String) stack.pop(); //TODO: catch stack underflow and throw parse exception.
}
// TODO: catch stack underflow and throw parse exception.
return (String) stack.pop();
}
/** Create a tree representation of the RPN token array
*used to run the class(RVA) change algo
*/
@ -890,11 +909,9 @@ end;
* Useful for testing
*/
public String toString() {
SheetReferences refs = null;
if (book!=null) book.getSheetReferences();
StringBuffer buf = new StringBuffer();
for (int i=0;i<tokens.size();i++) {
buf.append( ( (Ptg)tokens.get(i)).toFormulaString(refs));
buf.append( ( (Ptg)tokens.get(i)).toFormulaString(book));
buf.append(' ');
}
return buf.toString();

View File

@ -108,9 +108,10 @@ public class Sheet implements Model
protected HeaderRecord header = null;
protected FooterRecord footer = null;
protected PrintGridlinesRecord printGridlines = null;
protected WindowTwoRecord windowTwo = null;
protected MergeCellsRecord merged = null;
protected ArrayList mergedRecords = new ArrayList();
protected ArrayList mergedLocs = new ArrayList();
protected Margin margins[] = null;
protected List mergedRecords = new ArrayList();
protected int numMergedRegions = 0;
protected SelectionRecord selection = null;
private static POILogger log = POILogFactory.getLogger(Sheet.class);
@ -120,6 +121,7 @@ public class Sheet implements Model
private Iterator valueRecIterator = null;
private Iterator rowRecIterator = null;
protected int eofLoc = 0;
protected ProtectRecord protect = null;
public static final byte PANE_LOWER_RIGHT = (byte)0;
public static final byte PANE_UPPER_RIGHT = (byte)1;
@ -195,7 +197,6 @@ public class Sheet implements Model
{
retval.mergedRecords.add(rec);
retval.merged = ( MergeCellsRecord ) rec;
retval.mergedLocs.add(new Integer(k - offset));
retval.numMergedRegions += retval.merged.getNumAreas();
}
else if (rec.getSid() == ColumnInfoRecord.sid)
@ -234,9 +235,9 @@ public class Sheet implements Model
}
else if ( rec.getSid() == RowRecord.sid )
{
RowRecord row = (RowRecord)rec;
if (!isfirstrow) rec = null; //only add the aggregate once
RowRecord row = (RowRecord)rec;
if (!isfirstrow) rec = null; //only add the aggregate once
if ( isfirstrow )
{
retval.rows = new RowRecordsAggregate();
@ -249,22 +250,46 @@ public class Sheet implements Model
{
retval.printGridlines = (PrintGridlinesRecord) rec;
}
else if ( rec.getSid() == HeaderRecord.sid )
else if ( rec.getSid() == HeaderRecord.sid && bofEofNestingLevel == 1)
{
retval.header = (HeaderRecord) rec;
}
else if ( rec.getSid() == FooterRecord.sid )
else if ( rec.getSid() == FooterRecord.sid && bofEofNestingLevel == 1)
{
retval.footer = (FooterRecord) rec;
}
else if ( rec.getSid() == PrintSetupRecord.sid )
else if ( rec.getSid() == PrintSetupRecord.sid && bofEofNestingLevel == 1)
{
retval.printSetup = (PrintSetupRecord) rec;
}
else if ( rec.getSid() == LeftMarginRecord.sid)
{
retval.getMargins()[LeftMargin] = (LeftMarginRecord) rec;
}
else if ( rec.getSid() == RightMarginRecord.sid)
{
retval.getMargins()[RightMargin] = (RightMarginRecord) rec;
}
else if ( rec.getSid() == TopMarginRecord.sid)
{
retval.getMargins()[TopMargin] = (TopMarginRecord) rec;
}
else if ( rec.getSid() == BottomMarginRecord.sid)
{
retval.getMargins()[BottomMargin] = (BottomMarginRecord) rec;
}
else if ( rec.getSid() == SelectionRecord.sid )
{
retval.selection = (SelectionRecord) rec;
}
else if ( rec.getSid() == WindowTwoRecord.sid )
{
retval.windowTwo = (WindowTwoRecord) rec;
}
else if ( rec.getSid() == ProtectRecord.sid )
{
retval.protect = (ProtectRecord) rec;
}
if (rec != null)
{
@ -272,14 +297,16 @@ public class Sheet implements Model
}
}
retval.records = records;
if (retval.rows == null)
{
retval.rows = new RowRecordsAggregate();
}
if (retval.cells == null)
{
retval.cells = new ValueRecordsAggregate();
}
// if (retval.rows == null)
// {
// retval.rows = new RowRecordsAggregate();
// }
retval.checkCells();
retval.checkRows();
// if (retval.cells == null)
// {
// retval.cells = new ValueRecordsAggregate();
// }
log.log(log.DEBUG, "sheet createSheet (existing file) exited");
return retval;
}
@ -391,11 +418,13 @@ public class Sheet implements Model
retval.dims = ( DimensionsRecord ) retval.createDimensions();
retval.dimsloc = 19;
records.add(retval.dims);
records.add(retval.createWindowTwo());
records.add(retval.windowTwo = retval.createWindowTwo());
retval.setLoc(records.size() - 1);
retval.selection =
(SelectionRecord) retval.createSelection();
records.add(retval.selection);
retval.protect = (ProtectRecord) retval.createProtect();
records.add(retval.protect);
records.add(retval.createEOF());
retval.records = records;
log.log(log.DEBUG, "Sheet createsheet from scratch exit");
@ -427,8 +456,7 @@ public class Sheet implements Model
if (merged == null || merged.getNumAreas() == 1027)
{
merged = ( MergeCellsRecord ) createMergedCells();
mergedRecords.add(merged);
mergedLocs.add(new Integer(records.size() - 1));
mergedRecords.add(merged);
records.add(records.size() - 1, merged);
}
merged.addArea(rowFrom, colFrom, rowTo, colTo);
@ -469,12 +497,18 @@ public class Sheet implements Model
numMergedRegions--;
if (rec.getNumAreas() == 0)
{
mergedRecords.remove(pos);
if (merged == rec)
merged = (MergeCellsRecord) mergedRecords.get(mergedRecords.size() - 1);
int removePos = ((Integer) mergedLocs.get(pos)).intValue();
records.remove(removePos);
mergedLocs.remove(pos);
mergedRecords.remove(pos);
//get rid of the record from the sheet
records.remove(merged);
if (merged == rec) {
//pull up the LAST record for operations when we finally
//support continue records for mergedRegions
if (mergedRecords.size() > 0) {
merged = (MergeCellsRecord) mergedRecords.get(mergedRecords.size() - 1);
} else {
merged = null;
}
}
}
}
@ -970,10 +1004,7 @@ public class Sheet implements Model
{
checkCells();
log.logFormatted(log.DEBUG, "remove value record row,dimsloc %,%",
new int[]
{
row, dimsloc
});
new int[]{row, dimsloc} );
loc = dimsloc;
cells.removeCell(col);
@ -2011,7 +2042,7 @@ public class Sheet implements Model
* @return record containing a WindowTwoRecord
*/
protected Record createWindowTwo()
protected WindowTwoRecord createWindowTwo()
{
WindowTwoRecord retval = new WindowTwoRecord();
@ -2312,7 +2343,6 @@ public class Sheet implements Model
* @param sel True to select the sheet, false otherwise.
*/
public void setSelected(boolean sel) {
WindowTwoRecord windowTwo = (WindowTwoRecord) findFirstRecordBySid(WindowTwoRecord.sid);
windowTwo.setSelected(sel);
}
@ -2321,82 +2351,59 @@ public class Sheet implements Model
* @param margin which margin to get
* @return the size of the margin
*/
public double getMargin(short margin) {
Margin m;
switch ( margin )
{
case LeftMargin:
m = (Margin) findFirstRecordBySid( LeftMarginRecord.sid );
if ( m == null )
return .75;
break;
case RightMargin:
m = (Margin) findFirstRecordBySid( RightMarginRecord.sid );
if ( m == null )
return .75;
break;
case TopMargin:
m = (Margin) findFirstRecordBySid( TopMarginRecord.sid );
if ( m == null )
return 1.0;
break;
case BottomMargin:
m = (Margin) findFirstRecordBySid( BottomMarginRecord.sid );
if ( m == null )
return 1.0;
break;
default :
throw new RuntimeException( "Unknown margin constant: " + margin );
}
return m.getMargin();
}
public double getMargin(short margin) {
if (getMargins()[margin] != null)
return margins[margin].getMargin();
else {
switch ( margin )
{
case LeftMargin:
return .75;
case RightMargin:
return .75;
case TopMargin:
return 1.0;
case BottomMargin:
return 1.0;
default :
throw new RuntimeException( "Unknown margin constant: " + margin );
}
}
}
/**
* Sets the size of the margin in inches.
* @param margin which margin to get
* @param size the size of the margin
*/
public void setMargin(short margin, double size) {
Margin m;
switch ( margin )
{
case LeftMargin:
m = (Margin) findFirstRecordBySid( LeftMarginRecord.sid );
if ( m == null )
{
m = new LeftMarginRecord();
records.add( getDimsLoc() + 1, m );
}
break;
case RightMargin:
m = (Margin) findFirstRecordBySid( RightMarginRecord.sid );
if ( m == null )
{
m = new RightMarginRecord();
records.add( getDimsLoc() + 1, m );
}
break;
case TopMargin:
m = (Margin) findFirstRecordBySid( TopMarginRecord.sid );
if ( m == null )
{
m = new TopMarginRecord();
records.add( getDimsLoc() + 1, m );
}
break;
case BottomMargin:
m = (Margin) findFirstRecordBySid( BottomMarginRecord.sid );
if ( m == null )
{
m = new BottomMarginRecord();
records.add( getDimsLoc() + 1, m );
}
break;
default :
throw new RuntimeException( "Unknown margin constant: " + margin );
}
m.setMargin( size );
}
public void setMargin(short margin, double size) {
Margin m = getMargins()[margin];
if (m == null) {
switch ( margin )
{
case LeftMargin:
m = new LeftMarginRecord();
records.add( getDimsLoc() + 1, m );
break;
case RightMargin:
m = new RightMarginRecord();
records.add( getDimsLoc() + 1, m );
break;
case TopMargin:
m = new TopMarginRecord();
records.add( getDimsLoc() + 1, m );
break;
case BottomMargin:
m = new BottomMarginRecord();
records.add( getDimsLoc() + 1, m );
break;
default :
throw new RuntimeException( "Unknown margin constant: " + margin );
}
margins[margin] = m;
}
m.setMargin( size );
}
public int getEofLoc()
{
@ -2434,9 +2441,8 @@ public class Sheet implements Model
}
records.add(loc+1, pane);
WindowTwoRecord windowRecord = (WindowTwoRecord) records.get(loc);
windowRecord.setFreezePanes(true);
windowRecord.setFreezePanesNoSplit(true);
windowTwo.setFreezePanes(true);
windowTwo.setFreezePanesNoSplit(true);
SelectionRecord sel = (SelectionRecord) findFirstRecordBySid(SelectionRecord.sid);
// SelectionRecord sel2 = (SelectionRecord) sel.clone();
@ -2484,9 +2490,8 @@ public class Sheet implements Model
r.setActivePane((short) activePane);
records.add(loc+1, r);
WindowTwoRecord windowRecord = (WindowTwoRecord) records.get(loc);
windowRecord.setFreezePanes(false);
windowRecord.setFreezePanesNoSplit(false);
windowTwo.setFreezePanes(false);
windowTwo.setFreezePanesNoSplit(false);
SelectionRecord sel = (SelectionRecord) findFirstRecordBySid(SelectionRecord.sid);
// SelectionRecord sel2 = (SelectionRecord) sel.clone();
@ -2519,5 +2524,84 @@ public class Sheet implements Model
{
this.selection = selection;
}
/**
* creates a Protect record with protect set to false.
* @see org.apache.poi.hssf.record.ProtectRecord
* @see org.apache.poi.hssf.record.Record
* @return a ProtectRecord
*/
protected Record createProtect()
{
log.log(log.DEBUG, "create protect record with protection disabled");
ProtectRecord retval = new ProtectRecord();
retval.setProtect(false);
// by default even when we support encryption we won't
return retval;
}
public ProtectRecord getProtect()
{
return protect;
}
/**
* Sets whether the gridlines are shown in a viewer.
* @param show whether to show gridlines or not
*/
public void setDisplayGridlines(boolean show) {
windowTwo.setDisplayGridlines(show);
}
/**
* Returns if gridlines are displayed.
* @return whether gridlines are displayed
*/
public boolean isDisplayGridlines() {
return windowTwo.getDisplayGridlines();
}
/**
* Sets whether the formulas are shown in a viewer.
* @param show whether to show formulas or not
*/
public void setDisplayFormulas(boolean show) {
windowTwo.setDisplayFormulas(show);
}
/**
* Returns if formulas are displayed.
* @return whether formulas are displayed
*/
public boolean isDisplayFormulas() {
return windowTwo.getDisplayFormulas();
}
/**
* Sets whether the RowColHeadings are shown in a viewer.
* @param show whether to show RowColHeadings or not
*/
public void setDisplayRowColHeadings(boolean show) {
windowTwo.setDisplayRowColHeadings(show);
}
/**
* Returns if RowColHeadings are displayed.
* @return whether RowColHeadings are displayed
*/
public boolean isDisplayRowColHeadings() {
return windowTwo.getDisplayRowColHeadings();
}
/**
* Returns the array of margins. If not created, will create.
*
* @return the array of marings.
*/
protected Margin[] getMargins() {
if (margins == null)
margins = new Margin[4];
return margins;
}
}

View File

@ -513,7 +513,7 @@ public class Workbook implements Model {
for (int k = 0; k < boundsheets.size(); k++) {
String sheet = getSheetName(k);
if (sheet.equals(name)) {
if (sheet.equalsIgnoreCase(name)) {
retval = k;
break;
}
@ -686,37 +686,27 @@ public class Workbook implements Model {
*
* @return byte array containing the HSSF-only portions of the POIFS file.
*/
public byte [] serialize() {
log.log(DEBUG, "Serializing Workbook!");
byte[] retval = null;
// ArrayList bytes = new ArrayList(records.size());
int arraysize = getSize();
int pos = 0;
// for (int k = 0; k < records.size(); k++)
// {
// bytes.add((( Record ) records.get(k)).serialize());
// }
// for (int k = 0; k < bytes.size(); k++)
// {
// arraysize += (( byte [] ) bytes.get(k)).length;
// }
retval = new byte[ arraysize ];
for (int k = 0; k < records.size(); k++) {
// byte[] rec = (( byte [] ) bytes.get(k));
// System.arraycopy(rec, 0, retval, pos, rec.length);
Record record = records.get(k);
// Let's skip RECALCID records, as they are only use for optimization
if(record.getSid() != RecalcIdRecord.sid || ((RecalcIdRecord)record).isNeeded()) {
pos += record.serialize(pos, retval); // rec.length;
}
}
log.log(DEBUG, "Exiting serialize workbook");
return retval;
}
// GJS: Not used so why keep it.
// public byte [] serialize() {
// log.log(DEBUG, "Serializing Workbook!");
// byte[] retval = null;
//
//// ArrayList bytes = new ArrayList(records.size());
// int arraysize = getSize();
// int pos = 0;
//
// retval = new byte[ arraysize ];
// for (int k = 0; k < records.size(); k++) {
//
// Record record = records.get(k);
//// Let's skip RECALCID records, as they are only use for optimization
// if(record.getSid() != RecalcIdRecord.sid || ((RecalcIdRecord)record).isNeeded()) {
// pos += record.serialize(pos, retval); // rec.length;
// }
// }
// log.log(DEBUG, "Exiting serialize workbook");
// return retval;
// }
/**
* Serializes all records int the worksheet section into a big byte array. Use
@ -725,44 +715,54 @@ public class Workbook implements Model {
* @param data array of bytes to write this to
*/
public int serialize(int offset, byte [] data) {
log.log(DEBUG, "Serializing Workbook with offsets");
public int serialize( int offset, byte[] data )
{
log.log( DEBUG, "Serializing Workbook with offsets" );
// ArrayList bytes = new ArrayList(records.size());
// int arraysize = getSize(); // 0;
int pos = 0;
int pos = 0;
// for (int k = 0; k < records.size(); k++)
// {
// bytes.add((( Record ) records.get(k)).serialize());
//
// }
// for (int k = 0; k < bytes.size(); k++)
// {
// arraysize += (( byte [] ) bytes.get(k)).length;
// }
for (int k = 0; k < records.size(); k++) {
SSTRecord sst = null;
int sstPos = 0;
for ( int k = 0; k < records.size(); k++ )
{
// byte[] rec = (( byte [] ) bytes.get(k));
// System.arraycopy(rec, 0, data, offset + pos, rec.length);
Record record = records.get(k);
Record record = records.get( k );
// Let's skip RECALCID records, as they are only use for optimization
if(record.getSid() != RecalcIdRecord.sid || ((RecalcIdRecord)record).isNeeded()) {
pos += record.serialize(pos + offset, data); // rec.length;
if ( record.getSid() != RecalcIdRecord.sid || ( (RecalcIdRecord) record ).isNeeded() )
{
if (record instanceof SSTRecord)
{
sst = (SSTRecord)record;
sstPos = pos;
}
if (record.getSid() == ExtSSTRecord.sid && sst != null)
{
record = sst.createExtSSTRecord(sstPos + offset);
}
pos += record.serialize( pos + offset, data ); // rec.length;
}
}
log.log(DEBUG, "Exiting serialize workbook");
log.log( DEBUG, "Exiting serialize workbook" );
return pos;
}
public int getSize() {
public int getSize()
{
int retval = 0;
for (int k = 0; k < records.size(); k++) {
Record record = records.get(k);
SSTRecord sst = null;
for ( int k = 0; k < records.size(); k++ )
{
Record record = records.get( k );
// Let's skip RECALCID records, as they are only use for optimization
if(record.getSid() != RecalcIdRecord.sid || ((RecalcIdRecord)record).isNeeded()) {
retval += record.getRecordSize();
if ( record.getSid() != RecalcIdRecord.sid || ( (RecalcIdRecord) record ).isNeeded() )
{
if (record instanceof SSTRecord)
sst = (SSTRecord)record;
if (record.getSid() == ExtSSTRecord.sid && sst != null)
retval += sst.calcExtSSTRecordSize();
else
retval += record.getRecordSize();
}
}
return retval;
@ -1729,15 +1729,17 @@ public class Workbook implements Model {
}
public SheetReferences getSheetReferences() {
SheetReferences refs = new SheetReferences();
if (externSheet != null) {
for (int k = 0; k < externSheet.getNumOfREFStructures(); k++) {
String sheetName = findSheetNameFromExternSheet((short)k);
refs.addSheetReference(sheetName, k);
}
}
return refs;
SheetReferences refs = new SheetReferences();
if (externSheet != null) {
for (int k = 0; k < externSheet.getNumOfREFStructures(); k++) {
String sheetName = findSheetNameFromExternSheet((short)k);
refs.addSheetReference(sheetName, k);
}
}
return refs;
}
/** finds the sheet name by his extern sheet index
@ -1745,10 +1747,12 @@ public class Workbook implements Model {
* @return sheet name
*/
public String findSheetNameFromExternSheet(short num){
String result;
String result="";
short indexToSheet = externSheet.getREFRecordAt(num).getIndexToFirstSupBook();
result = getSheetName(indexToSheet);
if (indexToSheet>-1) { //error check, bail out gracefully!
result = getSheetName(indexToSheet);
}
return result;
}
@ -2060,18 +2064,22 @@ public class Workbook implements Model {
*/
public PaletteRecord getCustomPalette()
{
PaletteRecord palette;
Record rec = records.get(records.getPalettepos());
if (rec instanceof PaletteRecord)
{
palette = (PaletteRecord) rec;
}
else
{
palette = createPalette();
records.add(records.getPalettepos(), palette);
}
return palette;
PaletteRecord palette;
int palettePos = records.getPalettepos();
if (palettePos != -1) {
Record rec = records.get(palettePos);
if (rec instanceof PaletteRecord) {
palette = (PaletteRecord) rec;
} else throw new RuntimeException("InternalError: Expected PaletteRecord but got a '"+rec+"'");
}
else
{
palette = createPalette();
//Add the palette record after the bof which is always the first record
records.add(1, palette);
records.setPalettepos(1);
}
return palette;
}

View File

@ -74,7 +74,7 @@ public class WorkbookRecordList
private int namepos = 0; // holds the position of last name record
private int supbookpos = 0; // holds the position of sup book
private int externsheetPos = 0;// holds the position of the extern sheet
private int palettepos = 0; // hold the position of the palette, if applicable
private int palettepos = -1; // hold the position of the palette, if applicable
public void setRecords( List records )
@ -103,7 +103,7 @@ public class WorkbookRecordList
if (getBackuppos() >= pos) setBackuppos( backuppos + 1 );
if (getNamepos() >= pos) setNamepos(namepos+1);
if (getSupbookpos() >= pos) setSupbookpos(supbookpos+1);
if (getPalettepos() >= pos) setPalettepos( palettepos + 1 );
if ((getPalettepos() != -1) && (getPalettepos() >= pos)) setPalettepos( palettepos + 1 );
if (getExternsheetPos() >= pos) setExternsheetPos(getExternsheetPos() + 1);
}
@ -128,7 +128,7 @@ public class WorkbookRecordList
if (getBackuppos() >= pos) setBackuppos( backuppos - 1 );
if (getNamepos() >= pos) setNamepos(getNamepos()-1);
if (getSupbookpos() >= pos) setSupbookpos(getSupbookpos()-1);
if (getPalettepos() >= pos) setPalettepos( palettepos - 1 );
if ((getPalettepos() != -1) && (getPalettepos() >= pos)) setPalettepos( palettepos - 1 );
if (getExternsheetPos() >= pos) setExternsheetPos( getExternsheetPos() -1);
}

View File

@ -172,12 +172,18 @@ public class BoolErrRecord
* set the error value for the cell
*
* @param value error representing the error value
* this value can only be 0,7,15,23,29,36 or 42
* see bugzilla bug 16560 for an explanation
*/
public void setValue(byte value)
{
field_4_bBoolErr = value;
field_5_fError = ( byte ) 1;
if ( (value==0)||(value==7)||(value==15)||(value==23)||(value==29)||(value==36)||(value==42)) {
field_4_bBoolErr = value;
field_5_fError = ( byte ) 1;
} else {
throw new RuntimeException("Error Value can only be 0,7,15,23,29,36 or 42. It cannot be "+value);
}
}
//public short getRow()

File diff suppressed because one or more lines are too long

View File

@ -194,10 +194,22 @@ public class BoundSheetRecord
/**
* Set the sheetname for this sheet. (this appears in the tabs at the bottom)
* @param sheetname the name of the sheet
* @thows IllegalArgumentException if sheet name will cause excel to crash.
*/
public void setSheetname( String sheetname )
{
if ((sheetname == null) || (sheetname.length()==0)
|| (sheetname.length()>31)
|| (sheetname.indexOf("/") > -1)
|| (sheetname.indexOf("\\") > -1)
|| (sheetname.indexOf("?") > -1)
|| (sheetname.indexOf("*") > -1)
|| (sheetname.indexOf("]") > -1)
|| (sheetname.indexOf("[") > -1) ){
throw new IllegalArgumentException("Sheet name cannot be blank, greater than 31 chars, or contain any of /\\*?[]");
}
field_5_sheetname = sheetname;
}

View File

@ -267,4 +267,14 @@ public class ContinueRecord
protected void fillFields(byte [] ignored_parm1, short ignored_parm2, int ignored_parm3)
{
}
/**
* Clone this record.
*/
public Object clone() {
ContinueRecord clone = new ContinueRecord();
clone.setData(field_1_data);
return clone;
}
}

View File

@ -65,7 +65,6 @@ import org.apache.poi.util.LittleEndian;
/**
* Extended SST table info subrecord<P>
* contains the elements of "info" in the SST's array field<P>
* WE HAVE VERY LITTLE INFORMATION ON HOW TO IMPLEMENT THIS RECORD! (EXTSSST)<P>
* @author Andrew C. Oliver (acoliver at apache dot org)
* @version 2.0-pre
* @see org.apache.poi.hssf.record.ExtSSTRecord
@ -74,6 +73,7 @@ import org.apache.poi.util.LittleEndian;
public class ExtSSTInfoSubRecord
extends Record
{
public static final int INFO_SIZE = 8;
public final static short sid =
0xFFF; // only here for conformance, doesn't really have an sid
private int field_1_stream_pos; // stream pointer to the SST record
@ -114,7 +114,7 @@ public class ExtSSTInfoSubRecord
field_1_stream_pos = pos;
}
public void setBucketSSTOffset(short offset)
public void setBucketRecordOffset(short offset)
{
field_2_bucket_sst_offset = offset;
}
@ -159,6 +159,6 @@ public class ExtSSTInfoSubRecord
public short getSid()
{
return this.sid;
return sid;
}
}

View File

@ -61,13 +61,13 @@ import java.util.ArrayList;
/**
* Title: Extended Static String Table<P>
* Description: I really don't understand this thing... its supposed to be "a hash
* table for optimizing external copy operations" --
*<P>
* This sounds like a job for Marc "BitMaster" Johnson aka the
* "Hawaiian Master Chef".<P>
* Description: This record is used for a quick lookup into the SST record. This
* record breaks the SST table into a set of buckets. The offsets
* to these buckets within the SST record are kept as well as the
* position relative to the start of the SST record.
* REFERENCE: PG 313 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P>
* @author Andrew C. Oliver (acoliver at apache dot org)
* @author Jason Height (jheight at apache dot org)
* @version 2.0-pre
* @see org.apache.poi.hssf.record.ExtSSTInfoSubRecord
*/
@ -75,10 +75,15 @@ import java.util.ArrayList;
public class ExtSSTRecord
extends Record
{
public static final int DEFAULT_BUCKET_SIZE = 8;
//Cant seem to find this documented but from the biffviewer it is clear that
//Excel only records the indexes for the first 128 buckets.
public static final int MAX_BUCKETS = 128;
public final static short sid = 0xff;
private short field_1_strings_per_bucket;
private short field_1_strings_per_bucket = DEFAULT_BUCKET_SIZE;
private ArrayList field_2_sst_info;
public ExtSSTRecord()
{
field_2_sst_info = new ArrayList();
@ -119,12 +124,11 @@ public class ExtSSTRecord
}
}
// this probably doesn't work but we don't really care at this point
protected void fillFields(byte [] data, short size, int offset)
{
field_2_sst_info = new ArrayList();
field_1_strings_per_bucket = LittleEndian.getShort(data, 0 + offset);
for (int k = 2; k < ((data.length - offset) - size); k += 8)
for (int k = 2; k < (size-offset); k += 8)
{
byte[] tempdata = new byte[ 8 + offset ];
@ -189,26 +193,55 @@ public class ExtSSTRecord
public int serialize(int offset, byte [] data)
{
LittleEndian.putShort(data, 0 + offset, sid);
// LittleEndian.putShort(data,2,(short)(2 + (getNumInfoRecords() *8)));
LittleEndian.putShort(data, 2 + offset, ( short ) (2 + (0x3fa - 2)));
int pos = 4;
LittleEndian.putShort(data, 2 + offset, (short)(getRecordSize() - 4));
LittleEndian.putShort(data, 4 + offset, field_1_strings_per_bucket);
int pos = 6;
for (int k = 0; k < getNumInfoRecords(); k++)
{
System.arraycopy(getInfoRecordAt(k).serialize(), 0, data,
pos + offset, 8);
ExtSSTInfoSubRecord rec = getInfoRecordAt(k);
pos += rec.serialize(pos + offset, data);
}
return getRecordSize();
return pos;
}
/** Returns the size of this record */
public int getRecordSize()
{
return 6 + 0x3fa - 2;
return 6 + 8*getNumInfoRecords();
}
public static final int getNumberOfInfoRecsForStrings(int numStrings) {
int infoRecs = (numStrings / DEFAULT_BUCKET_SIZE);
if ((numStrings % DEFAULT_BUCKET_SIZE) != 0)
infoRecs ++;
//Excel seems to max out after 128 info records.
//This isnt really documented anywhere...
if (infoRecs > MAX_BUCKETS)
infoRecs = MAX_BUCKETS;
return infoRecs;
}
/** Given a number of strings (in the sst), returns the size of the extsst record*/
public static final int getRecordSizeForStrings(int numStrings) {
return 4 + 2 + (getNumberOfInfoRecsForStrings(numStrings) * 8);
}
public short getSid()
{
return this.sid;
return sid;
}
public void setBucketOffsets( int[] bucketAbsoluteOffsets, int[] bucketRelativeOffsets )
{
this.field_2_sst_info = new ArrayList(bucketAbsoluteOffsets.length);
for ( int i = 0; i < bucketAbsoluteOffsets.length; i++ )
{
ExtSSTInfoSubRecord r = new ExtSSTInfoSubRecord();
r.setBucketRecordOffset((short)bucketRelativeOffsets[i]);
r.setStreamPos(bucketAbsoluteOffsets[i]);
field_2_sst_info.add(r);
}
}
}

File diff suppressed because one or more lines are too long

View File

@ -557,8 +557,13 @@ public class FormulaRecord
.append("\n");
buffer.append(" .xf = ")
.append(Integer.toHexString(getXFIndex())).append("\n");
buffer.append(" .value = ").append(getValue())
.append("\n");
if (Double.isNaN(this.getValue()) && value_data != null)
buffer.append(" .value (NaN) = ")
.append(org.apache.poi.util.HexDump.dump(value_data,0,0))
.append("\n");
else
buffer.append(" .value = ").append(getValue())
.append("\n");
buffer.append(" .options = ").append(getOptions())
.append("\n");
buffer.append(" .zero = ").append(field_6_zero)
@ -607,9 +612,10 @@ public class FormulaRecord
if (field_8_parsed_expr != null)
size = field_8_parsed_expr.size();
for (int i=0; i< size; i++) {
Ptg ptg = (Ptg)((Ptg)field_8_parsed_expr.get(i)).clone();
rec.field_8_parsed_expr.set(i, ptg);
Ptg ptg = (Ptg)((Ptg)field_8_parsed_expr.get(i)).clone();
rec.field_8_parsed_expr.add(i, ptg);
}
rec.value_data = value_data;
rec.all_data = all_data;
return rec;
}

View File

@ -150,15 +150,16 @@ public class LabelRecord
field_3_xf_index = LittleEndian.getShort(data, 4 + offset);
field_4_string_len = LittleEndian.getShort(data, 6 + offset);
field_5_unicode_flag = data[ 8 + offset ];
if (isUnCompressedUnicode())
{
field_6_value = StringUtil.getFromUnicode(data, 8 + offset,
if (field_4_string_len > 0) {
if (isUnCompressedUnicode()) {
field_6_value = StringUtil.getFromUnicode(data, 9 + offset,
field_4_string_len);
}
else
{
field_6_value = StringUtil.getFromCompressedUnicode(data, 9 + offset, getStringLength());
else {
field_6_value = StringUtil.getFromCompressedUnicode(data, 9 + offset,
getStringLength());
}
} else field_6_value = null;
}
/* READ ONLY ACCESS... THIS IS FOR COMPATIBILITY ONLY...USE LABELSST!
@ -237,6 +238,27 @@ public class LabelRecord
return this.sid;
}
public String toString()
{
StringBuffer buffer = new StringBuffer();
buffer.append("[LABEL]\n");
buffer.append(" .row = ")
.append(Integer.toHexString(getRow())).append("\n");
buffer.append(" .column = ")
.append(Integer.toHexString(getColumn())).append("\n");
buffer.append(" .xfindex = ")
.append(Integer.toHexString(getXFIndex())).append("\n");
buffer.append(" .string_len = ")
.append(Integer.toHexString(field_4_string_len)).append("\n");
buffer.append(" .unicode_flag = ")
.append(Integer.toHexString(field_5_unicode_flag)).append("\n");
buffer.append(" .value = ")
.append(getValue()).append("\n");
buffer.append("[/LABEL]\n");
return buffer.toString();
}
public boolean isBefore(CellValueRecordInterface i)
{
if (this.getRow() > i.getRow())

View File

@ -58,11 +58,11 @@ package org.apache.poi.hssf.record;
import java.util.List;
import java.util.Stack;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.formula.Area3DPtg;
import org.apache.poi.hssf.record.formula.Ptg;
import org.apache.poi.hssf.record.formula.Ref3DPtg;
import org.apache.poi.hssf.util.RangeAddress;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.util.HexDump;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.StringUtil;
@ -127,6 +127,14 @@ public class NameRecord extends Record {
*/
public final static byte BUILTIN_SHEET_TITLE = (byte)12;
public static final short OPT_HIDDEN_NAME = (short) 0x0001;
public static final short OPT_FUNCTION_NAME = (short) 0x0002;
public static final short OPT_COMMAND_NAME = (short) 0x0004;
public static final short OPT_MACRO = (short) 0x0008;
public static final short OPT_COMPLEX = (short) 0x0010;
public static final short OPT_BUILTIN = (short) 0x0020;
public static final short OPT_BINDATA = (short) 0x1000;
private short field_1_option_flag;
private byte field_2_keyboard_shortcut;
@ -192,7 +200,7 @@ public class NameRecord extends Record {
{
this();
this.field_12_builtIn_name = builtin;
this.setOptionFlag((short)(this.getOptionFlag() | (short)0x20));
this.setOptionFlag((short)(this.getOptionFlag() | OPT_BUILTIN));
this.setNameTextLength((byte)1);
this.setEqualsToIndexToSheet(index); //the extern sheets are set through references
@ -252,13 +260,22 @@ public class NameRecord extends Record {
/**
* Convenience method to retrieve the index the name refers to.
* @see getEqualsToIndexToSheet()
* @see #getEqualsToIndexToSheet()
* @return short
*/
public short getIndexToSheet() {
return getEqualsToIndexToSheet();
}
/**
* @return function group
* @see FnGroupCountRecord
*/
public byte getFnGroup() {
int masked = field_1_option_flag & 0x0fc0;
return (byte) (masked >> 4);
}
public void setEqualsToIndexToSheet(short value)
{
field_6_equals_to_index_to_sheet = value;
@ -409,11 +426,47 @@ public class NameRecord extends Record {
return field_11_compressed_unicode_flag;
}
/**
* @return true if name is hidden
*/
public boolean isHiddenName() {
return (field_1_option_flag & OPT_HIDDEN_NAME) != 0;
}
/**
* @return true if name is a function
*/
public boolean isFunctionName() {
return (field_1_option_flag & OPT_FUNCTION_NAME) != 0;
}
/**
* @return true if name is a command
*/
public boolean isCommandName() {
return (field_1_option_flag & OPT_COMMAND_NAME) != 0;
}
/**
* @return true if function macro or command macro
*/
public boolean isMacro() {
return (field_1_option_flag & OPT_MACRO) != 0;
}
/**
* @return true if array formula or user defined
*/
public boolean isComplexFunction() {
return (field_1_option_flag & OPT_COMPLEX) != 0;
}
/**Convenience Function to determine if the name is a built-in name
*/
public boolean isBuiltInName()
{
return ((this.getOptionFlag() & (short)0x20) != 0);
return ((this.getOptionFlag() & OPT_BUILTIN) != 0);
}
@ -511,7 +564,7 @@ public class NameRecord extends Record {
data[18 + offset] = getCompressedUnicodeFlag();
/* temp: gjs
if ( ( field_1_option_flag & (short) 0x20 ) != 0 )
if (isBuiltInName())
{
LittleEndian.putShort( data, 2 + offset, (short) ( 16 + field_13_raw_name_definition.length ) );
@ -647,16 +700,16 @@ public class NameRecord extends Record {
/** gets the reference , the area only (range)
* @return area reference
*/
public String getAreaReference(SheetReferences refs){
public String getAreaReference(Workbook book){
if (field_13_name_definition == null) return "#REF!";
Ptg ptg = (Ptg) field_13_name_definition.peek();
String result = "";
if (ptg.getClass() == Area3DPtg.class){
result = ptg.toFormulaString(refs);
result = ptg.toFormulaString(book);
} else if (ptg.getClass() == Ref3DPtg.class){
result = ptg.toFormulaString(refs);
result = ptg.toFormulaString(book);
}
return result;
@ -727,7 +780,7 @@ public class NameRecord extends Record {
/*
temp: gjs
if ( ( field_1_option_flag & (short)0x20 ) != 0 ) {
if (isBuiltInName()) {
// DEBUG
// System.out.println( "Built-in name" );
@ -794,6 +847,8 @@ public class NameRecord extends Record {
pos += ptg.getSize();
sizeCounter += ptg.getSize();
stack.push(ptg);
field_13_raw_name_definition=new byte[size];
System.arraycopy(data,offset,field_13_raw_name_definition,0,size);
}
} catch (java.lang.UnsupportedOperationException uoe) {
System.err.println("[WARNING] Unknown Ptg "
@ -880,7 +935,7 @@ public class NameRecord extends Record {
.append("\n");
buffer.append(" .unused = ").append( field_5_index_to_sheet )
.append("\n");
buffer.append(" .( 0 = Global name, otherwise index to sheet (one-based) ) = ").append( field_6_equals_to_index_to_sheet )
buffer.append(" .index to sheet (1-based, 0=Global) = ").append( field_6_equals_to_index_to_sheet )
.append("\n");
buffer.append(" .Length of menu text (character count) = ").append( field_7_length_custom_menu )
.append("\n");
@ -906,6 +961,7 @@ public class NameRecord extends Record {
.append("\n");
buffer.append(" .Status bar text (Unicode string without length field) = ").append( field_17_status_bar_text )
.append("\n");
buffer.append(org.apache.poi.util.HexDump.dump(this.field_13_raw_name_definition,0,0));
buffer.append("[/NAME]\n");
return buffer.toString();

View File

@ -166,4 +166,14 @@ public class PasswordRecord
{
return this.sid;
}
/**
* Clone this record.
*/
public Object clone() {
PasswordRecord clone = new PasswordRecord();
clone.setPassword(field_1_password);
return clone;
}
}

View File

@ -139,9 +139,9 @@ public class ProtectRecord
* @return whether to protect the sheet or not
*/
public short getProtect()
public boolean getProtect()
{
return field_1_protect;
return (field_1_protect == 1);
}
public String toString()
@ -149,8 +149,8 @@ public class ProtectRecord
StringBuffer buffer = new StringBuffer();
buffer.append("[PROTECT]\n");
buffer.append(" .protected = ")
.append(Integer.toHexString(getProtect())).append("\n");
buffer.append(" .protect = ").append(getProtect())
.append("\n");
buffer.append("[/PROTECT]\n");
return buffer.toString();
}
@ -160,7 +160,7 @@ public class ProtectRecord
LittleEndian.putShort(data, 0 + offset, sid);
LittleEndian.putShort(data, 2 + offset,
(( short ) 0x02)); // 2 bytes (6 total)
LittleEndian.putShort(data, 4 + offset, getProtect());
LittleEndian.putShort(data, 4 + offset, field_1_protect);
return getRecordSize();
}

View File

@ -139,18 +139,18 @@ public class ProtectionRev4Record
* @return whether to protect the workbook or not
*/
public short getProtect()
{
return field_1_protect;
}
public boolean getProtect()
{
return (field_1_protect == 1);
}
public String toString()
{
StringBuffer buffer = new StringBuffer();
buffer.append("[PROT4REV]\n");
buffer.append(" .rowheight = ")
.append(Integer.toHexString(getProtect())).append("\n");
buffer.append(" .protect = ").append(getProtect())
.append("\n");
buffer.append("[/PROT4REV]\n");
return buffer.toString();
}
@ -160,7 +160,7 @@ public class ProtectionRev4Record
LittleEndian.putShort(data, 0 + offset, sid);
LittleEndian.putShort(data, 2 + offset,
(( short ) 0x02)); // 2 bytes (6 total)
LittleEndian.putShort(data, 4 + offset, getProtect());
LittleEndian.putShort(data, 4 + offset, field_1_protect);
return getRecordSize();
}

View File

@ -70,16 +70,6 @@ package org.apache.poi.hssf.record;
public abstract class Record
{
/**
* The static ID, subclasses should override this value with the id for the
* record type they handle.
*/
public short sid = 0;
private short id = 0;
private short size = 0;
private byte[] data = null;
/**
* instantiates a blank record strictly for ID matching
*/
@ -98,9 +88,6 @@ public abstract class Record
public Record(short id, short size, byte [] data)
{
this.id = id;
this.size = size;
this.data = data;
validateSid(id);
fillFields(data, size);
}
@ -115,9 +102,6 @@ public abstract class Record
public Record(short id, short size, byte [] data, int offset)
{
this.id = id;
this.size = size;
this.data = data;
validateSid(id);
fillFields(data, size, offset);
}

View File

@ -156,5 +156,10 @@ class RecordProcessor
recordOffset += amount;
available -= amount;
}
public int getRecordOffset()
{
return recordOffset;
}
}

View File

@ -62,13 +62,14 @@ import org.apache.poi.util.LittleEndianConsts;
* Handles the task of deserializing a SST string. The two main entry points are
*
* @author Glen Stampoultzis (glens at apache.org)
* @author Jason Height (jheight at apache.org)
*/
class SSTDeserializer
{
private BinaryTree strings;
/** this is the number of characters we expect in the first sub-record in a subsequent continuation record */
private int continuationExpectedChars;
/** this is the number of characters that have been read prior to the continuation */
private int continuationReadChars;
/** this is the string we were working on before hitting the end of the current record. This string is NOT finished. */
private String unfinishedString;
/** this is true if the string uses wide characters */
@ -82,6 +83,7 @@ class SSTDeserializer
/** Number of characters in current string */
private int charCount;
private int extensionLength;
private int continueSkipBytes = 0;
public SSTDeserializer( BinaryTree strings )
@ -93,13 +95,14 @@ class SSTDeserializer
private void initVars()
{
runCount = 0;
continuationExpectedChars = 0;
continuationReadChars = 0;
unfinishedString = "";
// bytesInCurrentSegment = 0;
// stringDataOffset = 0;
wideChar = false;
richText = false;
extendedText = false;
continueSkipBytes = 0;
}
/**
@ -107,14 +110,15 @@ class SSTDeserializer
* strings may span across multiple continuations. Read the SST record
* carefully before beginning to hack.
*/
public void manufactureStrings( final byte[] data, final int initialOffset, short dataSize )
public void manufactureStrings( final byte[] data, final int initialOffset)
{
initVars();
int offset = initialOffset;
while ( ( offset - initialOffset ) < dataSize )
final int dataSize = data.length;
while ( offset < dataSize )
{
int remaining = dataSize - offset + initialOffset;
int remaining = dataSize - offset;
if ( ( remaining > 0 ) && ( remaining < LittleEndianConsts.SHORT_SIZE ) )
{
@ -122,26 +126,31 @@ class SSTDeserializer
}
if ( remaining == LittleEndianConsts.SHORT_SIZE )
{
setContinuationExpectedChars( LittleEndian.getUShort( data, offset ) );
//JMH Dont know about this
setContinuationCharsRead( 0 );//LittleEndian.getUShort( data, offset ) );
unfinishedString = "";
break;
}
charCount = LittleEndian.getUShort( data, offset );
int charsRead = charCount;
readStringHeader( data, offset );
boolean stringContinuesOverContinuation = remaining < totalStringSize();
if ( stringContinuesOverContinuation )
{
int remainingBytes = ( initialOffset + dataSize ) - offset - stringHeaderOverhead();
setContinuationExpectedChars( charCount - calculateCharCount( remainingBytes ) );
charCount -= getContinuationExpectedChars();
int remainingBytes = dataSize - offset - stringHeaderOverhead();
//Only read the size of the string or whatever is left before the
//continuation
charsRead = Math.min(charsRead, calculateCharCount( remainingBytes ));
setContinuationCharsRead( charsRead );
if (charsRead == charCount) {
//Since all of the characters will have been read, but the entire string (including formatting runs etc)
//hasnt, Compute the number of bytes to skip when the continue record starts
continueSkipBytes = offsetForContinuedRecord(0) - (remainingBytes - calculateByteCount(charsRead));
}
}
else
{
setContinuationExpectedChars( 0 );
}
processString( data, offset, charCount );
processString( data, offset, charsRead );
offset += totalStringSize();
if ( getContinuationExpectedChars() != 0 )
if ( stringContinuesOverContinuation )
{
break;
}
@ -222,6 +231,7 @@ class SSTDeserializer
UnicodeString string = new UnicodeString( UnicodeString.sid,
(short) unicodeStringBuffer.length,
unicodeStringBuffer );
setContinuationCharsRead( calculateCharCount(bytesRead));
if ( isStringFinished() )
{
@ -238,7 +248,7 @@ class SSTDeserializer
private boolean isStringFinished()
{
return getContinuationExpectedChars() == 0;
return getContinuationCharsRead() == charCount;
}
/**
@ -301,8 +311,9 @@ class SSTDeserializer
{
if ( isStringFinished() )
{
final int offset = continueSkipBytes;
initVars();
manufactureStrings( record, 0, (short) record.length );
manufactureStrings( record, offset);
}
else
{
@ -330,13 +341,12 @@ class SSTDeserializer
*/
private void readStringRemainder( final byte[] record )
{
int stringRemainderSizeInBytes = calculateByteCount( getContinuationExpectedChars() );
// stringDataOffset = LittleEndianConsts.BYTE_SIZE;
int stringRemainderSizeInBytes = calculateByteCount( charCount-getContinuationCharsRead() );
byte[] unicodeStringData = new byte[SSTRecord.STRING_MINIMAL_OVERHEAD
+ calculateByteCount( getContinuationExpectedChars() )];
+ stringRemainderSizeInBytes];
// write the string length
LittleEndian.putShort( unicodeStringData, 0, (short) getContinuationExpectedChars() );
LittleEndian.putShort( unicodeStringData, 0, (short) (charCount-getContinuationCharsRead()) );
// write the options flag
unicodeStringData[LittleEndianConsts.SHORT_SIZE] = createOptionByte( wideChar, richText, extendedText );
@ -345,7 +355,7 @@ class SSTDeserializer
// past all the overhead of the str_data array
arraycopy( record, LittleEndianConsts.BYTE_SIZE, unicodeStringData,
SSTRecord.STRING_MINIMAL_OVERHEAD,
unicodeStringData.length - SSTRecord.STRING_MINIMAL_OVERHEAD );
stringRemainderSizeInBytes );
// use special constructor to create the final string
UnicodeString string = new UnicodeString( UnicodeString.sid,
@ -356,7 +366,7 @@ class SSTDeserializer
addToStringTable( strings, integer, string );
int newOffset = offsetForContinuedRecord( stringRemainderSizeInBytes );
manufactureStrings( record, newOffset, (short) ( record.length - newOffset ) );
manufactureStrings( record, newOffset);
}
/**
@ -388,8 +398,12 @@ class SSTDeserializer
private int offsetForContinuedRecord( int stringRemainderSizeInBytes )
{
return stringRemainderSizeInBytes + LittleEndianConsts.BYTE_SIZE
+ runCount * LittleEndianConsts.INT_SIZE + extensionLength;
int offset = stringRemainderSizeInBytes + runCount * LittleEndianConsts.INT_SIZE + extensionLength;
if (stringRemainderSizeInBytes != 0)
//If a portion of the string remains then the wideChar options byte is repeated,
//so need to skip this.
offset += + LittleEndianConsts.BYTE_SIZE;
return offset;
}
private byte createOptionByte( boolean wideChar, boolean richText, boolean farEast )
@ -409,17 +423,22 @@ class SSTDeserializer
int dataLengthInBytes = record.length - LittleEndianConsts.BYTE_SIZE;
byte[] unicodeStringData = new byte[record.length + LittleEndianConsts.SHORT_SIZE];
LittleEndian.putShort( unicodeStringData, (byte) 0, (short) calculateCharCount( dataLengthInBytes ) );
int charsRead = calculateCharCount( dataLengthInBytes );
LittleEndian.putShort( unicodeStringData, (byte) 0, (short) charsRead );
arraycopy( record, 0, unicodeStringData, LittleEndianConsts.SHORT_SIZE, record.length );
UnicodeString ucs = new UnicodeString( UnicodeString.sid, (short) unicodeStringData.length, unicodeStringData );
UnicodeString ucs = new UnicodeString( UnicodeString.sid, (short) unicodeStringData.length, unicodeStringData, unfinishedString);
unfinishedString = unfinishedString + ucs.getString();
setContinuationExpectedChars( getContinuationExpectedChars() - calculateCharCount( dataLengthInBytes ) );
unfinishedString = ucs.getString();
setContinuationCharsRead( getContinuationCharsRead() + charsRead );
if (getContinuationCharsRead() == charCount) {
Integer integer = new Integer( strings.size() );
addToStringTable( strings, integer, ucs );
}
}
private boolean stringSpansContinuation( int continuationSizeInBytes )
{
return calculateByteCount( getContinuationExpectedChars() ) > continuationSizeInBytes;
return calculateByteCount( charCount - getContinuationCharsRead() ) > continuationSizeInBytes;
}
/**
@ -427,14 +446,14 @@ class SSTDeserializer
* sub-record in a subsequent continuation record
*/
int getContinuationExpectedChars()
int getContinuationCharsRead()
{
return continuationExpectedChars;
return continuationReadChars;
}
private void setContinuationExpectedChars( final int count )
private void setContinuationCharsRead( final int count )
{
continuationExpectedChars = count;
continuationReadChars = count;
}
private int calculateByteCount( final int character_count )

View File

@ -60,7 +60,6 @@ import org.apache.poi.util.LittleEndianConsts;
import java.util.Iterator;
import java.util.List;
import java.util.ArrayList;
/**
* Title: Static String Table Record
@ -73,7 +72,7 @@ import java.util.ArrayList;
* @author Andrew C. Oliver (acoliver at apache dot org)
* @author Marc Johnson (mjohnson at apache dot org)
* @author Glen Stampoultzis (glens at apache.org)
* @version 2.0-pre
*
* @see org.apache.poi.hssf.record.LabelSSTRecord
* @see org.apache.poi.hssf.record.ContinueRecord
*/
@ -112,10 +111,14 @@ public class SSTRecord
private List _record_lengths = null;
private SSTDeserializer deserializer;
/** Offsets from the beginning of the SST record (even across continuations) */
int[] bucketAbsoluteOffsets;
/** Offsets relative the start of the current SST or continue record */
int[] bucketRelativeOffsets;
/**
* default constructor
*/
public SSTRecord()
{
field_1_num_strings = 0;
@ -220,7 +223,7 @@ public class SSTRecord
field_1_num_strings++;
String str = ( string == null ) ? ""
: string;
int rval = -1;
int rval;
UnicodeString ucs = new UnicodeString();
ucs.setString( str );
@ -334,7 +337,7 @@ public class SSTRecord
for ( int k = 0; k < field_3_strings.size(); k++ )
{
buffer.append( " .string_" + k + " = " )
.append( ( (UnicodeString) field_3_strings
.append( ( field_3_strings
.get( new Integer( k ) ) ).toString() ).append( "\n" );
}
buffer.append( "[/SST]\n" );
@ -394,7 +397,7 @@ public class SSTRecord
* The data consists of sets of string data. This string data is
* arranged as follows:
* <P>
* <CODE>
* <CODE><pre>
* short string_length; // length of string data
* byte string_flag; // flag specifying special string
* // handling
@ -407,7 +410,7 @@ public class SSTRecord
* // array is run_count)
* byte[] extension; // optional extension (length of array
* // is extend_length)
* </CODE>
* </pre></CODE>
* <P>
* The string_flag is bit mapped as follows:
* <P>
@ -479,7 +482,7 @@ public class SSTRecord
field_2_num_unique_strings = LittleEndian.getInt( data, 4 + offset );
field_3_strings = new BinaryTree();
deserializer = new SSTDeserializer(field_3_strings);
deserializer.manufactureStrings( data, 8 + offset, (short)(size - 8) );
deserializer.manufactureStrings( data, 8 + offset);
}
@ -507,14 +510,22 @@ public class SSTRecord
* Subclasses should implement this so that their data is passed back in a
* byte array.
*
* @return byte array containing instance data
* @return size
*/
public int serialize( int offset, byte[] data )
{
SSTSerializer serializer = new SSTSerializer(
_record_lengths, field_3_strings, getNumStrings(), getNumUniqueStrings() );
return serializer.serialize( getRecordSize(), offset, data );
int bytes = serializer.serialize( getRecordSize(), offset, data );
bucketAbsoluteOffsets = serializer.getBucketAbsoluteOffsets();
bucketRelativeOffsets = serializer.getBucketRelativeOffsets();
// for ( int i = 0; i < bucketAbsoluteOffsets.length; i++ )
// {
// System.out.println( "bucketAbsoluteOffset = " + bucketAbsoluteOffsets[i] );
// System.out.println( "bucketRelativeOffset = " + bucketRelativeOffsets[i] );
// }
return bytes;
}
@ -538,6 +549,45 @@ public class SSTRecord
{
deserializer.processContinueRecord( record );
}
/**
* Creates an extended string record based on the current contents of
* the current SST record. The offset within the stream to the SST record
* is required because the extended string record points directly to the
* strings in the SST record.
* <p>
* NOTE: THIS FUNCTION MUST ONLY BE CALLED AFTER THE SST RECORD HAS BEEN
* SERIALIZED.
*
* @param sstOffset The offset in the stream to the start of the
* SST record.
* @return The new SST record.
*/
public ExtSSTRecord createExtSSTRecord(int sstOffset)
{
if (bucketAbsoluteOffsets == null || bucketAbsoluteOffsets == null)
throw new IllegalStateException("SST record has not yet been serialized.");
ExtSSTRecord extSST = new ExtSSTRecord();
extSST.setNumStringsPerBucket((short)8);
int[] absoluteOffsets = (int[]) bucketAbsoluteOffsets.clone();
int[] relativeOffsets = (int[]) bucketRelativeOffsets.clone();
for ( int i = 0; i < absoluteOffsets.length; i++ )
absoluteOffsets[i] += sstOffset;
extSST.setBucketOffsets(absoluteOffsets, relativeOffsets);
return extSST;
}
/**
* Calculates the size in bytes of the EXTSST record as it would be if the
* record was serialized.
*
* @return The size of the ExtSST record in bytes.
*/
public int calcExtSSTRecordSize()
{
return ExtSSTRecord.getRecordSizeForStrings(field_3_strings.size());
}
}

View File

@ -61,7 +61,9 @@ import java.util.List;
import java.util.Map;
/**
* Used to calculate the record sizes for a particular record.
* Used to calculate the record sizes for a particular record. This kind of
* sucks because it's similar to the SST serialization code. In general
* the SST serialization code needs to be rewritten.
*
* @author Glen Stampoultzis (glens at apache.org)
*/

View File

@ -77,6 +77,12 @@ class SSTSerializer
private int numUniqueStrings;
private SSTRecordHeader sstRecordHeader;
/** Offsets from the beginning of the SST record (even across continuations) */
int[] bucketAbsoluteOffsets;
/** Offsets relative the start of the current SST or continue record */
int[] bucketRelativeOffsets;
int startOfSST, startOfRecord;
public SSTSerializer( List recordLengths, BinaryTree strings, int numStrings, int numUniqueStrings )
{
this.recordLengths = recordLengths;
@ -84,6 +90,10 @@ class SSTSerializer
this.numStrings = numStrings;
this.numUniqueStrings = numUniqueStrings;
this.sstRecordHeader = new SSTRecordHeader( numStrings, numUniqueStrings );
int infoRecs = ExtSSTRecord.getNumberOfInfoRecsForStrings(strings.size());
this.bucketAbsoluteOffsets = new int[infoRecs];
this.bucketRelativeOffsets = new int[infoRecs];
}
/**
@ -133,7 +143,6 @@ class SSTSerializer
/**
* This case is chosen when an SST record does not span over to a continue record.
*
*/
private void serializeSingleSSTRecord( byte[] data, int offset, int record_length_index )
{
@ -144,6 +153,15 @@ class SSTSerializer
for ( int k = 0; k < strings.size(); k++ )
{
if (k % ExtSSTRecord.DEFAULT_BUCKET_SIZE == 0)
{
int index = k/ExtSSTRecord.DEFAULT_BUCKET_SIZE;
if (index < ExtSSTRecord.MAX_BUCKETS) {
//Excel only indexes the first 128 buckets.
bucketAbsoluteOffsets[index] = pos;
bucketRelativeOffsets[index] = pos;
}
}
System.arraycopy( getUnicodeString( k ).serialize(), 0, data, pos + offset, getUnicodeString( k ).getRecordSize() );
pos += getUnicodeString( k ).getRecordSize();
}
@ -157,6 +175,8 @@ class SSTSerializer
private void serializeLargeRecord( int record_size, int record_length_index, byte[] buffer, int offset )
{
startOfSST = offset;
byte[] stringReminant = null;
int stringIndex = 0;
boolean lastneedcontinue = false;
@ -170,6 +190,7 @@ class SSTSerializer
recordLength, numStrings, numUniqueStrings );
// write the appropriate header
startOfRecord = offset + totalWritten;
recordProcessor.writeRecordHeader( offset, totalWritten, recordLength, first_record );
first_record = false;
@ -189,6 +210,17 @@ class SSTSerializer
{
UnicodeString unistr = getUnicodeString( stringIndex );
if (stringIndex % ExtSSTRecord.DEFAULT_BUCKET_SIZE == 0)
{
int index = stringIndex / ExtSSTRecord.DEFAULT_BUCKET_SIZE;
if (index < ExtSSTRecord.MAX_BUCKETS) {
bucketAbsoluteOffsets[index] = offset + totalWritten +
recordProcessor.getRecordOffset() - startOfSST;
bucketRelativeOffsets[index] = offset + totalWritten +
recordProcessor.getRecordOffset() - startOfRecord;
}
}
if ( unistr.getRecordSize() <= recordProcessor.getAvailable() )
{
recordProcessor.writeWholeString( unistr, offset, totalWritten );
@ -235,4 +267,14 @@ class SSTSerializer
{
return recordLengths;
}
public int[] getBucketAbsoluteOffsets()
{
return bucketAbsoluteOffsets;
}
public int[] getBucketRelativeOffsets()
{
return bucketRelativeOffsets;
}
}

View File

@ -138,6 +138,11 @@ public class StringRecord
}
}
public boolean isInValueSection()
{
return true;
}
private int getStringLength()
{
return field_1_string_length;

View File

@ -57,12 +57,14 @@ package org.apache.poi.hssf.record;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.StringUtil;
import org.apache.poi.util.BitField;
/**
* Title: Style Record<P>
* Description: Describes a builtin to the gui or user defined style<P>
* REFERENCE: PG 390 Microsoft Excel 97 Developer's Kit (ISBN: 1-57231-498-2)<P>
* @author Andrew C. Oliver (acoliver at apache dot org)
* @author aviks : string fixes for UserDefined Style
* @version 2.0-pre
*/
@ -81,8 +83,10 @@ public class StyleRecord
private byte field_3_outline_style_level;
// only for user defined styles
private byte field_2_name_length;
private String field_3_name;
private short field_2_name_length; //OO doc says 16 bit length, so we believe
private byte field_3_string_options;
private BitField fHighByte;
private String field_4_name;
public StyleRecord()
{
@ -125,17 +129,24 @@ public class StyleRecord
protected void fillFields(byte [] data, short size, int offset)
{
fHighByte = new BitField(0x01); //have to init here, since we are being called
//from super, and class level init hasnt been done.
field_1_xf_index = LittleEndian.getShort(data, 0 + offset);
if (getType() == 1)
if (getType() == STYLE_BUILT_IN)
{
field_2_builtin_style = data[ 2 + offset ];
field_3_outline_style_level = data[ 3 + offset ];
}
else if (getType() == 0)
else if (getType() == STYLE_USER_DEFINED)
{
field_2_name_length = data[ 2 + offset ];
field_3_name = StringUtil.getFromCompressedUnicode(data, 3 + offset,
LittleEndian.ubyteToInt(field_2_name_length));
field_2_name_length = LittleEndian.getShort(data, 2 + offset );
field_3_string_options = data[4+offset];
if (fHighByte.isSet(field_3_string_options)) {
field_4_name= StringUtil.getFromUnicode(data,offset+5,field_2_name_length);
}else {
field_4_name=StringUtil.getFromCompressedUnicode(data,offset+5,field_2_name_length);
}
}
// todo sanity check exception to make sure we're one or the other
@ -199,7 +210,8 @@ public class StyleRecord
public void setName(String name)
{
field_3_name = name;
field_4_name = name;
//TODO set name length and string options
}
// end user defined
@ -273,7 +285,7 @@ public class StyleRecord
* @see #getName()
*/
public byte getNameLength()
public short getNameLength()
{
return field_2_name_length;
}
@ -286,7 +298,7 @@ public class StyleRecord
public String getName()
{
return field_3_name;
return field_4_name;
}
// end user defined
@ -361,7 +373,7 @@ public class StyleRecord
else
{
LittleEndian.putShort(data, 2 + offset,
(( short ) (0x03 + getNameLength())));
(( short ) (getRecordSize()-4)));
}
LittleEndian.putShort(data, 4 + offset, getIndex());
if (getType() == STYLE_BUILT_IN)
@ -371,8 +383,9 @@ public class StyleRecord
}
else
{
data[ 6 + offset ] = getNameLength();
StringUtil.putCompressedUnicode(getName(), data, 7 + offset);
LittleEndian.putShort(data, 6 + offset , getNameLength());
data[8+offset]=this.field_3_string_options;
StringUtil.putCompressedUnicode(getName(), data, 9 + offset);
}
return getRecordSize();
}
@ -387,7 +400,11 @@ public class StyleRecord
}
else
{
retval = 7 + getNameLength();
if (fHighByte.isSet(field_3_string_options)) {
retval= 9+2*getNameLength();
}else {
retval = 9 + getNameLength();
}
}
return retval;
}

View File

@ -65,16 +65,14 @@ import org.apache.poi.util.LittleEndian;
* Company: SuperLink Software, Inc.<P>
* @author Andrew C. Oliver (acoliver at apache dot org)
* @author Jason Height (jheight at chariot dot net dot au)
* @version 2.0-pre
* @author Glen Stampoultzis (glens at apache.org)
*/
public class UnknownRecord
extends Record
{
private short sid = 0;
private short size = 0;
private byte[] thedata = null;
int offset = 0;
private short sid = 0;
private byte[] thedata = null;
public UnknownRecord()
{
@ -91,7 +89,6 @@ public class UnknownRecord
public UnknownRecord(short id, short size, byte [] data)
{
sid = id;
size = size;
thedata = data;
}
@ -127,7 +124,7 @@ public class UnknownRecord
protected void fillFields(byte [] data, short sid)
{
sid = sid;
this.sid = sid;
thedata = data;
}
@ -179,9 +176,7 @@ public class UnknownRecord
/** Unlike the other Record.clone methods this is a shallow clone*/
public Object clone() {
UnknownRecord rec = new UnknownRecord();
rec.offset = offset;
rec.sid = sid;
rec.size = size;
rec.thedata = thedata;
return rec;
}

View File

@ -82,6 +82,19 @@ public class FormulaRecordAggregate
this.stringRecord = stringRecord;
}
/**
* Used only in the clone
* @param formulaRecord
* @param stringRecord
* @param sharedRecord
*/
public FormulaRecordAggregate( FormulaRecord formulaRecord, StringRecord stringRecord, SharedFormulaRecord sharedRecord)
{
this.formulaRecord = formulaRecord;
this.stringRecord = stringRecord;
this.sharedFormulaRecord = sharedRecord;
}
protected void validateSid( short id )
@ -106,14 +119,14 @@ public class FormulaRecordAggregate
{
int pos = offset;
pos += formulaRecord.serialize(pos, data);
if (stringRecord != null)
{
pos += stringRecord.serialize(pos, data);
}
if (this.getSharedFormulaRecord() != null)
{
pos += getSharedFormulaRecord().serialize(pos, data);
}
if (stringRecord != null)
{
pos += stringRecord.serialize(pos, data);
}
return pos - offset;
}
@ -221,7 +234,10 @@ public class FormulaRecordAggregate
* @see java.lang.Object#clone()
*/
public Object clone() {
return new FormulaRecordAggregate((FormulaRecord) this.formulaRecord.clone(), (StringRecord) this.stringRecord.clone());
StringRecord clonedString = (stringRecord == null) ? null : (StringRecord)stringRecord.clone();
SharedFormulaRecord clonedShared = (sharedFormulaRecord == null) ? null : (SharedFormulaRecord)sharedFormulaRecord.clone();
return new FormulaRecordAggregate((FormulaRecord) this.formulaRecord.clone(), clonedString, clonedShared);
}
@ -241,4 +257,19 @@ public class FormulaRecordAggregate
this.sharedFormulaRecord = sharedFormulaRecord;
}
/*
* Setting to true so that this value does not abort the whole ValueAggregation
* (non-Javadoc)
* @see org.apache.poi.hssf.record.Record#isInValueSection()
*/
public boolean isInValueSection() {
return true;
}
public String getStringValue() {
if(stringRecord==null) return null;
return stringRecord.getString();
}
}

View File

@ -54,9 +54,8 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.BinaryTree;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
import java.util.Stack;
/**
* This class provides the base functionality for Excel sheet functions
@ -69,7 +68,7 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
//constant used allow a ptgAttr to be mapped properly for its functionPtg
public static final String ATTR_NAME = "specialflag";
public static final short INDEX_EXTERNAL = 255;
private static BinaryTree map = produceHash();
protected static Object[][] functionData = produceFunctionData();
@ -104,7 +103,7 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
return lookupName(field_2_fnc_index);
}
public String toFormulaString(SheetReferences refs) {
public String toFormulaString(Workbook book) {
return getName();
}
@ -140,7 +139,9 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
}
protected short lookupIndex(String name) {
return (short)((Integer)map.getKeyForValue(name)).intValue();
Integer index = (Integer) map.getKeyForValue(name);
if (index != null) return index.shortValue();
return INDEX_EXTERNAL;
}
/**
@ -389,6 +390,7 @@ public abstract class AbstractFunctionPtg extends OperationPtg {
dmap.put(new Integer(252),"FREQUENCY");
dmap.put(new Integer(253),"ADDTOOLBAR");
dmap.put(new Integer(254),"DELETETOOLBAR");
dmap.put(new Integer(255),"externalflag");
dmap.put(new Integer(256),"RESETTOOLBAR");
dmap.put(new Integer(257),"EVALUATE");
dmap.put(new Integer(258),"GETTOOLBAR");

View File

@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Addition operator PTG the "+" binomial operator. If you need more
@ -113,7 +113,7 @@ public class AddPtg
}
/** Implementation of method from Ptg */
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "+";
}

View File

@ -291,8 +291,9 @@ public class Area3DPtg extends Ptg
}
public String toFormulaString( SheetReferences refs )
public String toFormulaString(Workbook book)
{
SheetReferences refs = book == null ? null : book.getSheetReferences();
StringBuffer retval = new StringBuffer();
if ( refs != null )
{
@ -318,6 +319,7 @@ public class Area3DPtg extends Ptg
ptg.field_3_last_row = field_3_last_row;
ptg.field_4_first_column = field_4_first_column;
ptg.field_5_last_column = field_5_last_column;
ptg.setClass(ptgClass);
return ptg;
}
@ -351,4 +353,3 @@ public class Area3DPtg extends Ptg
}

View File

@ -65,7 +65,7 @@ import org.apache.poi.util.BitField;
import org.apache.poi.hssf.util.AreaReference;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Specifies a rectangular area of cells A1:A4 for instance.
@ -305,7 +305,7 @@ public class AreaPtg
field_4_last_column = column;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return (new CellReference(getFirstRow(),getFirstColumn(),!isFirstRowRelative(),!isFirstColRelative())).toString() + ":" +
(new CellReference(getLastRow(),getLastColumn(),!isLastRowRelative(),!isLastColRelative())).toString();
@ -321,6 +321,7 @@ public class AreaPtg
ptg.field_2_last_row = field_2_last_row;
ptg.field_3_first_column = field_3_first_column;
ptg.field_4_last_column = field_4_last_column;
ptg.setClass(ptgClass);
return ptg;
}

View File

@ -60,7 +60,7 @@
*/
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.BitField;
@ -207,11 +207,11 @@ public class AttrPtg
if(space.isSet(field_1_options)) {
return operands[ 0 ];
} else if (optiIf.isSet(field_1_options)) {
return toFormulaString((SheetReferences)null) + "(" + operands[ 0 ] +")";
return toFormulaString((Workbook)null) + "(" + operands[ 0 ] +")";
} else if (optGoto.isSet(field_1_options)) {
return toFormulaString((SheetReferences)null) + operands[0]; //goto isn't a real formula element should not show up
return toFormulaString((Workbook)null) + operands[0]; //goto isn't a real formula element should not show up
} else {
return toFormulaString((SheetReferences)null) + "(" + operands[ 0 ] + ")";
return toFormulaString((Workbook)null) + "(" + operands[ 0 ] + ")";
}
}
@ -226,7 +226,7 @@ public class AttrPtg
return -1;
}
public String toFormulaString(SheetReferences refs) {
public String toFormulaString(Workbook book) {
if(semiVolatile.isSet(field_1_options)) {
return "ATTR(semiVolatile)";
}

View File

@ -60,7 +60,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Boolean (boolean)
@ -114,7 +114,7 @@ public class BoolPtg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return field_1_value ? "TRUE" : "FALSE";
}

View File

@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -108,7 +108,7 @@ public class ConcatPtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return CONCAT;
}

View File

@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* This PTG implements the standard binomial divide "/"
@ -108,7 +108,7 @@ public class DividePtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "/";
}
@ -117,7 +117,7 @@ public class DividePtg
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
buffer.append(toFormulaString((SheetReferences)null));
buffer.append(toFormulaString((Workbook)null));
buffer.append(operands[ 1 ]);
return buffer.toString();
}

View File

@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -107,7 +107,7 @@ public class EqualPtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "=";
}
@ -117,7 +117,7 @@ public class EqualPtg
buffer.append(operands[ 0 ]);
buffer.append(toFormulaString((SheetReferences)null));
buffer.append(toFormulaString((Workbook)null));
buffer.append(operands[ 1 ]);
return buffer.toString();
}

View File

@ -60,7 +60,7 @@
*/
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -102,7 +102,7 @@ public class ExpPtg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "NO IDEA SHARED FORMULA EXP PTG";
}
@ -110,7 +110,10 @@ public class ExpPtg
public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
public Object clone() {
throw new RuntimeException("NO IDEA SHARED FORMULA EXP PTG");
//can't clone one that doesnt have data can we??
if (this.existing == null) throw new RuntimeException("NO IDEA SHARED FORMULA EXP PTG");
return new ExpPtg(this.existing, 0);
}
}

View File

@ -63,7 +63,8 @@ public class FuncPtg extends AbstractFunctionPtg{
FuncPtg ptg = new FuncPtg();
//ptg.field_1_num_args = field_1_num_args;
ptg.field_2_fnc_index = field_2_fnc_index;
return ptg;
ptg.setClass(ptgClass);
return ptg;
}
public int getSize() {

View File

@ -52,6 +52,7 @@ public class FuncVarPtg extends AbstractFunctionPtg{
FuncVarPtg ptg = new FuncVarPtg();
ptg.field_1_num_args = field_1_num_args;
ptg.field_2_fnc_index = field_2_fnc_index;
ptg.setClass(ptgClass);
return ptg;
}

View File

@ -54,7 +54,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* PTG class to implement greater or equal to
@ -66,7 +66,7 @@ public class GreaterEqualPtg
public final static int SIZE = 1;
public final static byte sid = 0x0c;
/** Creates new AddPtg */
/** Creates new GreaterEqualPtg */
public GreaterEqualPtg()
{
@ -98,7 +98,7 @@ public class GreaterEqualPtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return ">=";
}
@ -108,7 +108,7 @@ public class GreaterEqualPtg
buffer.append(operands[ 0 ]);
buffer.append(toFormulaString((SheetReferences)null));
buffer.append(toFormulaString((Workbook)null));
buffer.append(operands[ 1 ]);
return buffer.toString();
}

View File

@ -61,7 +61,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Greater than operator PTG ">"
@ -133,7 +133,7 @@ public class GreaterThanPtg
* Implementation of method from Ptg
* @param refs the Sheet References
*/
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return this.GREATERTHAN;
}
@ -171,5 +171,3 @@ public class GreaterThanPtg
return new GreaterThanPtg();
}
}

View File

@ -61,7 +61,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Integer (short intger)
@ -116,7 +116,7 @@ public class IntPtg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "" + getValue();
}

View File

@ -53,7 +53,7 @@
*/
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
@ -67,7 +67,7 @@ public class LessEqualPtg
public final static int SIZE = 1;
public final static byte sid = 0x0a;
/** Creates new AddPtg */
/** Creates new LessEqualPtg */
public LessEqualPtg()
{
@ -99,7 +99,7 @@ public class LessEqualPtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "<=";
}
@ -109,7 +109,7 @@ public class LessEqualPtg
buffer.append(operands[ 0 ]);
buffer.append(toFormulaString((SheetReferences)null));
buffer.append(toFormulaString((Workbook)null));
buffer.append(operands[ 1 ]);
return buffer.toString();
}

View File

@ -63,7 +63,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
//POI
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Less than operator PTG "<". The SID is taken from the
@ -142,7 +142,7 @@ public class LessThanPtg
* Implementation of method from Ptg
* @param refs the Sheet References
*/
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return this.LESSTHAN;
}
@ -180,6 +180,3 @@ public class LessThanPtg
}
}

View File

@ -61,7 +61,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -118,7 +118,7 @@ public class MemErrPtg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "ERR#";
}

View File

@ -60,7 +60,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* @author Glen Stampoultzis (glens at apache.org)
@ -96,7 +96,7 @@ public class MemFuncPtg extends ControlPtg
LittleEndian.putShort( array, offset + 1, (short)field_1_len_ref_subexpression );
}
public String toFormulaString( SheetReferences refs )
public String toFormulaString(Workbook book)
{
return "";
}

View File

@ -54,7 +54,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Missing Function Arguments
@ -91,7 +91,7 @@ public class MissingArgPtg
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return " ";
}
@ -103,5 +103,3 @@ public class MissingArgPtg
}
}

View File

@ -61,7 +61,7 @@
package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Implements the standard mathmatical multiplication - *
@ -114,7 +114,7 @@ public class MultiplyPtg
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "*";
}
@ -123,9 +123,9 @@ public class MultiplyPtg
{
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ].toFormulaString((SheetReferences)null));
buffer.append(operands[ 0 ].toFormulaString((Workbook)null));
buffer.append("*");
buffer.append(operands[ 1 ].toFormulaString((SheetReferences)null));
buffer.append(operands[ 1 ].toFormulaString((Workbook)null));
return buffer.toString();
}
@ -133,7 +133,7 @@ public class MultiplyPtg
StringBuffer buffer = new StringBuffer();
buffer.append(operands[ 0 ]);
buffer.append(toFormulaString((SheetReferences)null));
buffer.append(toFormulaString((Workbook)null));
buffer.append(operands[ 1 ]);
return buffer.toString();
}

View File

@ -61,7 +61,8 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.hssf.record.NameRecord;
/**
*
@ -73,10 +74,10 @@ public class NamePtg
extends Ptg
{
public final static short sid = 0x23;
private final static int SIZE = 7;
private short field_1_ixti; // unknown function
private short field_2_label_index;
private short field_3_zero; // reserved must be 0
private final static int SIZE = 5;
private short field_1_label_index;
private short field_2_zero; // reserved must be 0
boolean xtra=false;
private NamePtg() {
@ -85,9 +86,22 @@ public class NamePtg
/** Creates new NamePtg */
public NamePtg(String name)
public NamePtg(String name, Workbook book)
{
//TODO
final short n = (short) (book.getNumNames() + 1);
NameRecord rec;
for (short i = 1; i < n; i++) {
rec = book.getNameRecord(i - 1);
if (name.equals(rec.getNameText())) {
field_1_label_index = i;
return;
}
}
rec = new NameRecord();
rec.setNameText(name);
rec.setNameTextLength((byte) name.length());
book.addName(rec);
field_1_label_index = n;
}
/** Creates new NamePtg */
@ -95,13 +109,17 @@ public class NamePtg
public NamePtg(byte [] data, int offset)
{
offset++;
field_1_ixti = LittleEndian.getShort(data, offset);
field_2_label_index = LittleEndian.getShort(data, offset + 2);
field_3_zero = LittleEndian.getShort(data, offset + 4);
//field_1_ixti = LittleEndian.getShort(data, offset);
field_1_label_index = LittleEndian.getShort(data, offset );
field_2_zero = LittleEndian.getShort(data, offset + 2);
//if (data[offset+6]==0) xtra=true;
}
public void writeBytes(byte [] array, int offset)
{
array[offset+0]= (byte) (sid + ptgClass);
LittleEndian.putShort(array,offset+1,field_1_label_index);
LittleEndian.putShort(array,offset+3, field_2_zero);
}
public int getSize()
@ -109,18 +127,18 @@ public class NamePtg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "NO IDEA - NAME";
NameRecord rec = book.getNameRecord(field_1_label_index - 1);
return rec.getNameText();
}
public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
public byte getDefaultOperandClass() {return Ptg.CLASS_REF;}
public Object clone() {
NamePtg ptg = new NamePtg();
ptg.field_1_ixti = field_1_ixti;
ptg.field_2_label_index = field_2_label_index;
ptg.field_3_zero = field_3_zero;
ptg.field_1_label_index = field_1_label_index;
ptg.field_2_zero = field_2_zero;
return ptg;
}
}

View File

@ -61,7 +61,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -102,7 +102,7 @@ public class NameXPtg extends Ptg
public void writeBytes(byte [] array, int offset)
{
array[ offset + 0 ] = sid;
array[ offset + 0 ] = (byte)(sid + ptgClass);
LittleEndian.putShort(array, offset + 1, field_1_ixals);
LittleEndian.putShort(array,offset+3, field_2_ilbl);
LittleEndian.putShort(array, offset + 5, field_3_reserved);
@ -113,7 +113,7 @@ public class NameXPtg extends Ptg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "NO IDEA - NAME";
}
@ -125,6 +125,7 @@ public class NameXPtg extends Ptg
ptg.field_1_ixals = field_1_ixals;
ptg.field_3_reserved = field_3_reserved;
ptg.field_2_ilbl = field_2_ilbl;
ptg.setClass(ptgClass);
return ptg;
}
}

View File

@ -56,7 +56,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Ptg class to implement not equal
@ -69,7 +69,7 @@ public class NotEqualPtg
public final static int SIZE = 1;
public final static byte sid = 0x0e;
/** Creates new AddPtg */
/** Creates new NotEqualPtg */
public NotEqualPtg()
{
@ -101,7 +101,7 @@ public class NotEqualPtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "<>";
}
@ -111,7 +111,7 @@ public class NotEqualPtg
buffer.append(operands[ 0 ]);
buffer.append(toFormulaString((SheetReferences)null));
buffer.append(toFormulaString((Workbook)null));
buffer.append(operands[ 1 ]);
return buffer.toString();
}

View File

@ -55,7 +55,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* Number
* Stores a floating point value in a formula
@ -113,7 +113,7 @@ public class NumberPtg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "" + getValue();
}
@ -125,4 +125,3 @@ public class NumberPtg
return ptg;
}
}

View File

@ -57,7 +57,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* While formula tokens are stored in RPN order and thus do not need parenthesis for
@ -107,7 +107,7 @@ public class ParenthesisPtg
return 1;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "()";
}
@ -124,4 +124,3 @@ public class ParenthesisPtg
}
}

View File

@ -62,7 +62,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -108,7 +108,7 @@ public class PowerPtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "^";
}
@ -118,7 +118,7 @@ public class PowerPtg
buffer.append(operands[ 0 ]);
buffer.append(toFormulaString((SheetReferences)null));
buffer.append(toFormulaString((Workbook)null));
buffer.append(operands[ 1 ]);
return buffer.toString();
}

View File

@ -63,7 +63,7 @@ package org.apache.poi.hssf.record.formula;
import java.util.List;
import java.util.ArrayList;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -307,6 +307,12 @@ public abstract class Ptg
case MissingArgPtg.sid:
retval = new MissingArgPtg(data,offset);
break;
case UnaryPlusPtg.sid:
retval=new UnaryPlusPtg(data,offset);
break;
case UnaryMinusPtg.sid:
retval=new UnaryMinusPtg(data,offset);
break;
default :
@ -341,7 +347,7 @@ public abstract class Ptg
/**
* return a string representation of this token alone
*/
public abstract String toFormulaString(SheetReferences refs);
public abstract String toFormulaString(Workbook book);
/**
* dump a debug representation (hexdump) to a string
*/
@ -357,6 +363,14 @@ public abstract class Ptg
return retval;
}
/** Overridden toString method to ensure object hash is not printed.
* This helps get rid of gratuitous diffs when comparing two dumps
* Subclasses may output more relevant information by overriding this method
**/
public String toString(){
return this.getClass().toString();
}
public static final byte CLASS_REF = 0x00;
public static final byte CLASS_VALUE = 0x20;
public static final byte CLASS_ARRAY = 0x40;

View File

@ -61,6 +61,7 @@ import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.RangeAddress;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.util.BitField;
import org.apache.poi.hssf.model.Workbook;
@ -104,7 +105,7 @@ public class Ref3DPtg extends Ptg {
public String toString() {
StringBuffer buffer = new StringBuffer();
buffer.append("Ref3dPrg\n");
buffer.append("Ref3dPtg\n");
buffer.append("Index to Extern Sheet = " + getExternSheetIndex()).append("\n");
buffer.append("Row = " + getRow()).append("\n");
buffer.append("Col = " + getColumn()).append("\n");
@ -193,8 +194,9 @@ public class Ref3DPtg extends Ptg {
}
public String toFormulaString(SheetReferences refs) {
public String toFormulaString(Workbook book) {
StringBuffer retval = new StringBuffer();
SheetReferences refs = book == null ? null : book.getSheetReferences();
if (refs != null) {
retval.append(refs.getSheetName((int)this.field_1_index_extern_sheet));
retval.append('!');
@ -210,6 +212,7 @@ public class Ref3DPtg extends Ptg {
ptg.field_1_index_extern_sheet = field_1_index_extern_sheet;
ptg.field_2_row = field_2_row;
ptg.field_3_column = field_3_column;
ptg.setClass(ptgClass);
return ptg;
}

View File

@ -64,7 +64,7 @@ import org.apache.poi.util.LittleEndian;
import org.apache.poi.util.BitField;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* ReferencePtg - handles references (such as A1, A2, IA4)
@ -179,7 +179,7 @@ public class ReferencePtg extends Ptg
return SIZE;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
//TODO -- should we store a cellreference instance in this ptg?? but .. memory is an issue, i believe!
return (new CellReference(getRow(),getColumn(),!isRowRelative(),!isColRelative())).toString();
@ -193,6 +193,7 @@ public class ReferencePtg extends Ptg
ReferencePtg ptg = new ReferencePtg();
ptg.field_1_row = field_1_row;
ptg.field_2_col = field_2_col;
ptg.setClass(ptgClass);
return ptg;
}
}

View File

@ -55,8 +55,9 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.util.LittleEndian;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.util.BitField;
import org.apache.poi.hssf.model.Workbook;
import org.apache.poi.util.StringUtil;
/**
* Number
@ -70,7 +71,12 @@ public class StringPtg
{
public final static int SIZE = 9;
public final static byte sid = 0x17;
private String field_1_value;
//NOTE: OO doc says 16bit lenght, but BiffViewer says 8
// Book says something totally different, so dont look there!
byte field_1_length;
byte field_2_options;
BitField fHighByte = new BitField(0x01);
private String field_3_string;
private StringPtg() {
//Required for clone methods
@ -79,7 +85,16 @@ public class StringPtg
/** Create a StringPtg from a byte array read from disk */
public StringPtg(byte [] data, int offset)
{
setValue(new String(data, offset+3, data[offset+1] + 256*data[offset+2]));
offset++;
field_1_length = data[offset];
field_2_options = data[offset+1];
if (fHighByte.isSet(field_2_options)) {
field_3_string= StringUtil.getFromUnicode(data,offset+2,field_1_length);
}else {
field_3_string=StringUtil.getFromCompressedUnicode(data,offset+2,field_1_length);
}
//setValue(new String(data, offset+3, data[offset+1] + 256*data[offset+2]));
}
/** Create a StringPtg from a string representation of the number
@ -88,35 +103,49 @@ public class StringPtg
* @param value : String representation of a floating point number
*/
public StringPtg(String value) {
setValue(value);
if (value.length() >255) {
throw new IllegalArgumentException("String literals in formulas cant be bigger than 255 characters ASCII");
}
this.field_2_options=0;
this.fHighByte.setBoolean(field_2_options, false);
this.field_3_string=value;
this.field_1_length=(byte)value.length(); //for the moment, we support only ASCII strings in formulas we create
}
/*
public void setValue(String value)
{
field_1_value = value;
}
}*/
public String getValue()
{
return field_1_value;
return field_3_string;
}
public void writeBytes(byte [] array, int offset)
{
array[ offset + 0 ] = sid;
array[ offset + 1 ] = (byte)(getValue().length() % 256);
array[ offset + 2 ] = (byte)(getValue().length() / 256);
System.arraycopy(getValue().getBytes(), 0, array, offset + 3, getValue().length());
array[ offset + 1 ] = field_1_length;
array[ offset + 2 ] = field_2_options;
if (fHighByte.isSet(field_2_options)) {
StringUtil.putUncompressedUnicode(getValue(),array,offset+3);
}else {
StringUtil.putCompressedUnicode(getValue(),array,offset+3);
}
}
public int getSize()
{
return field_1_value.length() + 3;
if (fHighByte.isSet(field_2_options)) {
return 2*field_1_length+3;
}else {
return field_1_length+3;
}
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "\""+getValue()+"\"";
}
@ -126,9 +155,10 @@ public class StringPtg
public Object clone() {
StringPtg ptg = new StringPtg();
ptg.field_1_value = field_1_value;
ptg.field_1_length = field_1_length;
ptg.field_2_options=field_2_options;
ptg.field_3_string=field_3_string;
return ptg;
}
}

View File

@ -61,7 +61,7 @@
package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -105,7 +105,7 @@ public class SubtractPtg
return 2;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "-";
}

View File

@ -0,0 +1,127 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.model.Workbook;
/**
* Unary Plus operator
* does not have any effect on the operand
* @author Avik Sengupta
*/
public class UnaryMinusPtg extends OperationPtg
{
public final static int SIZE = 1;
public final static byte sid = 0x13;
private final static String MINUS = "-";
/** Creates new AddPtg */
public UnaryMinusPtg()
{
}
public UnaryMinusPtg(byte[] data, int offset)
{
// doesn't need anything
}
public void writeBytes(byte [] array, int offset)
{
array[ offset + 0 ] = sid;
}
public int getSize()
{
return SIZE;
}
public int getType()
{
return this.TYPE_UNARY;
}
public int getNumberOfOperands()
{
return 1;
}
/** Implementation of method from Ptg */
public String toFormulaString(Workbook book)
{
return "+";
}
/** implementation of method from OperationsPtg*/
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append(MINUS);
buffer.append(operands[ 0]);
return buffer.toString();
}
public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
public Object clone() {
return new UnaryPlusPtg();
}
}

View File

@ -0,0 +1,127 @@
/* ====================================================================
* The Apache Software License, Version 1.1
*
* Copyright (c) 2003 The Apache Software Foundation. All rights
* reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
*
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in
* the documentation and/or other materials provided with the
* distribution.
*
* 3. The end-user documentation included with the redistribution,
* if any, must include the following acknowledgment:
* "This product includes software developed by the
* Apache Software Foundation (http://www.apache.org/)."
* Alternately, this acknowledgment may appear in the software itself,
* if and wherever such third-party acknowledgments normally appear.
*
* 4. The names "Apache" and "Apache Software Foundation" and
* "Apache POI" must not be used to endorse or promote products
* derived from this software without prior written permission. For
* written permission, please contact apache@apache.org.
*
* 5. Products derived from this software may not be called "Apache",
* "Apache POI", nor may "Apache" appear in their name, without
* prior written permission of the Apache Software Foundation.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE APACHE SOFTWARE FOUNDATION OR
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
* OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
* OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
* SUCH DAMAGE.
* ====================================================================
*
* This software consists of voluntary contributions made by many
* individuals on behalf of the Apache Software Foundation. For more
* information on the Apache Software Foundation, please see
* <http://www.apache.org/>.
*/
package org.apache.poi.hssf.record.formula;
import java.util.List;
import org.apache.poi.hssf.model.Workbook;
/**
* Unary Plus operator
* does not have any effect on the operand
* @author Avik Sengupta
*/
public class UnaryPlusPtg extends OperationPtg
{
public final static int SIZE = 1;
public final static byte sid = 0x12;
private final static String ADD = "+";
/** Creates new AddPtg */
public UnaryPlusPtg()
{
}
public UnaryPlusPtg(byte[] data, int offset)
{
// doesn't need anything
}
public void writeBytes(byte [] array, int offset)
{
array[ offset + 0 ] = sid;
}
public int getSize()
{
return SIZE;
}
public int getType()
{
return this.TYPE_UNARY;
}
public int getNumberOfOperands()
{
return 1;
}
/** Implementation of method from Ptg */
public String toFormulaString(Workbook book)
{
return "+";
}
/** implementation of method from OperationsPtg*/
public String toFormulaString(String[] operands) {
StringBuffer buffer = new StringBuffer();
buffer.append(ADD);
buffer.append(operands[ 0]);
return buffer.toString();
}
public byte getDefaultOperandClass() {return Ptg.CLASS_VALUE;}
public Object clone() {
return new UnaryPlusPtg();
}
}

View File

@ -54,7 +54,7 @@
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
* @author Glen Stampoultzis (glens at apache.org)
@ -95,7 +95,7 @@ public class UnionPtg extends OperationPtg
}
/** Implementation of method from Ptg */
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return ",";
}

View File

@ -60,7 +60,7 @@
*/
package org.apache.poi.hssf.record.formula;
import org.apache.poi.hssf.util.SheetReferences;
import org.apache.poi.hssf.model.Workbook;
/**
*
@ -94,7 +94,7 @@ public class UnknownPtg
return size;
}
public String toFormulaString(SheetReferences refs)
public String toFormulaString(Workbook book)
{
return "UNKNOWN";
}

View File

@ -326,6 +326,7 @@ public class HSSFCell
case CELL_TYPE_FORMULA :
cellValue = (( FormulaRecordAggregate ) cval).getFormulaRecord().getValue();
stringValue=((FormulaRecordAggregate) cval).getStringValue();
break;
case CELL_TYPE_BOOLEAN :
@ -726,8 +727,7 @@ public class HSSFCell
public String getCellFormula() {
//Workbook.currentBook=book;
SheetReferences refs = book.getSheetReferences();
String retval = FormulaParser.toFormulaString(refs, ((FormulaRecordAggregate)record).getFormulaRecord().getParsedExpression());
String retval = FormulaParser.toFormulaString(book, ((FormulaRecordAggregate)record).getFormulaRecord().getParsedExpression());
//Workbook.currentBook=null;
return retval;
}
@ -798,6 +798,7 @@ public class HSSFCell
/**
* get the value of the cell as a string - for numeric cells we throw an exception.
* For blank cells we return an empty string.
* For formulaCells that are not string Formulas, we return empty String
*/
public String getStringCellValue()
@ -821,6 +822,10 @@ public class HSSFCell
throw new NumberFormatException(
"You cannot get a string value from an error cell");
}
if (cellType == CELL_TYPE_FORMULA)
{
if (stringValue==null) return "";
}
return stringValue;
}

View File

@ -85,7 +85,7 @@ public class HSSFFont
* Normal boldness (not bold)
*/
public final static short BOLDWEIGHT_NORMAL = 190;
public final static short BOLDWEIGHT_NORMAL = 0x190;
/**
* Bold boldness (bold)

View File

@ -123,8 +123,7 @@ public class HSSFName {
public String getReference() {
String result;
SheetReferences refs = book.getSheetReferences();
result = name.getAreaReference(refs);
result = name.getAreaReference(book);
return result;
}
@ -167,4 +166,3 @@ public class HSSFName {
}
}

View File

@ -103,7 +103,7 @@ public class HSSFPalette
for (short i = (short) PaletteRecord.FIRST_COLOR_INDEX; b != null;
b = palette.getColor(++i))
{
if (b[0] == red && b[1] == blue && b[2] == green)
if (b[0] == red && b[1] == green && b[2] == blue)
{
return new CustomColor(i, b);
}

View File

@ -59,17 +59,25 @@
*/
package org.apache.poi.hssf.usermodel;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
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.CellValueRecordInterface;
import org.apache.poi.hssf.record.HCenterRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.RowRecord;
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.util.POILogFactory;
import org.apache.poi.util.POILogger;
import java.util.Iterator;
import java.util.TreeMap;
import java.util.List;
/**
* High level representation of a worksheet.
* @author Andrew C. Oliver (acoliver at apache dot org)
@ -865,6 +873,22 @@ public class HSSFSheet
{
getSheet().setMargin( margin, size );
}
/**
* Answer whether protection is enabled or disabled
* @return true => protection enabled; false => protection disabled
*/
public boolean getProtect() {
return getSheet().getProtect().getProtect();
}
/**
* Sets the protection on enabled or disabled
* @param protect true => protection enabled; false => protection disabled
*/
public void setProtect(boolean protect) {
getSheet().getProtect().setProtect(protect);
}
/**
* Sets the zoom magnication for the sheet. The zoom is expressed as a
@ -887,6 +911,50 @@ public class HSSFSheet
getSheet().setSCLRecord(sclRecord);
}
/**
* Shifts the merged regions left or right depending on mode
* <p>
* TODO: MODE , this is only row specific
* @param startRow
* @param endRow
* @param n
* @param isRow
*/
protected void shiftMerged(int startRow, int endRow, int n, boolean isRow) {
List shiftedRegions = new ArrayList();
//move merged regions completely if they fall within the new region boundaries when they are shifted
for (int i = 0; i < this.getNumMergedRegions(); i++) {
Region merged = this.getMergedRegionAt(i);
boolean inStart = (merged.getRowFrom() >= startRow || merged.getRowTo() >= startRow);
boolean inEnd = (merged.getRowTo() <= endRow || merged.getRowFrom() <= endRow);
//dont check if it's not within the shifted area
if (! (inStart && inEnd)) continue;
//only shift if the region outside the shifted rows is not merged too
if (!merged.contains(startRow-1, (short)0) && !merged.contains(endRow+1, (short)0)){
merged.setRowFrom(merged.getRowFrom()+n);
merged.setRowTo(merged.getRowTo()+n);
//have to remove/add it back
shiftedRegions.add(merged);
this.removeMergedRegion(i);
i = i -1; // we have to back up now since we removed one
}
}
//readd so it doesn't get shifted again
Iterator iterator = shiftedRegions.iterator();
while (iterator.hasNext()) {
Region region = (Region)iterator.next();
this.addMergedRegion(region);
}
}
/**
* Shifts rows between startRow and endRow n number of rows.
* If you use a negative number, it will shift rows up.
@ -894,19 +962,25 @@ public class HSSFSheet
*
* Calls shiftRows(startRow, endRow, n, false, false);
*
* <p>
* Additionally shifts merged regions that are completely defined in these
* rows (ie. merged 2 cells on a row to be shifted).
* @param startRow the row to start shifting
* @param endRow the row to end shifting
* @param n the number of rows to shift
*/
public void shiftRows( int startRow, int endRow, int n ) {
shiftRows(startRow, endRow, n, false, false);
shiftRows(startRow, endRow, n, false, false);
}
/**
* Shifts rows between startRow and endRow n number of rows.
* If you use a negative number, it will shift rows up.
* Code ensures that rows don't wrap around
*
*
* <p>
* Additionally shifts merged regions that are completely defined in these
* rows (ie. merged 2 cells on a row to be shifted).
* @param startRow the row to start shifting
* @param endRow the row to end shifting
* @param n the number of rows to shift
@ -928,6 +1002,9 @@ public class HSSFSheet
e = startRow;
inc = -1;
}
shiftMerged(startRow, endRow, n, true);
for ( int rowNum = s; rowNum >= startRow && rowNum <= endRow && rowNum >= 0 && rowNum < 65536; rowNum += inc )
{
HSSFRow row = getRow( rowNum );
@ -937,6 +1014,9 @@ public class HSSFSheet
HSSFCell cell;
// Removes the cells before over writting them.
for ( short col = row2Replace.getFirstCellNum(); col <= row2Replace.getLastCellNum(); col++ )
{
@ -1021,5 +1101,51 @@ public class HSSFSheet
getSheet().createSplitPane( xSplitPos, ySplitPos, topRow, leftmostColumn, activePane );
}
/**
* Sets whether the gridlines are shown in a viewer.
* @param show whether to show gridlines or not
*/
public void setDisplayGridlines(boolean show) {
sheet.setDisplayGridlines(show);
}
/**
* Returns if gridlines are displayed.
* @return whether gridlines are displayed
*/
public boolean isDisplayGridlines() {
return sheet.isDisplayGridlines();
}
/**
* Sets whether the formulas are shown in a viewer.
* @param show whether to show formulas or not
*/
public void setDisplayFormulas(boolean show) {
sheet.setDisplayFormulas(show);
}
/**
* Returns if formulas are displayed.
* @return whether formulas are displayed
*/
public boolean isDisplayFormulas() {
return sheet.isDisplayFormulas();
}
/**
* Sets whether the RowColHeadings are shown in a viewer.
* @param show whether to show RowColHeadings or not
*/
public void setDisplayRowColHeadings(boolean show) {
sheet.setDisplayRowColHeadings(show);
}
/**
* Returns if RowColHeadings are displayed.
* @return whether RowColHeadings are displayed
*/
public boolean isDisplayRowColHeadings() {
return sheet.isDisplayRowColHeadings();
}
}

View File

@ -147,6 +147,14 @@ public class HSSFWorkbook
* memory.
*/
private POIFSFileSystem poifs;
/**
* Used to keep track of the data formatter so that all
* createDataFormatter calls return the same one for a given
* book. This ensures that updates from one places is visible
* someplace else.
*/
private HSSFDataFormat formatter;
private static POILogger log = POILogFactory.getLogger(HSSFWorkbook.class);
@ -273,7 +281,9 @@ public class HSSFWorkbook
/**
* set the sheet name.
* set the sheet name.
* Will throw IllegalArgumentException if the name is greater than 31 chars
* or contains /\?*[]
* @param sheet number (0 based)
* @param sheet name
*/
@ -374,7 +384,11 @@ public class HSSFWorkbook
windowTwo.setPaged(sheets.size() == 1);
sheets.add(clonedSheet);
workbook.setSheetName(sheets.size()-1, srcName+"[1]");
if (srcName.length()<28) {
workbook.setSheetName(sheets.size()-1, srcName+"(2)");
}else {
workbook.setSheetName(sheets.size()-1,srcName.substring(0,28)+"(2)");
}
return clonedSheet;
}
return null;
@ -890,7 +904,7 @@ public class HSSFWorkbook
if (name == null) return null;
//adding one here because 0 indicates a global named region; doesnt make sense for print areas
return name.getAreaReference(workbook.getSheetReferences());
return name.getAreaReference(workbook);
}
/**
@ -945,13 +959,15 @@ public class HSSFWorkbook
}
/**
* Creates an instance of HSSFDataFormat.
* Returns the instance of HSSFDataFormat for this workbook.
* @return the HSSFDataFormat object
* @see org.apache.poi.hssf.record.FormatRecord
* @see org.apache.poi.hssf.record.Record
*/
public HSSFDataFormat createDataFormat() {
return new HSSFDataFormat(workbook);
if (formatter == null)
formatter = new HSSFDataFormat(workbook);
return formatter;
}
/** remove the named range by his name

View File

@ -59,6 +59,8 @@ import java.io.*;
import java.util.*;
import org.apache.poi.hpsf.ClassID;
/**
* This interface defines methods specific to Directory objects
* managed by a Filesystem instance.
@ -160,5 +162,20 @@ public interface DirectoryEntry
public DirectoryEntry createDirectory(final String name)
throws IOException;
/**
* Gets the storage clsid of the directory entry
*
* @return storage Class ID
*/
public ClassID getStorageClsid();
/**
* Sets the storage clsid for the directory entry
*
* @param clsidStorage storage Class ID
*/
public void setStorageClsid(ClassID clsidStorage);
} // end public interface DirectoryEntry

Some files were not shown because too many files have changed in this diff Show More