使用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
相关产品推荐
相关产品推荐

