1
Каков правильный способ добавления пользовательской части XML в файл XLSX с помощью Apache POI?Добавить пользовательскую часть XML с помощью Apache POI
Я попытался создать часть пакета и добавить отношение к книге, используя приведенный ниже код, но моя добавленная часть добавлена как пустой файл, потому что рабочая книга очищает части пакета в POIXMLDocument#prepareForCommit()
.
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.poi.POIXMLDocumentPart;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.opc.*;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class AddCustomXmlPart {
public static void main(String[] args) {
String outputFileName = System.getProperty("user.home") + "/Documents/test-updated.xlsx";
try {
XSSFWorkbook workbook = new XSSFWorkbook();
workbook.createSheet("Test");
addCustomXmlPart(workbook);
workbook.write(new FileOutputStream(outputFileName));
} catch (IOException e) {
e.printStackTrace();
} catch (InvalidFormatException e) {
e.printStackTrace();
}
}
private static void addCustomXmlPart(XSSFWorkbook workbook) throws IOException, InvalidFormatException {
final OPCPackage opcPackage = workbook.getPackage();
final PackagePartName partName = PackagingURIHelper.createPartName("/customXml/item1.xml");
final PackagePart part = opcPackage.createPart(partName, ContentTypes.PLAIN_OLD_XML);
final OutputStream outputStream = part.getOutputStream();
outputStream.write("<test>A</test>".getBytes());
outputStream.close();
final PackageRelationship packageRelationship = part.addRelationship(
partName, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML);
final POIXMLDocumentPart documentPart = new POIXMLDocumentPart(workbook, part, packageRelationship);
workbook.addRelation(packageRelationship.getId(), documentPart);
}
}
Одно быстрое решение было бы сделать это в два этапа, во-первых, написать книгу, а затем открыть новую OPCPackage + добавить новую часть к нему – Gagravarr
Спасибо для предложения, хотя это не сработало. Я написал файл на диск после создания и добавил пользовательскую часть xml после загрузки в XSSFWorkbook, и у меня получился точно такой же результат - пустой /customXml/item1.xml файл. – dsavickas
Нет, напишите его в XSSFWorkbook, прекратите использовать любые бит XSSF, прочитайте его только с классами OPC, добавьте дополнительную часть, запишите ее с помощью OPCPackage – Gagravarr