You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用DOCX4J编辑图表时,如何查找对应嵌入XLSX文件的文件名?

如何用Docx4j匹配Word图表对应的嵌入XLSX文件

我之前处理过类似的需求,用Docx4j可以精准定位每个图表对应的嵌入Excel文件,下面是具体的实现思路和代码示例:

核心逻辑梳理

Word文档里的图表(ChartPart)和嵌入的XLSX文件是通过**关系(Relationship)**绑定的:每个图表会关联一个指向嵌入Excel包的关系,我们只要找到这个关系,就能拿到对应的嵌入文件名。

具体实现步骤

  • 首先加载目标DOCX文档,获取文档的主部件和关系集合
  • 遍历文档中所有的ChartPart对象(每个ChartPart对应一个图表)
  • 对每个ChartPart,查找它的关系部件(RelationshipsPart)中,类型为http://schemas.openxmlformats.org/officeDocument/2006/relationships/package的关系——这个类型专门对应嵌入的Office包文件(也就是我们要找的XLSX)
  • 通过这个关系的getTarget()方法,或者直接获取关联的PackagePart的名称,就能得到嵌入XLSX的文件名

代码示例

import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.ChartPart;
import org.docx4j.openpackaging.parts.Part;
import org.docx4j.openpackaging.parts.relationships.RelationshipsPart;
import org.docx4j.relationships.Relationship;

import java.io.File;
import java.util.List;

public class ChartToExcelMatcher {
    public static void main(String[] args) throws Exception {
        // 加载DOCX文档
        WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage.load(new File("your-document.docx"));
        
        // 获取所有图表部件
        List<ChartPart> chartParts = wordMLPackage.getParts().getPartsOfType(ChartPart.class);
        
        for (ChartPart chartPart : chartParts) {
            // 获取当前图表的关系部件
            RelationshipsPart relsPart = chartPart.getRelationshipsPart();
            if (relsPart == null) {
                System.out.println("当前图表没有关联的嵌入文件");
                continue;
            }
            
            // 遍历所有关系,找到指向嵌入Excel包的关系
            for (Relationship rel : relsPart.getRelationships().getRelationship()) {
                // 匹配嵌入包的关系类型
                if ("http://schemas.openxmlformats.org/officeDocument/2006/relationships/package".equals(rel.getType())) {
                    // 获取关联的PackagePart(也就是嵌入的XLSX文件)
                    Part embeddedPart = relsPart.getPart(rel);
                    // 获取嵌入文件的文件名,路径一般是word/embeddings/xxx.xlsx
                    String embeddedFileName = embeddedPart.getPartName().getName();
                    // 提取纯文件名(去掉路径前缀)
                    String pureFileName = embeddedFileName.substring(embeddedFileName.lastIndexOf("/") + 1);
                    
                    System.out.printf("图表[%s]对应的嵌入Excel文件:%s%n", chartPart.getPartName().getName(), pureFileName);
                }
            }
        }
    }
}

注意事项

  • 有些图表可能使用的是外部链接的Excel文件,而不是嵌入的,这种情况上述代码会跳过,你可以根据需求额外处理外部链接的情况(关系类型会不同)
  • 嵌入的Excel文件名一般是类似Microsoft_Excel_Worksheet1.xlsx的格式,Word会自动生成,但通过上述方法能确保和图表一一对应
  • 确保你的Docx4j版本是最新的(建议用8.x及以上),避免API兼容性问题

内容的提问来源于stack exchange,提问作者HansR

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 16:07:45