如何通过Java代码在Word中创建可填充表单
有时候,我们需要制作一个Word模板文档,然后发给用户填写,但我们希望用户只能在指定位置填写内容,其他内容不允许编辑和修改。这时候我们就可以通过表单控件来轻松实现这一功能。本文将为您介绍如何通过Java代码,以编程方式在Word中创建可填充表单。下面是我整理的步骤及方法,并附上Java代码供大家参考。
程序环境:
方法1:手动引入。将 Free Spire.Doc for Java 下载到本地,解压,找到lib文件夹下的Spire.Doc.jar文件。在IDEA中打开如下界面,将本地路径中的jar文件引入Java程序

方法2: 如果您想通过 Maven安装,则可以在 pom.xml 文件中添加以下代码导入 JAR 文件。
<repositories>
<repository>
<id>com.e-iceblue</id>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.doc.free</artifactId>
<version>5.2.0</version>
</dependency>
</dependencies>
在Word中创建可填充表单
用户打开下面的生成文档,只能编辑表格中的窗体,不能修改其他内容。详细步骤如下:
- 创建Document对象。
- 使用 Document.addSection() 方法添加一个节。
- 使用 Section.addTable() 方法添加表格。
- 使用 TableCell.addParagraph() 方法将段落添加到特定的表格单元格。
- 创建 StructureDocumentTagInline 类的实例,并使用 Paragraph.getChildObjects().add() 方法将其作为子对象添加到段落中。
- 使用 StructureDocumentTagInline 对象的 SDTProperties 属性和 SDTContent 属性下的方法指定结构化文档标记的属性和内容。结构化文档标签的类型可通过 SDTProperties.setSDTType() 方法设置。
- 使用 Document.protect() 方法防止用户编辑表单域之外的内容。
- 使用 Document.saveToFile() 方法保存文档。
完整代码
Java
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.DocPicture;
import com.spire.doc.fields.TextRange; import java.util.Date; public class CreateFillableForm { public static void main(String[] args) { //创建文档对象
Document doc = new Document(); //添加一个节
Section section = doc.addSection(); //添加一个表格
Table table = section.addTable(true);
table.resetCells(7, 2); //将文本添加到第一列的单元格
Paragraph paragraph = table.getRows().get(0).getCells().get(0).addParagraph();
paragraph.appendText("纯文本内容控件");
paragraph = table.getRows().get(1).getCells().get(0).addParagraph();
paragraph.appendText("富文本内容控件");
paragraph = table.getRows().get(2).getCells().get(0).addParagraph();
paragraph.appendText("图片内容控件");
paragraph = table.getRows().get(3).getCells().get(0).addParagraph();
paragraph.appendText("下拉列表内容控件");
paragraph = table.getRows().get(4).getCells().get(0).addParagraph();
paragraph.appendText("复选框内容控件");
paragraph = table.getRows().get(5).getCells().get(0).addParagraph();
paragraph.appendText("组合框内容控件");
paragraph = table.getRows().get(6).getCells().get(0).addParagraph();
paragraph.appendText("日期选择器内容控件"); //向单元格添加纯文本内容控件 (0,1)
paragraph = table.getRows().get(0).getCells().get(1).addParagraph();
StructureDocumentTagInline sdt = new StructureDocumentTagInline(doc);
paragraph.getChildObjects().add(sdt);
sdt.getSDTProperties().setSDTType(SdtType.Text);
sdt.getSDTProperties().setAlias("纯文本");
sdt.getSDTProperties().setTag("纯文本");
sdt.getSDTProperties().isShowingPlaceHolder(true);
SdtText text = new SdtText(true);
text.isMultiline(false);
sdt.getSDTProperties().setControlProperties(text);
TextRange tr = new TextRange(doc);
tr.setText("单击或点击此处输入文本。");
sdt.getSDTContent().getChildObjects().add(tr); //向单元格添加富文本内容控件 (1,1)
paragraph = table.getRows().get(1).getCells().get(1).addParagraph();
sdt = new StructureDocumentTagInline(doc);
paragraph.getChildObjects().add(sdt);
sdt.getSDTProperties().setSDTType(SdtType.Rich_Text);
sdt.getSDTProperties().setAlias("富文本");
sdt.getSDTProperties().setTag("富文本");
sdt.getSDTProperties().isShowingPlaceHolder(true);
text = new SdtText(true);
text.isMultiline(false);
sdt.getSDTProperties().setControlProperties(text);
tr = new TextRange(doc);
tr.setText("单击或点击此处输入文本。");
sdt.getSDTContent().getChildObjects().add(tr); //向单元格添加图片内容控件 (2,1)
paragraph = table.getRows().get(2).getCells().get(1).addParagraph();
sdt = new StructureDocumentTagInline(doc);
paragraph.getChildObjects().add(sdt);
sdt.getSDTProperties().setSDTType(SdtType.Picture);
sdt.getSDTProperties().setAlias("图片");
sdt.getSDTProperties().setTag("图片");
SdtPicture sdtPicture = new SdtPicture();
sdt.getSDTProperties().setControlProperties(sdtPicture);
DocPicture pic = new DocPicture(doc);
pic.loadImage("图片2.jpg");
sdt.getSDTContent().getChildObjects().add(pic); //向单元格添加下拉列表内容控件(3,1)
paragraph = table.getRows().get(3).getCells().get(1).addParagraph();
sdt = new StructureDocumentTagInline(doc);
sdt.getSDTProperties().setSDTType(SdtType.Drop_Down_List);
sdt.getSDTProperties().setAlias("下拉列表");
sdt.getSDTProperties().setTag("下拉列表");
paragraph.getChildObjects().add(sdt);
SdtDropDownList sddl = new SdtDropDownList();
sddl.getListItems().add(new SdtListItem("选择一个项目。", "1"));
sddl.getListItems().add(new SdtListItem("项目2", "2"));
sddl.getListItems().add(new SdtListItem("项目3", "3"));
sddl.getListItems().add(new SdtListItem("项目4", "4"));
sdt.getSDTProperties().setControlProperties(sddl);
tr = new TextRange(doc);
tr.setText(sddl.getListItems().get(0).getDisplayText());
sdt.getSDTContent().getChildObjects().add(tr); //向单元格添加两个复选框内容控件 (4,1)
paragraph = table.getRows().get(4).getCells().get(1).addParagraph();
sdt = new StructureDocumentTagInline(doc);
paragraph.getChildObjects().add(sdt);
sdt.getSDTProperties().setSDTType(SdtType.Check_Box);
SdtCheckBox scb = new SdtCheckBox();
sdt.getSDTProperties().setControlProperties(scb);
tr = new TextRange(doc);
sdt.getChildObjects().add(tr);
scb.setChecked(false);
paragraph.appendText(" 选项 1"); paragraph = table.getRows().get(4).getCells().get(1).addParagraph();
sdt = new StructureDocumentTagInline(doc);
paragraph.getChildObjects().add(sdt);
sdt.getSDTProperties().setSDTType(SdtType.Check_Box);
scb = new SdtCheckBox();
sdt.getSDTProperties().setControlProperties(scb);
tr = new TextRange(doc);
sdt.getChildObjects().add(tr);
scb.setChecked(false);
paragraph.appendText(" 选项 2"); //将组合框内容控件添加到单元格 (5,1)
paragraph = table.getRows().get(5).getCells().get(1).addParagraph();
sdt = new StructureDocumentTagInline(doc);
paragraph.getChildObjects().add(sdt);
sdt.getSDTProperties().setSDTType(SdtType.Combo_Box);
sdt.getSDTProperties().setAlias("组合框");
sdt.getSDTProperties().setTag("组合框");
SdtComboBox cb = new SdtComboBox();
cb.getListItems().add(new SdtListItem("选择一个项目."));
cb.getListItems().add(new SdtListItem("项目 2"));
cb.getListItems().add(new SdtListItem("项目 3"));
sdt.getSDTProperties().setControlProperties(cb);
tr = new TextRange(doc);
tr.setText(cb.getListItems().get(0).getDisplayText());
sdt.getSDTContent().getChildObjects().add(tr); //将日期选择器内容控件添加到单元格(6,1)
paragraph = table.getRows().get(6).getCells().get(1).addParagraph();
sdt = new StructureDocumentTagInline(doc);
paragraph.getChildObjects().add(sdt);
sdt.getSDTProperties().setSDTType(SdtType.Date_Picker);
sdt.getSDTProperties().setAlias("日期选择器");
sdt.getSDTProperties().setTag("日期选择器");
SdtDate date = new SdtDate();
date.setCalendarType(CalendarType.Default);
date.setDateFormat("yyyy.MM.dd");
date.setFullDate(new Date());
sdt.getSDTProperties().setControlProperties(date);
tr = new TextRange(doc);
tr.setText("单击或轻按以输入日期。");
sdt.getSDTContent().getChildObjects().add(tr); //仅允许用户编辑表单域
doc.protect(ProtectionType.Allow_Only_Form_Fields, "permission-psd"); //保存结果文档
doc.saveToFile("WordForm.docx", FileFormat.Docx_2013);
}
}
效果图

—本文完—
如何通过Java代码在Word中创建可填充表单的更多相关文章
- Java 在Word中创建多级项目符号列表和编号列表
本文分享通过Java程序代码在Word中创建多级项目符号列表和编号列表的方法.程序运行环境如下: IntelliJ IDEA 2018(JDK 1.8.0) Word 2013 Word Jar包:F ...
- 如何通过Java代码向Word文档添加文档属性
Word文档属性包括常规.摘要.统计.内容.自定义.其中摘要包括标题.主题.作者.经理.单位.类别.关键词.备注等项目.属性相当于文档的名片,可以添加你想要的注释.说明等.还可以标注版权. 今天就为大 ...
- word中创建文本框
word中创建文本框 在插入中点击"文本框"选项卡,例如以下图所看到的: 手工加入自己想要的文本框格式,然后选择所创建的文本框,在工具栏处会发现多了一 ...
- yii2 创建ActiveForm(表单)
表单的生成表单中的方法 ActiveForm::begin()方法 ActiveForm::end()方法 getClientOptions()方法 其它方法:errorSum ...
- Python Django CMDB项目实战之-3创建form表单,并在前端页面上展示
基于之前的项目代码 Python Django CMDB项目实战之-1如何开启一个Django-并设置base页.index页.文章页面 Python Django CMDB项目实战之-2创建APP. ...
- 在Tomcat中采用基于表单的安全验证
.概述 (1)基于表单的验证 基于From的安全认证可以通过TomcatServer对Form表单中所提供的数据进行验证,基于表单的验证使系统开发者可以自定义用户的登陆页面和报错页面.这种验证方法 ...
- flask 利用flask_wtf扩展 创建web表单
在Flask中,为了处理web表单,我们一般使用Flask-WTF扩展,它封装了WTForms,并且它有验证表单数据的功能 创建语句格式: startTime = DateTimeField('计划开 ...
- Javascript中的Form表单知识点总结
Javascript中的Form表单知识点总结 在HTML中,表单是由form元素来表示的,但是在javascript中,表单则由HTMLFormElement类型,此元素继承了HTMLElement ...
- 关于创建Django表单Forms继承BaseForm的问题
在创建Django表单时,因为需要验证用户输入的验证码是否正确,因此需要在session里提取当前验证码的值和POST提交过来的值进行比对,如图: form.py from django import ...
- .net之工作流工程展示及代码分享(一)工作流表单
Workflow表单的作用是能够在客户端进行表单设计,然后在流程中动态开放哪些输入框可以供用户填写. 在这里我扩展了一个常用的WebEditor工具——KindEditor,能够插入自定义的html符 ...
随机推荐
- 解决vue 移动端项目“切换页面,页面置顶”后报错为:"TypeError: Cannot set property 'scrollTop' of null"
参考原代码链接:https://www.cnblogs.com/wayneliu007/p/11932204.html 报错截图: 解决方法: 导入的getScrollParent为真返回的null ...
- Leetcode本地阅读器开发--01界面设计一
返回项目声明及目录:Leetcode本地阅读器开发--总声明 整个界面设计如下:后续可能会不断优化和加入新功能 1.启动后界面 2.进行具体题目搜索 3.进行分类搜索 本节主要介绍程序界面的绘制: 1 ...
- Ubuntu22.04 KubeSphere 安装K8S集群
Ubuntu22.04 KubeSphere 安装K8S集群_Ri0n的博客-CSDN博客 一.系统环境系统:Ubuntu 22.04集群IP分布hostname 角色 IP地址master mast ...
- 动手搭建ssm框架
现在很多公司用的开源框架很多都是ssm框架的一个结构,这里我自己试着自己搭一个简单的框架,大家共同学习.下面一起跟着我搭建吧,本人菜鸟,有任何不对的地方有望指出. 框架结构:spring(4.3.9. ...
- Python生态工具
Python内置小工具 1秒钟启动一个下载服务器 在实际工作中,时常会有这样的一个需求:将文件传给其他同事.将文件传给同事本身并不是一个很繁琐的工作,现在的聊天工具一般都支持文件传输.但是,如果需要传 ...
- Python数据分析第七周作业-MySQL的安装及应用
项目 MySQL 博客名称 2003031126-石升福-Python数据分析第七周作业 班级链接 20级数据班(本) 作业链接 第七周作业 要求 每道题要有题目,代码(使用插入代码,不会插入代码的自 ...
- Android 自定义SeekBar (一)
一.前言 巩固自定义view基础用,本次尝试构建一个拖动条组件.代码参考于 https://github.com/woxingxiao/BubbleSeekBar ,精简其中高度可重用的部分,仅保留基 ...
- 关于QT编译程序找不到MSVCRT.DLL和其他动态链接库的解决办法
先上图(一大堆无法解析的外部符号): 解决办法分两个步骤: 1.系统环境变量设置,把这些dll文件所在目录加入到PATH中.比如C:\Windows\SysWOW64, C:\Windows\Syst ...
- CH573 CH582 CH579蓝牙从机(peripheral)例程讲解二(广播内容修改)
在上一篇外设例程讲解中讲述了蓝牙从机的收发接口,这样可以快速的上手,那么接下来就讲解另一个重要设置,从机的广播. 在peripheral例程中,一直是以50ms的周期进行广播,使用手机软件扫描可以获取 ...
- ERROR 1067 (42000): Invalid default value for 'xxx字段'
报错版本:mysql-5.7.35 1.报错完整提示信息: ERROR 1067 (42000): Invalid default value for 'LOCK_TIME_' 2.原因: 使用sou ...