如何通过 Java 代码在 Word 中创建可填充表单
- 2023-03-21 四川
本文字数:4412 字
阅读完需:约 14 分钟
有时候,我们需要制作一个 Word 模板文档,然后发给用户填写,但我们希望用户只能在指定位置填写内容,其他内容不允许编辑和修改。这时候我们就可以通过表单控件来轻松实现这一功能。本文将为您介绍如何通过 Java 代码,以编程方式在 Word 中创建可填充表单。下面是我整理的步骤及方法,并附上 Java 代码供大家参考。
程序环境:
方法 1:手动引入。将 FreeSpire.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);
}
}
效果图
—本文完—
版权声明: 本文为 InfoQ 作者【在下毛毛雨】的原创文章。
原文链接:【http://xie.infoq.cn/article/614876ec5b287ab7b0abd7f16】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
在下毛毛雨
还未添加个人签名 2022-06-02 加入
还未添加个人简介
评论