[英]How to read/write XML maps from/in excel with Apache POI in Java?
A little bit of context, in excel there is a tab named Developer , where you can see/add XML maps in the current workbook: 上下文方面,在excel中有一个名为Developer的选项卡,您可以在其中查看/添加当前工作簿中的XML映射:
I am working with Apache POI and I want to read and also write XML maps in excel. 我正在使用Apache POI,我想在excel中阅读和编写XML映射。
Do you know where can I found documentation regarding on how to read/write XML maps in excel using Apache POI? 您知道在哪里可以找到有关如何使用Apache POI在excel中读写XML映射的文档吗?
To read XML mappings from existing workbooks there are API
methods available. 要从现有工作簿中读取XML映射,可以使用
API
方法。
There is XSSFWorkbook.getMapInfo which gets the MapInfo . 有XSSFWorkbook.getMapInfo获取MapInfo 。 And there is XSSFWorkbook.getCustomXMLMappings which gets a
List
of all the XSSFMap . 还有XSSFWorkbook.getCustomXMLMappings ,它获取所有XSSFMap的
List
。 So reading should not be the problem. 因此阅读应该不是问题。
But until now there is nothing to create new MapInfo
and/or putting additional schemas and/or maps in that MapInfo
. 但是到目前为止,还没有什么可以创建新的
MapInfo
和/或在该MapInfo
放置其他架构和/或地图。 So to create a new workbook having XML mappings using the low level underlaying objects is necessary. 因此,使用底层底层对象创建具有XML映射的新工作簿是必要的。
The following complete example shows this. 以下完整示例显示了这一点。 It provides methods to create a
MapInfo
and add schemas and maps to it. 它提供了创建
MapInfo
以及向其添加架构和映射的方法。 It uses the following class.xsd
file as schema definition: 它使用以下
class.xsd
文件作为架构定义:
<xs:schema attributeFormDefault="unqualified" elementFormDefault="qualified" xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="class">
<xs:complexType>
<xs:sequence>
<xs:element maxOccurs="unbounded" name="student">
<xs:complexType>
<xs:sequence>
<xs:element name="rollno" type="xs:string"/>
<xs:element name="firstname" type="xs:string"/>
<xs:element name="lastname" type="xs:string"/>
<xs:element name="nickname" type="xs:string"/>
<xs:element name="marks" type="xs:string"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
It creates a MapInfo
, adds the schema and the map and creates a XSSFMap
. 它创建一个
MapInfo
,添加架构和地图,并创建一个XSSFMap
。 Then it creates a XSSFTable
in first scheet which refers to the map. 然后,它在引用地图的第一个
XSSFTable
中创建一个XSSFTable
。 So it is possible collecting data in that table to export as XML
then. 因此可以在该表中收集数据,然后将其导出为
XML
。
Code: 码:
import java.io.InputStream;
import java.io.OutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import org.apache.poi.ooxml.POIXMLRelation;
import static org.apache.poi.ooxml.POIXMLTypeLoader.DEFAULT_XML_OPTIONS;
import org.apache.poi.openxml4j.opc.*;
import org.apache.xmlbeans.XmlOptions;
import org.apache.poi.ss.util.AreaReference;
import org.apache.poi.ss.SpreadsheetVersion;
import org.apache.poi.xssf.model.MapInfo;
import org.apache.poi.xssf.usermodel.*;
import org.openxmlformats.schemas.spreadsheetml.x2006.main.*;
import javax.xml.namespace.QName;
import java.util.List;
public class CreateExcelWithXmlMap {
private static CTMap addMap(MapInfo mapInfo, String mapName, String rootElement, String schemaId) {
CTMapInfo cTMapInfo = mapInfo.getCTMapInfo();
long id = 1;
for (CTMap map : cTMapInfo.getMapList()) {
if (map.getID() >= id) id = map.getID() + 1;
}
CTMap map = cTMapInfo.addNewMap();
map.setID(id);
map.setName(mapName);
map.setRootElement(rootElement);
map.setSchemaID(schemaId);
map.setAutoFit(true);
map.setAppend(false);
map.setPreserveSortAFLayout(true);
map.setPreserveFormat(true);
return map;
}
private static int addSchema(MapInfo mapInfo, InputStream schemaIn, String schemaIdPrefix) throws Exception {
CTMapInfo cTMapInfo = mapInfo.getCTMapInfo();
List<CTSchema> schemas = cTMapInfo.getSchemaList();
CTSchema[] schemaArray = new CTSchema[schemas.size()+1];
int i = 0;
int id = 1;
for (CTSchema schema : schemas) {
schemaArray[i++] = schema;
if (schema.getID().startsWith(schemaIdPrefix)) id++;
}
CTSchema schema = CTSchema.Factory.parse(schemaIn);
schema.setID(schemaIdPrefix + id);
schemaArray[i] = schema;
cTMapInfo.setSchemaArray(schemaArray);
return id;
}
private static void writeMapInfoMinContent(PackagePart part) throws Exception {
CTMapInfo cTMapInfo = MapInfoDocument.Factory.newInstance().addNewMapInfo();
cTMapInfo.setSelectionNamespaces("");
XmlOptions xmlOptions = new XmlOptions(DEFAULT_XML_OPTIONS);
xmlOptions.setSaveSyntheticDocumentElement(new QName(CTMapInfo.type.getName().getNamespaceURI(), "MapInfo"));
OutputStream out = part.getOutputStream();
cTMapInfo.save(out, xmlOptions);
out.close();
}
private static MapInfo createMapInfo(XSSFWorkbook workbook) throws Exception {
MapInfo mapInfo = workbook.getMapInfo();
if (mapInfo != null) {
return mapInfo;
} else {
OPCPackage oPCPackage = workbook.getPackage();
PackagePartName partName = PackagingURIHelper.createPartName("/xl/xmlMaps.xml");
PackagePart part = oPCPackage.createPart(partName, "application/xml");
writeMapInfoMinContent(part);
mapInfo = new MapInfo(part);
String rId = workbook.addRelation(null, new XSSFXmlMapsRelation(), mapInfo).getRelationship().getId();
}
return mapInfo;
}
public static void main(String[] args) throws Exception {
String schemaFilePath = "./class.xsd";
String workbookFilePath = "./ExcelWithXMLMap.xlsx";
XSSFWorkbook workbook = new XSSFWorkbook();
MapInfo mapInfo = createMapInfo(workbook);
InputStream schemaIn = new FileInputStream(schemaFilePath);
int schemaId = addSchema(mapInfo, schemaIn, "Schema");
CTMap cTMap = addMap(mapInfo, "class_Map", "class", "Schema"+schemaId);
XSSFMap xssfMap = new XSSFMap(cTMap, mapInfo);
//ToDo: update private Map<Integer, XSSFMap> maps in MapInfo
String[] headers = new String[]{"rollno", "firstname", "lastname", "nickname", "marks"};
//ToDo: get headers from schema
XSSFSheet sheet = workbook.createSheet();
XSSFTable table = sheet.createTable(new AreaReference("A1:E2", SpreadsheetVersion.EXCEL2007));
table.setDisplayName("class");
table.getCTTable().addNewTableStyleInfo();
XSSFTableStyleInfo style = (XSSFTableStyleInfo)table.getStyle();
style.setName("TableStyleMedium2");
style.setShowColumnStripes(false);
style.setShowRowStripes(true);
table.getCTTable().setTableType(STTableType.XML);
int i = 0;
for (CTTableColumn ctTableColumn : table.getCTTable().getTableColumns().getTableColumnList()) {
ctTableColumn.setUniqueName(headers[i]);
CTXmlColumnPr xmlColumnPr = ctTableColumn.addNewXmlColumnPr();
xmlColumnPr.setXmlDataType(STXmlDataType.STRING);
xmlColumnPr.setXpath("/class/student/" + headers[i++]);
xmlColumnPr.setMapId(xssfMap.getCtMap().getID());
}
XSSFRow row = sheet.createRow(0);
int c = 0;
for (String header : headers) {
row.createCell(c++).setCellValue(header);
}
FileOutputStream out = new FileOutputStream(workbookFilePath);
workbook.write(out);
out.close();
workbook.close();
}
//the XSSFRelation for /xl/xmlMaps.xml
private final static class XSSFXmlMapsRelation extends POIXMLRelation {
private XSSFXmlMapsRelation() {
super(
"application/xml",
"http://schemas.openxmlformats.org/officeDocument/2006/relationships/xmlMaps",
"/xl/xmlMaps.xml",
MapInfo.class);
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.