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

求助:如何使用Apache POI读写并填充Word 97-2007 .dot文档表单域?

Apache POI 读写 .dot 文档表单域代码示例

读取 .dot 文档中的表单域

使用HWPFDocument处理二进制格式的Word模板(.dot),通过Fields类遍历并获取所有表单域的信息:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Field;
import org.apache.poi.hwpf.usermodel.Fields;
import org.apache.poi.hwpf.usermodel.Range;

import java.io.FileInputStream;
import java.io.IOException;

public class DotFormReader {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("template.dot");
             HWPFDocument doc = new HWPFDocument(fis)) {
            
            Range range = doc.getRange();
            Fields fields = range.getFields();
            
            // 遍历所有表单域,输出名称、类型和当前值
            for (Field field : fields) {
                String fieldName = field.getFieldName();
                String fieldType = field.getType().name();
                String fieldContent = field.getResultText();
                
                System.out.printf("表单域名称: %s, 类型: %s, 当前值: %s%n", 
                        fieldName, fieldType, fieldContent);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

填充 .dot 文档中的表单域

定位目标表单域后,直接替换其内容。复选框表单域通过设置值为1(选中)或0(未选中)来控制状态:

import org.apache.poi.hwpf.HWPFDocument;
import org.apache.poi.hwpf.usermodel.Field;
import org.apache.poi.hwpf.usermodel.Fields;
import org.apache.poi.hwpf.usermodel.Range;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DotFormFiller {
    public static void main(String[] args) {
        try (FileInputStream fis = new FileInputStream("template.dot");
             HWPFDocument doc = new HWPFDocument(fis);
             FileOutputStream fos = new FileOutputStream("filled_template.doc")) {
            
            Range range = doc.getRange();
            Fields fields = range.getFields();
            
            // 填充文本框表单域
            fillTextField(fields, "txtUserName", "张三");
            fillTextField(fields, "txtEmail", "zhangsan@example.com");
            
            // 填充复选框表单域(1=选中,0=未选中)
            fillCheckBoxField(fields, "chkAgree", 1);
            fillCheckBoxField(fields, "chkSubscribe", 0);
            
            // 保存填充后的文档
            doc.write(fos);
            System.out.println("表单域填充完成");
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
    private static void fillTextField(Fields fields, String fieldName, String value) {
        for (Field field : fields) {
            if (fieldName.equals(field.getFieldName())) {
                field.setResult(value);
                break;
            }
        }
    }
    
    private static void fillCheckBoxField(Fields fields, String fieldName, int value) {
        for (Field field : fields) {
            if (fieldName.equals(field.getFieldName())) {
                field.setResult(String.valueOf(value));
                break;
            }
        }
    }
}

所需依赖

如果使用Maven,需在pom.xml中添加以下依赖:

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>5.2.5</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>5.2.5</version>
</dependency>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:18:08