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

如何用Apache POI生成带删除痕迹追踪的Word文档?

正确实现Apache POI生成Word删除追踪标记的方法

你的代码核心问题有两个:一是日期类型不匹配,OOXML规范要求追踪更改的日期必须是XMLGregorianCalendar格式,而你直接传入了java.util.Calendar,导致生成的XML日期格式无效,Word无法解析;二是缺少对文本Run的必要属性初始化,导致文档结构不完整。

以下是修正后的完整实现:

import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTDel;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import java.util.Calendar;
import java.util.GregorianCalendar;

static XWPFRun createDelRun(XWPFParagraph paragraph, String author, Calendar date) throws DatatypeConfigurationException {
    // 将java.util.Calendar转换为OOXML要求的XMLGregorianCalendar格式
    GregorianCalendar gregorianCalendar = (date instanceof GregorianCalendar) 
        ? (GregorianCalendar) date 
        : new GregorianCalendar(date.getTimeZone());
    XMLGregorianCalendar xmlDate = DatatypeFactory.newInstance().newXMLGregorianCalendar(gregorianCalendar);

    // 创建删除追踪元素并设置作者、日期属性
    CTDel del = paragraph.getCTP().addNewDel();
    del.setAuthor(author);
    del.setDate(xmlDate);

    // 在删除元素内创建文本Run,并初始化格式属性节点
    var ctr = del.addNewR();
    ctr.addNewRPr();

    return new XWPFRun(ctr, paragraph);
}

关键修正说明:

  • 日期格式转换:通过DatatypeFactory将普通Calendar转为符合docx schema要求的XMLGregorianCalendar,避免Word因日期格式错误判定文档损坏。
  • Run属性初始化:新增ctr.addNewRPr(),确保文本Run拥有必要的格式属性节点,符合Word的文档结构规范。
  • 结构逻辑验证:删除的文本Run必须嵌套在<w:del>元素内,这是docx追踪删除标记的标准结构,你的代码原本的结构逻辑正确,但缺失上述两个关键步骤导致报错。

使用示例:

// 假设已有XWPFParagraph对象paragraph
XWPFRun delRun = createDelRun(paragraph, "Henry", Calendar.getInstance());
delRun.setText("这段文本会被标记为删除追踪");

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 16:40:04