mirror of https://github.com/apache/poi.git
As discussed on dev@poi, move XSSFRelation out to its own class
git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@684881 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
e9551a1978
commit
821aad8c70
|
@ -23,12 +23,6 @@ import java.io.InputStream;
|
||||||
import java.io.PushbackInputStream;
|
import java.io.PushbackInputStream;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
|
|
||||||
import org.openxml4j.exceptions.InvalidFormatException;
|
|
||||||
import org.openxml4j.exceptions.OpenXML4JException;
|
|
||||||
import org.openxml4j.opc.Package;
|
|
||||||
import org.openxml4j.opc.PackagePart;
|
|
||||||
import org.openxml4j.opc.PackageRelationshipCollection;
|
|
||||||
|
|
||||||
import org.apache.poi.POIOLE2TextExtractor;
|
import org.apache.poi.POIOLE2TextExtractor;
|
||||||
import org.apache.poi.POITextExtractor;
|
import org.apache.poi.POITextExtractor;
|
||||||
import org.apache.poi.POIXMLDocument;
|
import org.apache.poi.POIXMLDocument;
|
||||||
|
@ -42,10 +36,15 @@ import org.apache.poi.poifs.filesystem.POIFSFileSystem;
|
||||||
import org.apache.poi.xslf.XSLFSlideShow;
|
import org.apache.poi.xslf.XSLFSlideShow;
|
||||||
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
|
import org.apache.poi.xslf.extractor.XSLFPowerPointExtractor;
|
||||||
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
|
import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
import org.apache.poi.xwpf.XWPFDocument;
|
import org.apache.poi.xwpf.XWPFDocument;
|
||||||
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
|
import org.apache.poi.xwpf.extractor.XWPFWordExtractor;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
|
import org.openxml4j.exceptions.InvalidFormatException;
|
||||||
|
import org.openxml4j.exceptions.OpenXML4JException;
|
||||||
|
import org.openxml4j.opc.Package;
|
||||||
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
import org.openxml4j.opc.PackageRelationshipCollection;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Figures out the correct POITextExtractor for your supplied
|
* Figures out the correct POITextExtractor for your supplied
|
||||||
|
@ -93,7 +92,7 @@ public class ExtractorFactory {
|
||||||
}
|
}
|
||||||
|
|
||||||
PackagePart corePart = pkg.getPart(core.getRelationship(0));
|
PackagePart corePart = pkg.getPart(core.getRelationship(0));
|
||||||
if(corePart.getContentType().equals(XSSFWorkbook.WORKBOOK.getContentType())) {
|
if(corePart.getContentType().equals(XSSFRelation.WORKBOOK.getContentType())) {
|
||||||
return new XSSFExcelExtractor(pkg);
|
return new XSSFExcelExtractor(pkg);
|
||||||
}
|
}
|
||||||
if(corePart.getContentType().equals(XWPFDocument.MAIN_CONTENT_TYPE)) {
|
if(corePart.getContentType().equals(XWPFDocument.MAIN_CONTENT_TYPE)) {
|
||||||
|
|
|
@ -22,7 +22,7 @@ import java.util.Iterator;
|
||||||
|
|
||||||
import org.apache.poi.xssf.model.SharedStringsTable;
|
import org.apache.poi.xssf.model.SharedStringsTable;
|
||||||
import org.apache.poi.xssf.model.StylesTable;
|
import org.apache.poi.xssf.model.StylesTable;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
import org.openxml4j.exceptions.InvalidFormatException;
|
import org.openxml4j.exceptions.InvalidFormatException;
|
||||||
import org.openxml4j.exceptions.OpenXML4JException;
|
import org.openxml4j.exceptions.OpenXML4JException;
|
||||||
import org.openxml4j.opc.Package;
|
import org.openxml4j.opc.Package;
|
||||||
|
@ -82,7 +82,7 @@ public class XSSFReader {
|
||||||
* shared strings table.
|
* shared strings table.
|
||||||
*/
|
*/
|
||||||
public InputStream getSharedStringsData() throws IOException, InvalidFormatException {
|
public InputStream getSharedStringsData() throws IOException, InvalidFormatException {
|
||||||
return XSSFWorkbook.SHARED_STRINGS.getContents(workbookPart);
|
return XSSFRelation.SHARED_STRINGS.getContents(workbookPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -90,7 +90,7 @@ public class XSSFReader {
|
||||||
* styles table.
|
* styles table.
|
||||||
*/
|
*/
|
||||||
public InputStream getStylesData() throws IOException, InvalidFormatException {
|
public InputStream getStylesData() throws IOException, InvalidFormatException {
|
||||||
return XSSFWorkbook.STYLES.getContents(workbookPart);
|
return XSSFRelation.STYLES.getContents(workbookPart);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -138,7 +138,7 @@ public class XSSFReader {
|
||||||
// Find all the sheets
|
// Find all the sheets
|
||||||
PackageRelationshipCollection sheets =
|
PackageRelationshipCollection sheets =
|
||||||
workbookPart.getRelationshipsByType(
|
workbookPart.getRelationshipsByType(
|
||||||
XSSFWorkbook.WORKSHEET.getRelation()
|
XSSFRelation.WORKSHEET.getRelation()
|
||||||
);
|
);
|
||||||
sheetRels = sheets.iterator();
|
sheetRels = sheets.iterator();
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,7 @@ import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFActiveXData;
|
import org.apache.poi.xssf.usermodel.XSSFActiveXData;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxml4j.opc.PackagePart;
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
@ -63,7 +63,7 @@ public class Control implements XSSFChildContainingModel {
|
||||||
*/
|
*/
|
||||||
public String[] getChildrenRelationshipTypes() {
|
public String[] getChildrenRelationshipTypes() {
|
||||||
return new String[] {
|
return new String[] {
|
||||||
XSSFWorkbook.ACTIVEX_BINS.getRelation()
|
XSSFRelation.ACTIVEX_BINS.getRelation()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ public class Control implements XSSFChildContainingModel {
|
||||||
}
|
}
|
||||||
return new WritableChild(
|
return new WritableChild(
|
||||||
activexBins.get(index),
|
activexBins.get(index),
|
||||||
XSSFWorkbook.ACTIVEX_BINS
|
XSSFRelation.ACTIVEX_BINS
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,7 +6,7 @@ import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFPictureData;
|
import org.apache.poi.xssf.usermodel.XSSFPictureData;
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
import org.openxml4j.opc.PackagePart;
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
@ -65,7 +65,7 @@ public class Drawing implements XSSFChildContainingModel {
|
||||||
*/
|
*/
|
||||||
public String[] getChildrenRelationshipTypes() {
|
public String[] getChildrenRelationshipTypes() {
|
||||||
return new String[] {
|
return new String[] {
|
||||||
XSSFWorkbook.IMAGES.getRelation()
|
XSSFRelation.IMAGES.getRelation()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,7 +87,7 @@ public class Drawing implements XSSFChildContainingModel {
|
||||||
}
|
}
|
||||||
return new WritableChild(
|
return new WritableChild(
|
||||||
pictures.get(index),
|
pictures.get(index),
|
||||||
XSSFWorkbook.IMAGES
|
XSSFRelation.IMAGES
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,8 +22,6 @@ import java.io.InputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import javax.xml.namespace.QName;
|
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.SharedStringSource;
|
import org.apache.poi.ss.usermodel.SharedStringSource;
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
|
|
|
@ -16,10 +16,7 @@
|
||||||
==================================================================== */
|
==================================================================== */
|
||||||
package org.apache.poi.xssf.model;
|
package org.apache.poi.xssf.model;
|
||||||
|
|
||||||
import java.io.IOException;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook.XSSFRelation;
|
|
||||||
import org.openxml4j.exceptions.InvalidFormatException;
|
|
||||||
import org.openxml4j.opc.PackagePart;
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -19,7 +19,7 @@ package org.apache.poi.xssf.model;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook.XSSFRelation;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Common interface for XSSF models, which deal with
|
* Common interface for XSSF models, which deal with
|
||||||
|
|
|
@ -19,7 +19,7 @@ package org.apache.poi.xssf.model;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
import org.apache.poi.xssf.usermodel.XSSFWorkbook.XSSFRelation;
|
import org.apache.poi.xssf.usermodel.XSSFRelation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A very stripped down XSSF models interface,
|
* A very stripped down XSSF models interface,
|
||||||
|
|
|
@ -398,7 +398,7 @@ public class XSSFCellStyle implements CellStyle {
|
||||||
|
|
||||||
private CTCellProtection getCellProtection() {
|
private CTCellProtection getCellProtection() {
|
||||||
if (cellXf.getProtection() == null) {
|
if (cellXf.getProtection() == null) {
|
||||||
CTCellProtection protection = cellXf.addNewProtection();
|
cellXf.addNewProtection();
|
||||||
}
|
}
|
||||||
return cellXf.getProtection();
|
return cellXf.getProtection();
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,7 +19,6 @@ package org.apache.poi.xssf.usermodel;
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
|
|
||||||
import org.apache.poi.ss.usermodel.Font;
|
import org.apache.poi.ss.usermodel.Font;
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTBorder;
|
|
||||||
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont;
|
import org.openxmlformats.schemas.spreadsheetml.x2006.main.CTFont;
|
||||||
|
|
||||||
public class XSSFFont implements Font {
|
public class XSSFFont implements Font {
|
||||||
|
|
|
@ -99,7 +99,7 @@ public class XSSFHyperlink implements Hyperlink {
|
||||||
if(needsRelationToo()) {
|
if(needsRelationToo()) {
|
||||||
// Generate the relation
|
// Generate the relation
|
||||||
PackageRelationship rel =
|
PackageRelationship rel =
|
||||||
sheetPart.addExternalRelationship(location, XSSFWorkbook.SHEET_HYPERLINKS.getRelation());
|
sheetPart.addExternalRelationship(location, XSSFRelation.SHEET_HYPERLINKS.getRelation());
|
||||||
|
|
||||||
// Update the r:id
|
// Update the r:id
|
||||||
ctHyperlink.setId(rel.getId());
|
ctHyperlink.setId(rel.getId());
|
||||||
|
|
|
@ -0,0 +1,329 @@
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import java.lang.reflect.Constructor;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Iterator;
|
||||||
|
|
||||||
|
import org.apache.poi.POIXMLDocument;
|
||||||
|
import org.apache.poi.util.POILogFactory;
|
||||||
|
import org.apache.poi.util.POILogger;
|
||||||
|
import org.apache.poi.xssf.model.BinaryPart;
|
||||||
|
import org.apache.poi.xssf.model.CommentsTable;
|
||||||
|
import org.apache.poi.xssf.model.Control;
|
||||||
|
import org.apache.poi.xssf.model.Drawing;
|
||||||
|
import org.apache.poi.xssf.model.SharedStringsTable;
|
||||||
|
import org.apache.poi.xssf.model.StylesTable;
|
||||||
|
import org.apache.poi.xssf.model.XSSFChildContainingModel;
|
||||||
|
import org.apache.poi.xssf.model.XSSFModel;
|
||||||
|
import org.apache.poi.xssf.model.XSSFWritableModel;
|
||||||
|
import org.openxml4j.exceptions.InvalidFormatException;
|
||||||
|
import org.openxml4j.opc.PackagePart;
|
||||||
|
import org.openxml4j.opc.PackagePartName;
|
||||||
|
import org.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.openxml4j.opc.PackageRelationshipCollection;
|
||||||
|
import org.openxml4j.opc.PackagingURIHelper;
|
||||||
|
import org.openxml4j.opc.TargetMode;
|
||||||
|
|
||||||
|
public class XSSFRelation {
|
||||||
|
public static final XSSFRelation WORKBOOK = new XSSFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/workbook",
|
||||||
|
"/xl/workbook.xml",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
public static final XSSFRelation MACROS_WORKBOOK = new XSSFRelation(
|
||||||
|
"application/vnd.ms-excel.sheet.macroEnabled.main+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
||||||
|
"/xl/workbook.xml",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
public static final XSSFRelation WORKSHEET = new XSSFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
|
||||||
|
"/xl/worksheets/sheet#.xml",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
public static final XSSFRelation SHARED_STRINGS = new XSSFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings",
|
||||||
|
"/xl/sharedStrings.xml",
|
||||||
|
SharedStringsTable.class
|
||||||
|
);
|
||||||
|
public static final XSSFRelation STYLES = new XSSFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",
|
||||||
|
"/xl/styles.xml",
|
||||||
|
StylesTable.class
|
||||||
|
);
|
||||||
|
public static final XSSFRelation DRAWINGS = new XSSFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing",
|
||||||
|
"/xl/drawings/drawing#.xml",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
public static final XSSFRelation VML_DRAWINGS = new XSSFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.vmlDrawing",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
|
||||||
|
"/xl/drawings/vmlDrawing#.vml",
|
||||||
|
Drawing.class
|
||||||
|
);
|
||||||
|
public static final XSSFRelation IMAGES = new XSSFRelation(
|
||||||
|
"image/x-emf", // TODO
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
|
||||||
|
"/xl/media/image#.emf",
|
||||||
|
null
|
||||||
|
);
|
||||||
|
public static final XSSFRelation SHEET_COMMENTS = new XSSFRelation(
|
||||||
|
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
|
||||||
|
"/xl/comments#.xml",
|
||||||
|
CommentsTable.class
|
||||||
|
);
|
||||||
|
public static final XSSFRelation SHEET_HYPERLINKS = new XSSFRelation(
|
||||||
|
null,
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
);
|
||||||
|
public static final XSSFRelation OLEEMBEDDINGS = new XSSFRelation(
|
||||||
|
null,
|
||||||
|
POIXMLDocument.OLE_OBJECT_REL_TYPE,
|
||||||
|
null,
|
||||||
|
BinaryPart.class
|
||||||
|
);
|
||||||
|
public static final XSSFRelation PACKEMBEDDINGS = new XSSFRelation(
|
||||||
|
null,
|
||||||
|
POIXMLDocument.PACK_OBJECT_REL_TYPE,
|
||||||
|
null,
|
||||||
|
BinaryPart.class
|
||||||
|
);
|
||||||
|
|
||||||
|
public static final XSSFRelation VBA_MACROS = new XSSFRelation(
|
||||||
|
"application/vnd.ms-office.vbaProject",
|
||||||
|
"http://schemas.microsoft.com/office/2006/relationships/vbaProject",
|
||||||
|
"/xl/vbaProject.bin",
|
||||||
|
BinaryPart.class
|
||||||
|
);
|
||||||
|
public static final XSSFRelation ACTIVEX_CONTROLS = new XSSFRelation(
|
||||||
|
"application/vnd.ms-office.activeX+xml",
|
||||||
|
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/control",
|
||||||
|
"/xl/activeX/activeX#.xml",
|
||||||
|
Control.class
|
||||||
|
);
|
||||||
|
public static final XSSFRelation ACTIVEX_BINS = new XSSFRelation(
|
||||||
|
"application/vnd.ms-office.activeX",
|
||||||
|
"http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary",
|
||||||
|
"/xl/activeX/activeX#.bin",
|
||||||
|
BinaryPart.class
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
private static POILogger log = POILogFactory.getLogger(XSSFRelation.class);
|
||||||
|
|
||||||
|
|
||||||
|
private String TYPE;
|
||||||
|
private String REL;
|
||||||
|
private String DEFAULT_NAME;
|
||||||
|
private Class<? extends XSSFModel> CLASS;
|
||||||
|
|
||||||
|
protected XSSFRelation(String TYPE, String REL, String DEFAULT_NAME, Class<? extends XSSFModel> CLASS) {
|
||||||
|
this.TYPE = TYPE;
|
||||||
|
this.REL = REL;
|
||||||
|
this.DEFAULT_NAME = DEFAULT_NAME;
|
||||||
|
this.CLASS = CLASS;
|
||||||
|
}
|
||||||
|
public String getContentType() { return TYPE; }
|
||||||
|
public String getRelation() { return REL; }
|
||||||
|
public String getDefaultFileName() { return DEFAULT_NAME; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does one of these exist for the given core
|
||||||
|
* package part?
|
||||||
|
*/
|
||||||
|
public boolean exists(PackagePart corePart) throws IOException, InvalidFormatException {
|
||||||
|
if(corePart == null) {
|
||||||
|
// new file, can't exist
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
PackageRelationshipCollection prc =
|
||||||
|
corePart.getRelationshipsByType(REL);
|
||||||
|
Iterator<PackageRelationship> it = prc.iterator();
|
||||||
|
if(it.hasNext()) {
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the filename for the nth one of these,
|
||||||
|
* eg /xl/comments4.xml
|
||||||
|
*/
|
||||||
|
public String getFileName(int index) {
|
||||||
|
if(DEFAULT_NAME.indexOf("#") == -1) {
|
||||||
|
// Generic filename in all cases
|
||||||
|
return getDefaultFileName();
|
||||||
|
}
|
||||||
|
return DEFAULT_NAME.replace("#", Integer.toString(index));
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Fetches the InputStream to read the contents, based
|
||||||
|
* of the specified core part, for which we are defined
|
||||||
|
* as a suitable relationship
|
||||||
|
*/
|
||||||
|
public InputStream getContents(PackagePart corePart) throws IOException, InvalidFormatException {
|
||||||
|
PackageRelationshipCollection prc =
|
||||||
|
corePart.getRelationshipsByType(REL);
|
||||||
|
Iterator<PackageRelationship> it = prc.iterator();
|
||||||
|
if(it.hasNext()) {
|
||||||
|
PackageRelationship rel = it.next();
|
||||||
|
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
||||||
|
PackagePart part = corePart.getPackage().getPart(relName);
|
||||||
|
return part.getInputStream();
|
||||||
|
} else {
|
||||||
|
log.log(POILogger.WARN, "No part " + DEFAULT_NAME + " found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Loads all the XSSFModels of this type which are
|
||||||
|
* defined as relationships of the given parent part
|
||||||
|
*/
|
||||||
|
public ArrayList<? extends XSSFModel> loadAll(PackagePart parentPart) throws Exception {
|
||||||
|
ArrayList<XSSFModel> found = new ArrayList<XSSFModel>();
|
||||||
|
for(PackageRelationship rel : parentPart.getRelationshipsByType(REL)) {
|
||||||
|
PackagePart part = XSSFWorkbook.getTargetPart(parentPart.getPackage(), rel);
|
||||||
|
found.add(create(part, rel));
|
||||||
|
}
|
||||||
|
return found;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Load a single Model, which is defined as a suitable
|
||||||
|
* relationship from the specified core (parent)
|
||||||
|
* package part.
|
||||||
|
*/
|
||||||
|
public XSSFModel load(PackagePart corePart) throws Exception {
|
||||||
|
PackageRelationshipCollection prc =
|
||||||
|
corePart.getRelationshipsByType(REL);
|
||||||
|
Iterator<PackageRelationship> it = prc.iterator();
|
||||||
|
if(it.hasNext()) {
|
||||||
|
PackageRelationship rel = it.next();
|
||||||
|
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
||||||
|
PackagePart part = corePart.getPackage().getPart(relName);
|
||||||
|
return create(part, rel);
|
||||||
|
} else {
|
||||||
|
log.log(POILogger.WARN, "No part " + DEFAULT_NAME + " found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Does the actual Model creation
|
||||||
|
*/
|
||||||
|
private XSSFModel create(PackagePart thisPart, PackageRelationship rel) throws Exception {
|
||||||
|
XSSFModel model = null;
|
||||||
|
|
||||||
|
Constructor<? extends XSSFModel> c;
|
||||||
|
boolean withString = false;
|
||||||
|
|
||||||
|
// Find the right constructor
|
||||||
|
try {
|
||||||
|
c = CLASS.getConstructor(InputStream.class, String.class);
|
||||||
|
withString = true;
|
||||||
|
} catch(NoSuchMethodException e) {
|
||||||
|
c = CLASS.getConstructor(InputStream.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Instantiate, if we can
|
||||||
|
InputStream inp = thisPart.getInputStream();
|
||||||
|
if(inp != null) {
|
||||||
|
try {
|
||||||
|
if(withString) {
|
||||||
|
model = c.newInstance(inp, rel.getId());
|
||||||
|
} else {
|
||||||
|
model = c.newInstance(inp);
|
||||||
|
}
|
||||||
|
} finally {
|
||||||
|
inp.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Do children, if required
|
||||||
|
if(model instanceof XSSFChildContainingModel) {
|
||||||
|
XSSFChildContainingModel ccm =
|
||||||
|
(XSSFChildContainingModel)model;
|
||||||
|
for(String relType : ccm.getChildrenRelationshipTypes()) {
|
||||||
|
for(PackageRelationship cRel : thisPart.getRelationshipsByType(relType)) {
|
||||||
|
PackagePart childPart = XSSFWorkbook.getTargetPart(thisPart.getPackage(), cRel);
|
||||||
|
ccm.generateChild(childPart, cRel.getId());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
return model;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Save, with the default name
|
||||||
|
* @return The internal reference ID it was saved at, normally then used as an r:id
|
||||||
|
*/
|
||||||
|
protected String save(XSSFWritableModel model, PackagePart corePart) throws IOException {
|
||||||
|
return save(model, corePart, DEFAULT_NAME);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Save, with the name generated by the given index
|
||||||
|
* @return The internal reference ID it was saved at, normally then used as an r:id
|
||||||
|
*/
|
||||||
|
protected String save(XSSFWritableModel model, PackagePart corePart, int index) throws IOException {
|
||||||
|
return save(model, corePart, getFileName(index));
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Save, with the specified name
|
||||||
|
* @return The internal reference ID it was saved at, normally then used as an r:id
|
||||||
|
*/
|
||||||
|
protected String save(XSSFWritableModel model, PackagePart corePart, String name) throws IOException {
|
||||||
|
PackagePartName ppName = null;
|
||||||
|
try {
|
||||||
|
ppName = PackagingURIHelper.createPartName(name);
|
||||||
|
} catch(InvalidFormatException e) {
|
||||||
|
throw new IllegalStateException("Can't create part with name " + name + " for " + model, e);
|
||||||
|
}
|
||||||
|
PackageRelationship rel =
|
||||||
|
corePart.addRelationship(ppName, TargetMode.INTERNAL, REL);
|
||||||
|
PackagePart part = corePart.getPackage().createPart(ppName, TYPE);
|
||||||
|
|
||||||
|
OutputStream out = part.getOutputStream();
|
||||||
|
model.writeTo(out);
|
||||||
|
out.close();
|
||||||
|
|
||||||
|
// Do children, if required
|
||||||
|
if(model instanceof XSSFChildContainingModel) {
|
||||||
|
XSSFChildContainingModel ccm =
|
||||||
|
(XSSFChildContainingModel)model;
|
||||||
|
// Loop over each child, writing it out
|
||||||
|
int numChildren = ccm.getNumberOfChildren();
|
||||||
|
for(int i=0; i<numChildren; i++) {
|
||||||
|
XSSFChildContainingModel.WritableChild child =
|
||||||
|
ccm.getChildForWriting(i);
|
||||||
|
child.getRelation().save(
|
||||||
|
child.getModel(),
|
||||||
|
part,
|
||||||
|
(i+1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return rel.getId();
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,11 +18,8 @@
|
||||||
package org.apache.poi.xssf.usermodel;
|
package org.apache.poi.xssf.usermodel;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.lang.reflect.Constructor;
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
|
||||||
import java.util.LinkedList;
|
import java.util.LinkedList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
|
@ -45,15 +42,12 @@ import org.apache.poi.ss.usermodel.Row.MissingCellPolicy;
|
||||||
import org.apache.poi.ss.util.SheetReferences;
|
import org.apache.poi.ss.util.SheetReferences;
|
||||||
import org.apache.poi.util.POILogFactory;
|
import org.apache.poi.util.POILogFactory;
|
||||||
import org.apache.poi.util.POILogger;
|
import org.apache.poi.util.POILogger;
|
||||||
import org.apache.poi.xssf.model.BinaryPart;
|
|
||||||
import org.apache.poi.xssf.model.CommentsTable;
|
import org.apache.poi.xssf.model.CommentsTable;
|
||||||
import org.apache.poi.xssf.model.Control;
|
import org.apache.poi.xssf.model.Control;
|
||||||
import org.apache.poi.xssf.model.Drawing;
|
import org.apache.poi.xssf.model.Drawing;
|
||||||
import org.apache.poi.xssf.model.SharedStringsTable;
|
import org.apache.poi.xssf.model.SharedStringsTable;
|
||||||
import org.apache.poi.xssf.model.StylesTable;
|
import org.apache.poi.xssf.model.StylesTable;
|
||||||
import org.apache.poi.xssf.model.XSSFChildContainingModel;
|
|
||||||
import org.apache.poi.xssf.model.XSSFModel;
|
import org.apache.poi.xssf.model.XSSFModel;
|
||||||
import org.apache.poi.xssf.model.XSSFWritableModel;
|
|
||||||
import org.apache.xmlbeans.XmlException;
|
import org.apache.xmlbeans.XmlException;
|
||||||
import org.apache.xmlbeans.XmlObject;
|
import org.apache.xmlbeans.XmlObject;
|
||||||
import org.apache.xmlbeans.XmlOptions;
|
import org.apache.xmlbeans.XmlOptions;
|
||||||
|
@ -79,300 +73,6 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.WorksheetDocument;
|
||||||
|
|
||||||
|
|
||||||
public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
public static final XSSFRelation WORKBOOK = new XSSFRelation(
|
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/workbook",
|
|
||||||
"/xl/workbook.xml",
|
|
||||||
null
|
|
||||||
);
|
|
||||||
public static final XSSFRelation MACROS_WORKBOOK = new XSSFRelation(
|
|
||||||
"application/vnd.ms-excel.sheet.macroEnabled.main+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument",
|
|
||||||
"/xl/workbook.xml",
|
|
||||||
null
|
|
||||||
);
|
|
||||||
public static final XSSFRelation WORKSHEET = new XSSFRelation(
|
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/worksheet",
|
|
||||||
"/xl/worksheets/sheet#.xml",
|
|
||||||
null
|
|
||||||
);
|
|
||||||
public static final XSSFRelation SHARED_STRINGS = new XSSFRelation(
|
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/sharedStrings",
|
|
||||||
"/xl/sharedStrings.xml",
|
|
||||||
SharedStringsTable.class
|
|
||||||
);
|
|
||||||
public static final XSSFRelation STYLES = new XSSFRelation(
|
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/styles",
|
|
||||||
"/xl/styles.xml",
|
|
||||||
StylesTable.class
|
|
||||||
);
|
|
||||||
public static final XSSFRelation DRAWINGS = new XSSFRelation(
|
|
||||||
"application/vnd.openxmlformats-officedocument.drawingml.chart+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/drawing",
|
|
||||||
"/xl/drawings/drawing#.xml",
|
|
||||||
null
|
|
||||||
);
|
|
||||||
public static final XSSFRelation VML_DRAWINGS = new XSSFRelation(
|
|
||||||
"application/vnd.openxmlformats-officedocument.vmlDrawing",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/vmlDrawing",
|
|
||||||
"/xl/drawings/vmlDrawing#.vml",
|
|
||||||
Drawing.class
|
|
||||||
);
|
|
||||||
public static final XSSFRelation IMAGES = new XSSFRelation(
|
|
||||||
"image/x-emf", // TODO
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/image",
|
|
||||||
"/xl/media/image#.emf",
|
|
||||||
null
|
|
||||||
);
|
|
||||||
public static final XSSFRelation SHEET_COMMENTS = new XSSFRelation(
|
|
||||||
"application/vnd.openxmlformats-officedocument.spreadsheetml.comments+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/comments",
|
|
||||||
"/xl/comments#.xml",
|
|
||||||
CommentsTable.class
|
|
||||||
);
|
|
||||||
public static final XSSFRelation SHEET_HYPERLINKS = new XSSFRelation(
|
|
||||||
null,
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/hyperlink",
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
);
|
|
||||||
public static final XSSFRelation OLEEMBEDDINGS = new XSSFRelation(
|
|
||||||
null,
|
|
||||||
OLE_OBJECT_REL_TYPE,
|
|
||||||
null,
|
|
||||||
BinaryPart.class
|
|
||||||
);
|
|
||||||
public static final XSSFRelation PACKEMBEDDINGS = new XSSFRelation(
|
|
||||||
null,
|
|
||||||
PACK_OBJECT_REL_TYPE,
|
|
||||||
null,
|
|
||||||
BinaryPart.class
|
|
||||||
);
|
|
||||||
|
|
||||||
public static final XSSFRelation VBA_MACROS = new XSSFRelation(
|
|
||||||
"application/vnd.ms-office.vbaProject",
|
|
||||||
"http://schemas.microsoft.com/office/2006/relationships/vbaProject",
|
|
||||||
"/xl/vbaProject.bin",
|
|
||||||
BinaryPart.class
|
|
||||||
);
|
|
||||||
public static final XSSFRelation ACTIVEX_CONTROLS = new XSSFRelation(
|
|
||||||
"application/vnd.ms-office.activeX+xml",
|
|
||||||
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/control",
|
|
||||||
"/xl/activeX/activeX#.xml",
|
|
||||||
Control.class
|
|
||||||
);
|
|
||||||
public static final XSSFRelation ACTIVEX_BINS = new XSSFRelation(
|
|
||||||
"application/vnd.ms-office.activeX",
|
|
||||||
"http://schemas.microsoft.com/office/2006/relationships/activeXControlBinary",
|
|
||||||
"/xl/activeX/activeX#.bin",
|
|
||||||
BinaryPart.class
|
|
||||||
);
|
|
||||||
|
|
||||||
|
|
||||||
public static class XSSFRelation {
|
|
||||||
private String TYPE;
|
|
||||||
private String REL;
|
|
||||||
private String DEFAULT_NAME;
|
|
||||||
private Class<? extends XSSFModel> CLASS;
|
|
||||||
private XSSFRelation(String TYPE, String REL, String DEFAULT_NAME, Class<? extends XSSFModel> CLASS) {
|
|
||||||
this.TYPE = TYPE;
|
|
||||||
this.REL = REL;
|
|
||||||
this.DEFAULT_NAME = DEFAULT_NAME;
|
|
||||||
this.CLASS = CLASS;
|
|
||||||
}
|
|
||||||
public String getContentType() { return TYPE; }
|
|
||||||
public String getRelation() { return REL; }
|
|
||||||
public String getDefaultFileName() { return DEFAULT_NAME; }
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does one of these exist for the given core
|
|
||||||
* package part?
|
|
||||||
*/
|
|
||||||
public boolean exists(PackagePart corePart) throws IOException, InvalidFormatException {
|
|
||||||
if(corePart == null) {
|
|
||||||
// new file, can't exist
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
PackageRelationshipCollection prc =
|
|
||||||
corePart.getRelationshipsByType(REL);
|
|
||||||
Iterator<PackageRelationship> it = prc.iterator();
|
|
||||||
if(it.hasNext()) {
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Returns the filename for the nth one of these,
|
|
||||||
* eg /xl/comments4.xml
|
|
||||||
*/
|
|
||||||
public String getFileName(int index) {
|
|
||||||
if(DEFAULT_NAME.indexOf("#") == -1) {
|
|
||||||
// Generic filename in all cases
|
|
||||||
return getDefaultFileName();
|
|
||||||
}
|
|
||||||
return DEFAULT_NAME.replace("#", Integer.toString(index));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Fetches the InputStream to read the contents, based
|
|
||||||
* of the specified core part, for which we are defined
|
|
||||||
* as a suitable relationship
|
|
||||||
*/
|
|
||||||
public InputStream getContents(PackagePart corePart) throws IOException, InvalidFormatException {
|
|
||||||
PackageRelationshipCollection prc =
|
|
||||||
corePart.getRelationshipsByType(REL);
|
|
||||||
Iterator<PackageRelationship> it = prc.iterator();
|
|
||||||
if(it.hasNext()) {
|
|
||||||
PackageRelationship rel = it.next();
|
|
||||||
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
|
||||||
PackagePart part = corePart.getPackage().getPart(relName);
|
|
||||||
return part.getInputStream();
|
|
||||||
} else {
|
|
||||||
log.log(POILogger.WARN, "No part " + DEFAULT_NAME + " found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Loads all the XSSFModels of this type which are
|
|
||||||
* defined as relationships of the given parent part
|
|
||||||
*/
|
|
||||||
public ArrayList<? extends XSSFModel> loadAll(PackagePart parentPart) throws Exception {
|
|
||||||
ArrayList<XSSFModel> found = new ArrayList<XSSFModel>();
|
|
||||||
for(PackageRelationship rel : parentPart.getRelationshipsByType(REL)) {
|
|
||||||
PackagePart part = getTargetPart(parentPart.getPackage(), rel);
|
|
||||||
found.add(create(part, rel));
|
|
||||||
}
|
|
||||||
return found;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Load a single Model, which is defined as a suitable
|
|
||||||
* relationship from the specified core (parent)
|
|
||||||
* package part.
|
|
||||||
*/
|
|
||||||
public XSSFModel load(PackagePart corePart) throws Exception {
|
|
||||||
PackageRelationshipCollection prc =
|
|
||||||
corePart.getRelationshipsByType(REL);
|
|
||||||
Iterator<PackageRelationship> it = prc.iterator();
|
|
||||||
if(it.hasNext()) {
|
|
||||||
PackageRelationship rel = it.next();
|
|
||||||
PackagePartName relName = PackagingURIHelper.createPartName(rel.getTargetURI());
|
|
||||||
PackagePart part = corePart.getPackage().getPart(relName);
|
|
||||||
return create(part, rel);
|
|
||||||
} else {
|
|
||||||
log.log(POILogger.WARN, "No part " + DEFAULT_NAME + " found");
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Does the actual Model creation
|
|
||||||
*/
|
|
||||||
private XSSFModel create(PackagePart thisPart, PackageRelationship rel) throws Exception {
|
|
||||||
XSSFModel model = null;
|
|
||||||
|
|
||||||
Constructor<? extends XSSFModel> c;
|
|
||||||
boolean withString = false;
|
|
||||||
|
|
||||||
// Find the right constructor
|
|
||||||
try {
|
|
||||||
c = CLASS.getConstructor(InputStream.class, String.class);
|
|
||||||
withString = true;
|
|
||||||
} catch(NoSuchMethodException e) {
|
|
||||||
c = CLASS.getConstructor(InputStream.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Instantiate, if we can
|
|
||||||
InputStream inp = thisPart.getInputStream();
|
|
||||||
if(inp != null) {
|
|
||||||
try {
|
|
||||||
if(withString) {
|
|
||||||
model = c.newInstance(inp, rel.getId());
|
|
||||||
} else {
|
|
||||||
model = c.newInstance(inp);
|
|
||||||
}
|
|
||||||
} finally {
|
|
||||||
inp.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
// Do children, if required
|
|
||||||
if(model instanceof XSSFChildContainingModel) {
|
|
||||||
XSSFChildContainingModel ccm =
|
|
||||||
(XSSFChildContainingModel)model;
|
|
||||||
for(String relType : ccm.getChildrenRelationshipTypes()) {
|
|
||||||
for(PackageRelationship cRel : thisPart.getRelationshipsByType(relType)) {
|
|
||||||
PackagePart childPart = getTargetPart(thisPart.getPackage(), cRel);
|
|
||||||
ccm.generateChild(childPart, cRel.getId());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
return model;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Save, with the default name
|
|
||||||
* @return The internal reference ID it was saved at, normally then used as an r:id
|
|
||||||
*/
|
|
||||||
private String save(XSSFWritableModel model, PackagePart corePart) throws IOException {
|
|
||||||
return save(model, corePart, DEFAULT_NAME);
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Save, with the name generated by the given index
|
|
||||||
* @return The internal reference ID it was saved at, normally then used as an r:id
|
|
||||||
*/
|
|
||||||
private String save(XSSFWritableModel model, PackagePart corePart, int index) throws IOException {
|
|
||||||
return save(model, corePart, getFileName(index));
|
|
||||||
}
|
|
||||||
/**
|
|
||||||
* Save, with the specified name
|
|
||||||
* @return The internal reference ID it was saved at, normally then used as an r:id
|
|
||||||
*/
|
|
||||||
private String save(XSSFWritableModel model, PackagePart corePart, String name) throws IOException {
|
|
||||||
PackagePartName ppName = null;
|
|
||||||
try {
|
|
||||||
ppName = PackagingURIHelper.createPartName(name);
|
|
||||||
} catch(InvalidFormatException e) {
|
|
||||||
throw new IllegalStateException("Can't create part with name " + name + " for " + model, e);
|
|
||||||
}
|
|
||||||
PackageRelationship rel =
|
|
||||||
corePart.addRelationship(ppName, TargetMode.INTERNAL, REL);
|
|
||||||
PackagePart part = corePart.getPackage().createPart(ppName, TYPE);
|
|
||||||
|
|
||||||
OutputStream out = part.getOutputStream();
|
|
||||||
model.writeTo(out);
|
|
||||||
out.close();
|
|
||||||
|
|
||||||
// Do children, if required
|
|
||||||
if(model instanceof XSSFChildContainingModel) {
|
|
||||||
XSSFChildContainingModel ccm =
|
|
||||||
(XSSFChildContainingModel)model;
|
|
||||||
// Loop over each child, writing it out
|
|
||||||
int numChildren = ccm.getNumberOfChildren();
|
|
||||||
for(int i=0; i<numChildren; i++) {
|
|
||||||
XSSFChildContainingModel.WritableChild child =
|
|
||||||
ccm.getChildForWriting(i);
|
|
||||||
child.getRelation().save(
|
|
||||||
child.getModel(),
|
|
||||||
part,
|
|
||||||
(i+1)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return rel.getId();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Are we a normal workbook, or a macro enabled one? */
|
/** Are we a normal workbook, or a macro enabled one? */
|
||||||
private boolean isMacroEnabled = false;
|
private boolean isMacroEnabled = false;
|
||||||
|
|
||||||
|
@ -411,19 +111,19 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
|
|
||||||
// Are we macro enabled, or just normal?
|
// Are we macro enabled, or just normal?
|
||||||
isMacroEnabled =
|
isMacroEnabled =
|
||||||
getCorePart().getContentType().equals(MACROS_WORKBOOK.getContentType());
|
getCorePart().getContentType().equals(XSSFRelation.MACROS_WORKBOOK.getContentType());
|
||||||
|
|
||||||
try {
|
try {
|
||||||
// Load shared strings
|
// Load shared strings
|
||||||
this.sharedStringSource = (SharedStringSource)
|
this.sharedStringSource = (SharedStringSource)
|
||||||
SHARED_STRINGS.load(getCorePart());
|
XSSFRelation.SHARED_STRINGS.load(getCorePart());
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
throw new IOException("Unable to load shared strings - " + e.toString());
|
throw new IOException("Unable to load shared strings - " + e.toString());
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
// Load styles source
|
// Load styles source
|
||||||
this.stylesSource = (StylesSource)
|
this.stylesSource = (StylesSource)
|
||||||
STYLES.load(getCorePart());
|
XSSFRelation.STYLES.load(getCorePart());
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
throw new IOException("Unable to load styles - " + e.toString());
|
throw new IOException("Unable to load styles - " + e.toString());
|
||||||
|
@ -444,15 +144,15 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
ArrayList<Control> controls;
|
ArrayList<Control> controls;
|
||||||
try {
|
try {
|
||||||
// Get the comments for the sheet, if there are any
|
// Get the comments for the sheet, if there are any
|
||||||
childModels = SHEET_COMMENTS.loadAll(part);
|
childModels = XSSFRelation.SHEET_COMMENTS.loadAll(part);
|
||||||
if(childModels.size() > 0) {
|
if(childModels.size() > 0) {
|
||||||
comments = (CommentsSource)childModels.get(0);
|
comments = (CommentsSource)childModels.get(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Get the drawings for the sheet, if there are any
|
// Get the drawings for the sheet, if there are any
|
||||||
drawings = (ArrayList<Drawing>)VML_DRAWINGS.loadAll(part);
|
drawings = (ArrayList<Drawing>)XSSFRelation.VML_DRAWINGS.loadAll(part);
|
||||||
// Get the activeX controls for the sheet, if there are any
|
// Get the activeX controls for the sheet, if there are any
|
||||||
controls = (ArrayList<Control>)ACTIVEX_CONTROLS.loadAll(part);
|
controls = (ArrayList<Control>)XSSFRelation.ACTIVEX_CONTROLS.loadAll(part);
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
throw new RuntimeException("Unable to construct child part",e);
|
throw new RuntimeException("Unable to construct child part",e);
|
||||||
}
|
}
|
||||||
|
@ -465,14 +165,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
// Process external hyperlinks for the sheet,
|
// Process external hyperlinks for the sheet,
|
||||||
// if there are any
|
// if there are any
|
||||||
PackageRelationshipCollection hyperlinkRels =
|
PackageRelationshipCollection hyperlinkRels =
|
||||||
part.getRelationshipsByType(SHEET_HYPERLINKS.REL);
|
part.getRelationshipsByType(XSSFRelation.SHEET_HYPERLINKS.getRelation());
|
||||||
sheet.initHyperlinks(hyperlinkRels);
|
sheet.initHyperlinks(hyperlinkRels);
|
||||||
|
|
||||||
// Get the embeddings for the workbook
|
// Get the embeddings for the workbook
|
||||||
for(PackageRelationship rel : part.getRelationshipsByType(OLEEMBEDDINGS.REL))
|
for(PackageRelationship rel : part.getRelationshipsByType(XSSFRelation.OLEEMBEDDINGS.getRelation()))
|
||||||
embedds.add(getTargetPart(rel)); // TODO: Add this reference to each sheet as well
|
embedds.add(getTargetPart(rel)); // TODO: Add this reference to each sheet as well
|
||||||
|
|
||||||
for(PackageRelationship rel : part.getRelationshipsByType(PACKEMBEDDINGS.REL))
|
for(PackageRelationship rel : part.getRelationshipsByType(XSSFRelation.PACKEMBEDDINGS.getRelation()))
|
||||||
embedds.add(getTargetPart(rel));
|
embedds.add(getTargetPart(rel));
|
||||||
}
|
}
|
||||||
} catch (XmlException e) {
|
} catch (XmlException e) {
|
||||||
|
@ -624,10 +324,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
if (sheetPart == null) {
|
if (sheetPart == null) {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
PackageRelationshipCollection prc = sheetPart.getRelationshipsByType(DRAWINGS.getRelation());
|
PackageRelationshipCollection prc = sheetPart.getRelationshipsByType(XSSFRelation.DRAWINGS.getRelation());
|
||||||
for (PackageRelationship rel : prc) {
|
for (PackageRelationship rel : prc) {
|
||||||
PackagePart drawingPart = getTargetPart(rel);
|
PackagePart drawingPart = getTargetPart(rel);
|
||||||
PackageRelationshipCollection prc2 = drawingPart.getRelationshipsByType(IMAGES.getRelation());
|
PackageRelationshipCollection prc2 = drawingPart.getRelationshipsByType(XSSFRelation.IMAGES.getRelation());
|
||||||
for (PackageRelationship rel2 : prc2) {
|
for (PackageRelationship rel2 : prc2) {
|
||||||
PackagePart imagePart = getTargetPart(rel2);
|
PackagePart imagePart = getTargetPart(rel2);
|
||||||
XSSFPictureData pd = new XSSFPictureData(imagePart);
|
XSSFPictureData pd = new XSSFPictureData(imagePart);
|
||||||
|
@ -908,9 +608,9 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
|
|
||||||
public void write(OutputStream stream) throws IOException {
|
public void write(OutputStream stream) throws IOException {
|
||||||
// What kind of workbook are we?
|
// What kind of workbook are we?
|
||||||
XSSFRelation workbookRelation = WORKBOOK;
|
XSSFRelation workbookRelation = XSSFRelation.WORKBOOK;
|
||||||
if(isMacroEnabled) {
|
if(isMacroEnabled) {
|
||||||
workbookRelation = MACROS_WORKBOOK;
|
workbookRelation = XSSFRelation.MACROS_WORKBOOK;
|
||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
|
@ -936,10 +636,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
int sheetNumber = (i+1);
|
int sheetNumber = (i+1);
|
||||||
XSSFSheet sheet = (XSSFSheet) this.getSheetAt(i);
|
XSSFSheet sheet = (XSSFSheet) this.getSheetAt(i);
|
||||||
PackagePartName partName = PackagingURIHelper.createPartName(
|
PackagePartName partName = PackagingURIHelper.createPartName(
|
||||||
WORKSHEET.getFileName(sheetNumber));
|
XSSFRelation.WORKSHEET.getFileName(sheetNumber));
|
||||||
PackageRelationship rel =
|
PackageRelationship rel =
|
||||||
corePart.addRelationship(partName, TargetMode.INTERNAL, WORKSHEET.getRelation(), "rSheet" + sheetNumber);
|
corePart.addRelationship(partName, TargetMode.INTERNAL, XSSFRelation.WORKSHEET.getRelation(), "rSheet" + sheetNumber);
|
||||||
PackagePart part = pkg.createPart(partName, WORKSHEET.getContentType());
|
PackagePart part = pkg.createPart(partName, XSSFRelation.WORKSHEET.getContentType());
|
||||||
|
|
||||||
// XXX This should not be needed, but apparently the setSaveOuter call above does not work in XMLBeans 2.2
|
// XXX This should not be needed, but apparently the setSaveOuter call above does not work in XMLBeans 2.2
|
||||||
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTWorksheet.type.getName().getNamespaceURI(), "worksheet"));
|
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTWorksheet.type.getName().getNamespaceURI(), "worksheet"));
|
||||||
|
@ -952,14 +652,14 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
// If our sheet has comments, then write out those
|
// If our sheet has comments, then write out those
|
||||||
if(sheet.hasComments()) {
|
if(sheet.hasComments()) {
|
||||||
CommentsTable ct = (CommentsTable)sheet.getCommentsSourceIfExists();
|
CommentsTable ct = (CommentsTable)sheet.getCommentsSourceIfExists();
|
||||||
SHEET_COMMENTS.save(ct, part, sheetNumber);
|
XSSFRelation.SHEET_COMMENTS.save(ct, part, sheetNumber);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If our sheet has drawings, then write out those
|
// If our sheet has drawings, then write out those
|
||||||
if(sheet.getDrawings() != null) {
|
if(sheet.getDrawings() != null) {
|
||||||
int drawingIndex = 1;
|
int drawingIndex = 1;
|
||||||
for(Drawing drawing : sheet.getDrawings()) {
|
for(Drawing drawing : sheet.getDrawings()) {
|
||||||
VML_DRAWINGS.save(
|
XSSFRelation.VML_DRAWINGS.save(
|
||||||
drawing,
|
drawing,
|
||||||
part,
|
part,
|
||||||
drawingIndex
|
drawingIndex
|
||||||
|
@ -972,7 +672,7 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
if(sheet.getControls() != null) {
|
if(sheet.getControls() != null) {
|
||||||
int controlIndex = 1;
|
int controlIndex = 1;
|
||||||
for(Control control : sheet.getControls()) {
|
for(Control control : sheet.getControls()) {
|
||||||
ACTIVEX_CONTROLS.save(
|
XSSFRelation.ACTIVEX_CONTROLS.save(
|
||||||
control,
|
control,
|
||||||
part,
|
part,
|
||||||
controlIndex
|
controlIndex
|
||||||
|
@ -985,11 +685,11 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
// Write shared strings and styles
|
// Write shared strings and styles
|
||||||
if(sharedStringSource != null) {
|
if(sharedStringSource != null) {
|
||||||
SharedStringsTable sst = (SharedStringsTable)sharedStringSource;
|
SharedStringsTable sst = (SharedStringsTable)sharedStringSource;
|
||||||
SHARED_STRINGS.save(sst, corePart);
|
XSSFRelation.SHARED_STRINGS.save(sst, corePart);
|
||||||
}
|
}
|
||||||
if(stylesSource != null) {
|
if(stylesSource != null) {
|
||||||
StylesTable st = (StylesTable)stylesSource;
|
StylesTable st = (StylesTable)stylesSource;
|
||||||
STYLES.save(st, corePart);
|
XSSFRelation.STYLES.save(st, corePart);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Named ranges
|
// Named ranges
|
||||||
|
@ -1010,10 +710,10 @@ public class XSSFWorkbook extends POIXMLDocument implements Workbook {
|
||||||
// Macro related bits
|
// Macro related bits
|
||||||
if(isMacroEnabled) {
|
if(isMacroEnabled) {
|
||||||
// Copy VBA Macros if present
|
// Copy VBA Macros if present
|
||||||
if(VBA_MACROS.exists( getCorePart() )) {
|
if(XSSFRelation.VBA_MACROS.exists( getCorePart() )) {
|
||||||
try {
|
try {
|
||||||
XSSFModel vba = VBA_MACROS.load(getCorePart());
|
XSSFModel vba = XSSFRelation.VBA_MACROS.load(getCorePart());
|
||||||
VBA_MACROS.save(vba, corePart);
|
XSSFRelation.VBA_MACROS.save(vba, corePart);
|
||||||
} catch(Exception e) {
|
} catch(Exception e) {
|
||||||
throw new RuntimeException("Unable to copy vba macros over", e);
|
throw new RuntimeException("Unable to copy vba macros over", e);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue