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:
parent
a70452b9dd
commit
833cb722b1
10
.classpath
10
.classpath
@ -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>
|
@ -1,4 +1,5 @@
|
||||
dist
|
||||
build
|
||||
scripts
|
||||
*.el
|
||||
*.ipr
|
||||
@ -8,3 +9,5 @@ build.number
|
||||
log*.*
|
||||
*.log
|
||||
build
|
||||
.classpath
|
||||
.project
|
||||
|
17
.project
17
.project
@ -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>
|
91
build.xml
91
build.xml
@ -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
|
||||
<http://xml.apache.org/forrest/index.html>) 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>
|
||||
|
@ -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"/>
|
||||
|
@ -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 & 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 & 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>
|
0
src/documentation/xdocs/dtd/book-cocoon-v10.dtd → src/documentation/content/xdocs/dtd/book-cocoon-v10.dtd
Executable file → Normal file
0
src/documentation/xdocs/dtd/book-cocoon-v10.dtd → src/documentation/content/xdocs/dtd/book-cocoon-v10.dtd
Executable file → Normal file
0
src/documentation/xdocs/dtd/javadoc-v04draft.dtd → src/documentation/content/xdocs/dtd/javadoc-v04draft.dtd
Executable file → Normal file
0
src/documentation/xdocs/dtd/javadoc-v04draft.dtd → src/documentation/content/xdocs/dtd/javadoc-v04draft.dtd
Executable file → Normal 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
|
||||
|
@ -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
|
||||
|
@ -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);
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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 & 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 & 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 & 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 & 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>
|
||||
|
@ -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:
|
||||
|
@ -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"/>
|
||||
|
@ -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"/>
|
||||
|
@ -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 & 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 & 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 |
@ -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>
|
||||
|
||||
|
@ -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);
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
|
||||
}
|
||||
}
|
@ -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());
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
@ -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
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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
@ -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;
|
||||
}
|
||||
|
@ -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())
|
||||
|
@ -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();
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -156,5 +156,10 @@ class RecordProcessor
|
||||
recordOffset += amount;
|
||||
available -= amount;
|
||||
}
|
||||
|
||||
public int getRecordOffset()
|
||||
{
|
||||
return recordOffset;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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 )
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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)
|
||||
*/
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -138,6 +138,11 @@ public class StringRecord
|
||||
}
|
||||
}
|
||||
|
||||
public boolean isInValueSection()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
private int getStringLength()
|
||||
{
|
||||
return field_1_string_length;
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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");
|
||||
|
@ -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 "+";
|
||||
}
|
||||
|
@ -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
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)";
|
||||
}
|
||||
|
@ -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";
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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() {
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
@ -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#";
|
||||
}
|
||||
|
@ -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 "";
|
||||
}
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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();
|
||||
}
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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 "-";
|
||||
}
|
||||
|
127
src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
Normal file
127
src/java/org/apache/poi/hssf/record/formula/UnaryMinusPtg.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
127
src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
Normal file
127
src/java/org/apache/poi/hssf/record/formula/UnaryPlusPtg.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
@ -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 ",";
|
||||
}
|
||||
|
@ -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";
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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)
|
||||
|
@ -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 {
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
}
|
||||
|
@ -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
|
||||
|
@ -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
Loading…
Reference in New Issue
Block a user