当前位置: 首页 > 知识库问答 >
问题:

使用Apache POI添加自定义XML部件

魏翔
2023-03-14

使用Apache POI向XLSX文件添加自定义XML部分的正确方法是什么?

我尝试使用下面的代码创建包部分并将关系添加到工作簿,但由于工作簿清除了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);
    }
}

共有1个答案

东郭存
2023-03-14

正如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);
    }

}
 类似资料:
  • 我正在尝试用Y轴(垂直轴)做TimeSeriesChart,它有自定义标签。 我可以验证字符串('最终列表 请参阅这段代码。在初始化“最终标签”的地方,我有两行代码定义基本数字格式规范(BasicNumericTickFormatterSpec)。 第一行是我想做的。我想使用

  • 用户可以将Excel文档保存为. xls或xml-table。结果是一个具有固定结构的xml-file,Excel可以用它纠正工作。 可以用java中的ApachePOI打开这种类型的excel文件吗? 事先谢谢你,安德烈。

  • 虽然Blockly定义了许多标准块,但大多数应用程序需要定义和实现至少一些域相关块。 块由三个部分组成: 块定义对象:定义块的外观和行为,包括文本,颜色,字段和连接。 工具箱参考:工具箱XML中对块类型的引用,因此用户可以将其添加到工作区。 生成器函数:生成此块的代码字符串。它是用JavaScript编写的,即使目标语言不是JavaScript,甚至是用于Android端的Blockly。 块定义

  • 问题内容: 我已经构建了自己的自定义react-bootstrap Popover组件: 该组件的呈现方式如下: 现在,我想向组件中添加自定义道具,例如:我的文字,并使用新道具在弹出框中设置一些内容,例如- 但随后我在浏览器中收到此警告: 警告:标签上的未知道具。从元素中删除这些道具。 现在,我想我可以删除零件并逐个插入所有原始道具,而无需自定义道具,但是这样我就失去了“淡入淡出”效果,这也是处理

  • 应用可以通过manage.py注册它们自己的动作。例如,你可能想为你正在发布的Django应用添加一个manage.py动作。在本页文档中,我们将为教程中的 polls应用构建一个自定义的 closepoll命令。 要做到这点,只需向该应用添加一个management/commands目录。Django将为该目录中名字没有以下划线开始的每个Python模块注册一个manage.py命令。例如: p

  • 11.6.添加自定义权限 我们曾在第六章的更新Manifest文件,获取Internet权限一节讨论过,应用程序若要访问系统的某项功能(比如连接网络、发短信、打电话、读取通讯录、拍照等等),那就必须获取相应的权限。比如现在的Yamba,就需要连接网络、监视系统启动、监视网络连接情况这三项权限。它们都在Manifest文件中<user-permission>部分给出了声明,至于能否得到这些权限,则由