Support getting the low level sheet objects back for an xlsx document
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@607043 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
dcb99ea54d
commit
ae3bd54533
38
build.xml
38
build.xml
@ -271,6 +271,7 @@ under the License.
|
|||||||
<mkdir dir="${main.reports.test}"/>
|
<mkdir dir="${main.reports.test}"/>
|
||||||
<mkdir dir="${scratchpad.reports.test}"/>
|
<mkdir dir="${scratchpad.reports.test}"/>
|
||||||
<mkdir dir="${contrib.reports.test}"/>
|
<mkdir dir="${contrib.reports.test}"/>
|
||||||
|
<mkdir dir="${ooxml.reports.test}"/>
|
||||||
<mkdir dir="${junit.report.dir}"/>
|
<mkdir dir="${junit.report.dir}"/>
|
||||||
<mkdir dir="${jdepend.report.dir}"/>
|
<mkdir dir="${jdepend.report.dir}"/>
|
||||||
<mkdir dir="${jdepend.report.out.dir}"/>
|
<mkdir dir="${jdepend.report.out.dir}"/>
|
||||||
@ -700,6 +701,43 @@ under the License.
|
|||||||
<echo file="${contrib.testokfile}" append="false" message="testok"/>
|
<echo file="${contrib.testokfile}" append="false" message="testok"/>
|
||||||
</target>
|
</target>
|
||||||
|
|
||||||
|
<target name="-test-ooxml-check">
|
||||||
|
<uptodate property="ooxml.test.notRequired" targetfile="${ooxml.testokfile}">
|
||||||
|
<srcfiles dir="${ooxml.src}"/>
|
||||||
|
<srcfiles dir="${ooxml.src.test}"/>
|
||||||
|
</uptodate>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="test-ooxml" depends="compile-main,compile-ooxml,-test-ooxml-check" unless="ooxml.test.notRequired">
|
||||||
|
<junit printsummary="yes" fork="no" haltonfailure="${halt.on.test.failure}" failureproperty="ooxml.test.failed">
|
||||||
|
<classpath>
|
||||||
|
<path refid="ooxml.classpath"/>
|
||||||
|
<pathelement location="${main.output.dir}"/>
|
||||||
|
<pathelement location="${ooxml.output.dir}"/>
|
||||||
|
<pathelement location="${ooxml.output.test.dir}"/>
|
||||||
|
<pathelement location="${junit.jar1.dir}"/>
|
||||||
|
</classpath>
|
||||||
|
<sysproperty key="HSSF.testdata.path" file="${main.src.test}/org/apache/poi/hssf/data"/>
|
||||||
|
<sysproperty key="HWPF.testdata.path" file="${scratchpad.src.test}/org/apache/poi/hwpf/data"/>
|
||||||
|
<sysproperty key="HSLF.testdata.path" file="${scratchpad.src.test}/org/apache/poi/hslf/data"/>
|
||||||
|
<sysproperty key="java.awt.headless" value="true"/>
|
||||||
|
<formatter type="plain"/>
|
||||||
|
<formatter type="xml"/>
|
||||||
|
<batchtest todir="${ooxml.reports.test}">
|
||||||
|
<fileset dir="${ooxml.src.test}">
|
||||||
|
<include name="**/Test*.java"/>
|
||||||
|
<exclude name="**/AllTests.java"/>
|
||||||
|
</fileset>
|
||||||
|
</batchtest>
|
||||||
|
</junit>
|
||||||
|
<delete file="${ooxml.testokfile}"/>
|
||||||
|
<antcall target="-test-ooxml-write-testfile"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
|
<target name="-test-ooxml-write-testfile" unless="ooxml.test.failed">
|
||||||
|
<echo file="${ooxml.testokfile}" append="false" message="testok"/>
|
||||||
|
</target>
|
||||||
|
|
||||||
<target name="-check-docs">
|
<target name="-check-docs">
|
||||||
<uptodate property="main.docs.notRequired" targetfile="${build.site}/index.html">
|
<uptodate property="main.docs.notRequired" targetfile="${build.site}/index.html">
|
||||||
<srcfiles dir="${build.site.src}"/>
|
<srcfiles dir="${build.site.src}"/>
|
||||||
|
@ -22,8 +22,13 @@ import org.apache.poi.hxf.HXFDocument;
|
|||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.openxml4j.exceptions.OpenXML4JException;
|
import org.openxml4j.exceptions.OpenXML4JException;
|
||||||
import org.openxml4j.opc.Package;
|
import org.openxml4j.opc.Package;
|
||||||
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheets;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorkbook;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTWorksheet;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorkbookDocument;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Experimental class to do low level processing
|
* Experimental class to do low level processing
|
||||||
@ -45,7 +50,30 @@ public class HSSFXML extends HXFDocument {
|
|||||||
WorkbookDocument.Factory.parse(basePart.getInputStream());
|
WorkbookDocument.Factory.parse(basePart.getInputStream());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the low level workbook base object
|
||||||
|
*/
|
||||||
public CTWorkbook getWorkbook() {
|
public CTWorkbook getWorkbook() {
|
||||||
return workbookDoc.getWorkbook();
|
return workbookDoc.getWorkbook();
|
||||||
}
|
}
|
||||||
|
/**
|
||||||
|
* Returns the references from the workbook to its
|
||||||
|
* sheets.
|
||||||
|
* You'll need these to figure out the sheet ordering,
|
||||||
|
* and to get at the actual sheets themselves
|
||||||
|
*/
|
||||||
|
public CTSheets getSheetReferences() {
|
||||||
|
return getWorkbook().getSheets();
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Returns the low level (work)sheet object from
|
||||||
|
* the supplied sheet reference
|
||||||
|
*/
|
||||||
|
public CTWorksheet getSheet(CTSheet sheet) throws IOException, XmlException {
|
||||||
|
PackagePart sheetPart =
|
||||||
|
getRelatedPackagePart(sheet.getId());
|
||||||
|
WorksheetDocument sheetDoc =
|
||||||
|
WorksheetDocument.Factory.parse(sheetPart.getInputStream());
|
||||||
|
return sheetDoc.getWorksheet();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -29,6 +29,9 @@ import org.openxml4j.exceptions.OpenXML4JException;
|
|||||||
import org.openxml4j.opc.Package;
|
import org.openxml4j.opc.Package;
|
||||||
import org.openxml4j.opc.PackageAccess;
|
import org.openxml4j.opc.PackageAccess;
|
||||||
import org.openxml4j.opc.PackagePart;
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
import org.openxml4j.opc.PackagePartName;
|
||||||
|
import org.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.openxml4j.opc.PackagingURIHelper;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Parent class of the low level interface to
|
* Parent class of the low level interface to
|
||||||
@ -76,8 +79,28 @@ public abstract class HXFDocument {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static Package openPackage(File f) throws InvalidFormatException {
|
/**
|
||||||
return Package.open(f.toString(), PackageAccess.READ_WRITE);
|
* Retrieves the PackagePart for the given relation
|
||||||
|
* id. This will normally come from a r:id attribute
|
||||||
|
* on part of the base document.
|
||||||
|
* @param partId The r:id pointing to the other PackagePart
|
||||||
|
*/
|
||||||
|
protected PackagePart getRelatedPackagePart(String partId) {
|
||||||
|
PackageRelationship rel =
|
||||||
|
basePart.getRelationship(partId);
|
||||||
|
|
||||||
|
PackagePartName relName;
|
||||||
|
try {
|
||||||
|
relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
||||||
|
} catch(InvalidFormatException e) {
|
||||||
|
throw new InternalError(e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
PackagePart part = container.getPart(relName);
|
||||||
|
if(part == null) {
|
||||||
|
throw new IllegalArgumentException("No part found for rel " + rel);
|
||||||
|
}
|
||||||
|
return part;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -87,4 +110,12 @@ public abstract class HXFDocument {
|
|||||||
public Package getPackage() {
|
public Package getPackage() {
|
||||||
return container;
|
return container;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns an opened OOXML Package for the supplied File
|
||||||
|
* @param f File to open
|
||||||
|
*/
|
||||||
|
public static Package openPackage(File f) throws InvalidFormatException {
|
||||||
|
return Package.open(f.toString(), PackageAccess.READ_WRITE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,9 @@ public class HXFLister {
|
|||||||
|
|
||||||
if(! part.isRelationshipPart()) {
|
if(! part.isRelationshipPart()) {
|
||||||
disp.println("\t" + part.getRelationships().size() + " relations");
|
disp.println("\t" + part.getRelationships().size() + " relations");
|
||||||
|
for(PackageRelationship rel : part.getRelationships()) {
|
||||||
|
displayRelation(rel, "\t ");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -92,13 +95,16 @@ public class HXFLister {
|
|||||||
PackageRelationshipCollection rels =
|
PackageRelationshipCollection rels =
|
||||||
container.getRelationships();
|
container.getRelationships();
|
||||||
for (PackageRelationship rel : rels) {
|
for (PackageRelationship rel : rels) {
|
||||||
disp.println("Relationship:");
|
displayRelation(rel, "");
|
||||||
disp.println("\tFrom: "+ rel.getSourceURI());
|
|
||||||
disp.println("\tTo: " + rel.getTargetURI());
|
|
||||||
disp.println("\tMode: " + rel.getTargetMode());
|
|
||||||
disp.println("\tType: " + rel.getRelationshipType());
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
private void displayRelation(PackageRelationship rel, String indent) {
|
||||||
|
disp.println(indent+"Relationship:");
|
||||||
|
disp.println(indent+"\tFrom: "+ rel.getSourceURI());
|
||||||
|
disp.println(indent+"\tTo: " + rel.getTargetURI());
|
||||||
|
disp.println(indent+"\tMode: " + rel.getTargetMode());
|
||||||
|
disp.println(indent+"\tType: " + rel.getRelationshipType());
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String[] args) throws Exception {
|
public static void main(String[] args) throws Exception {
|
||||||
if(args.length == 0) {
|
if(args.length == 0) {
|
||||||
|
@ -5,6 +5,7 @@ import java.io.File;
|
|||||||
import org.apache.poi.hxf.HXFDocument;
|
import org.apache.poi.hxf.HXFDocument;
|
||||||
import org.openxml4j.opc.Package;
|
import org.openxml4j.opc.Package;
|
||||||
import org.openxml4j.opc.PackagePart;
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet;
|
||||||
|
|
||||||
import junit.framework.TestCase;
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
@ -64,5 +65,32 @@ public class TestHSSFXML extends TestCase {
|
|||||||
xml = new HSSFXML(
|
xml = new HSSFXML(
|
||||||
HXFDocument.openPackage(sampleFile)
|
HXFDocument.openPackage(sampleFile)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
// Check it has a workbook
|
||||||
|
assertNotNull(xml.getWorkbook());
|
||||||
|
}
|
||||||
|
|
||||||
|
public void testSheetBasics() throws Exception {
|
||||||
|
HSSFXML xml = new HSSFXML(
|
||||||
|
HXFDocument.openPackage(sampleFile)
|
||||||
|
);
|
||||||
|
|
||||||
|
// Should have three sheets
|
||||||
|
assertEquals(3, xml.getSheetReferences().sizeOfSheetArray());
|
||||||
|
assertEquals(3, xml.getSheetReferences().getSheetArray().length);
|
||||||
|
|
||||||
|
// Check they're as expected
|
||||||
|
CTSheet[] sheets = xml.getSheetReferences().getSheetArray();
|
||||||
|
assertEquals("Sheet1", sheets[0].getName());
|
||||||
|
assertEquals("Sheet2", sheets[1].getName());
|
||||||
|
assertEquals("Sheet3", sheets[2].getName());
|
||||||
|
assertEquals("rId1", sheets[0].getId());
|
||||||
|
assertEquals("rId2", sheets[1].getId());
|
||||||
|
assertEquals("rId3", sheets[2].getId());
|
||||||
|
|
||||||
|
// Now get those objects
|
||||||
|
assertNotNull(xml.getSheet(sheets[0]));
|
||||||
|
assertNotNull(xml.getSheet(sheets[1]));
|
||||||
|
assertNotNull(xml.getSheet(sheets[2]));
|
||||||
}
|
}
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user