求助:如何使用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
相关产品推荐
相关产品推荐

