2015-09-14 2 views
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); 
    } 
} 
+0

Одно быстрое решение было бы сделать это в два этапа, во-первых, написать книгу, а затем открыть новую OPCPackage + добавить новую часть к нему – Gagravarr

+0

Спасибо для предложения, хотя это не сработало. Я написал файл на диск после создания и добавил пользовательскую часть xml после загрузки в XSSFWorkbook, и у меня получился точно такой же результат - пустой /customXml/item1.xml файл. – dsavickas

+1

Нет, напишите его в XSSFWorkbook, прекратите использовать любые бит XSSF, прочитайте его только с классами OPC, добавьте дополнительную часть, запишите ее с помощью OPCPackage – Gagravarr

ответ

3

Как было предложено Gagravarr:

import java.io.*; 

import org.apache.poi.openxml4j.exceptions.InvalidFormatException; 
import org.apache.poi.openxml4j.opc.*; 
import org.apache.poi.xssf.usermodel.XSSFWorkbook; 

public class AddCustomXmlUsingOpc { 
    public static final String PARENT_PATH = System.getProperty("user.home") + "/Documents/"; 
    public static void main(String[] args) { 

     String outputFileName1 = PARENT_PATH + "01.xlsx"; 
     String outputFileName2 = PARENT_PATH + "02.xlsx"; 

     try { 
      XSSFWorkbook workbook = new XSSFWorkbook(); 
      workbook.createSheet("Test"); 
      workbook.write(new FileOutputStream(outputFileName1)); 

      final OPCPackage opcPackage = OPCPackage.open(new File(outputFileName1)); 
      addCustomXmlPart(opcPackage); 
      opcPackage.save(new File(outputFileName2)); 

     } catch (IOException e) { 
      e.printStackTrace(); 
     } catch (InvalidFormatException e) { 
      e.printStackTrace(); 
     } 
    } 

    private static void addCustomXmlPart(OPCPackage opcPackage) throws IOException, InvalidFormatException { 
     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(); 

     part.addRelationship(partName, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML); 

     final PackagePartName workbookName = PackagingURIHelper.createPartName("/xl/workbook.xml"); 
     final PackagePart workbookPart = opcPackage.getPart(workbookName); 
     workbookPart.addRelationship(partName, TargetMode.INTERNAL, PackageRelationshipTypes.CUSTOM_XML); 
    } 

} 
Смежные вопросы