通過Java實(shí)現(xiàn)在Word中創(chuàng)建可填充表單
有時(shí)候,我們需要制作一個(gè)Word模板文檔,然后發(fā)給用戶填寫,但我們希望用戶只能在指定位置填寫內(nèi)容,其他內(nèi)容不允許編輯和修改。這時(shí)候我們就可以通過表單控件來輕松實(shí)現(xiàn)這一功能。本文將為您介紹如何通過Java代碼,以編程方式在Word中創(chuàng)建可填充表單。下面是我整理的步驟及方法,并附上Java代碼供大家參考。
程序環(huán)境
方法1:手動(dòng)引入。將 Free Spire.Doc for Java 下載到本地,解壓,找到lib文件夾下的Spire.Doc.jar文件。在IDEA中打開如下界面,將本地路徑中的jar文件引入Java程序

方法2: 如果您想通過 Maven安裝,則可以在 pom.xml 文件中添加以下代碼導(dǎo)入 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中創(chuàng)建可填充表單
用戶打開下面的生成文檔,只能編輯表格中的窗體,不能修改其他內(nèi)容。詳細(xì)步驟如下:
- 創(chuàng)建Document對(duì)象。
- 使用 Document.addSection() 方法添加一個(gè)節(jié)。
- 使用 Section.addTable() 方法添加表格。
- 使用 TableCell.addParagraph() 方法將段落添加到特定的表格單元格。
- 創(chuàng)建 StructureDocumentTagInline 類的實(shí)例,并使用 Paragraph.getChildObjects().add() 方法將其作為子對(duì)象添加到段落中。
- 使用 StructureDocumentTagInline 對(duì)象的 SDTProperties 屬性和 SDTContent 屬性下的方法指定結(jié)構(gòu)化文檔標(biāo)記的屬性和內(nèi)容。結(jié)構(gòu)化文檔標(biāo)簽的類型可通過 SDTProperties.setSDTType() 方法設(shè)置。
- 使用 Document.protect() 方法防止用戶編輯表單域之外的內(nèi)容。
- 使用 Document.saveToFile() 方法保存文檔。
完整代碼
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) {
//創(chuàng)建文檔對(duì)象
Document doc = new Document();
//添加一個(gè)節(jié)
Section section = doc.addSection();
//添加一個(gè)表格
Table table = section.addTable(true);
table.resetCells(7, 2);
//將文本添加到第一列的單元格
Paragraph paragraph = table.getRows().get(0).getCells().get(0).addParagraph();
paragraph.appendText("純文本內(nèi)容控件");
paragraph = table.getRows().get(1).getCells().get(0).addParagraph();
paragraph.appendText("富文本內(nèi)容控件");
paragraph = table.getRows().get(2).getCells().get(0).addParagraph();
paragraph.appendText("圖片內(nèi)容控件");
paragraph = table.getRows().get(3).getCells().get(0).addParagraph();
paragraph.appendText("下拉列表內(nèi)容控件");
paragraph = table.getRows().get(4).getCells().get(0).addParagraph();
paragraph.appendText("復(fù)選框內(nèi)容控件");
paragraph = table.getRows().get(5).getCells().get(0).addParagraph();
paragraph.appendText("組合框內(nèi)容控件");
paragraph = table.getRows().get(6).getCells().get(0).addParagraph();
paragraph.appendText("日期選擇器內(nèi)容控件");
//向單元格添加純文本內(nèi)容控件 (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("單擊或點(diǎn)擊此處輸入文本。");
sdt.getSDTContent().getChildObjects().add(tr);
//向單元格添加富文本內(nèi)容控件 (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("單擊或點(diǎn)擊此處輸入文本。");
sdt.getSDTContent().getChildObjects().add(tr);
//向單元格添加圖片內(nèi)容控件 (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);
//向單元格添加下拉列表內(nèi)容控件(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("選擇一個(gè)項(xiàng)目。", "1"));
sddl.getListItems().add(new SdtListItem("項(xiàng)目2", "2"));
sddl.getListItems().add(new SdtListItem("項(xiàng)目3", "3"));
sddl.getListItems().add(new SdtListItem("項(xiàng)目4", "4"));
sdt.getSDTProperties().setControlProperties(sddl);
tr = new TextRange(doc);
tr.setText(sddl.getListItems().get(0).getDisplayText());
sdt.getSDTContent().getChildObjects().add(tr);
//向單元格添加兩個(gè)復(fù)選框內(nèi)容控件 (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(" 選項(xiàng) 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(" 選項(xiàng) 2");
//將組合框內(nèi)容控件添加到單元格 (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("選擇一個(gè)項(xiàng)目."));
cb.getListItems().add(new SdtListItem("項(xiàng)目 2"));
cb.getListItems().add(new SdtListItem("項(xiàng)目 3"));
sdt.getSDTProperties().setControlProperties(cb);
tr = new TextRange(doc);
tr.setText(cb.getListItems().get(0).getDisplayText());
sdt.getSDTContent().getChildObjects().add(tr);
//將日期選擇器內(nèi)容控件添加到單元格(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");
//保存結(jié)果文檔
doc.saveToFile("WordForm.docx", FileFormat.Docx_2013);
}
}效果圖

到此這篇關(guān)于通過Java實(shí)現(xiàn)在Word中創(chuàng)建可填充表單的文章就介紹到這了,更多相關(guān)Java Word創(chuàng)建可填充表單內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解SpringBoot如何自定義一個(gè)Starter
小伙伴們?cè)?jīng)可能都經(jīng)歷過整天寫著CURD的業(yè)務(wù),都沒寫過一些組件相關(guān)的東西,這篇文章記錄一下SpringBoot如何自定義一個(gè)Starter。原理和理論就不用多說了,可以在網(wǎng)上找到很多關(guān)于該方面的資料,這里主要分享如何自定義2022-11-11
使用@ConditionalOnProperty控制是否加載的操作
這篇文章主要介紹了使用@ConditionalOnProperty控制是否加載的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-06-06
詳解Java對(duì)象創(chuàng)建的過程及內(nèi)存布局
今天給大家?guī)淼奈恼率荍ava對(duì)象創(chuàng)建的過程及內(nèi)存布局,文中有非常詳細(xì)的圖文示例及介紹,需要的朋友可以參考下2021-06-06
使用spring整合Quartz實(shí)現(xiàn)—定時(shí)器功能
這篇文章主要介紹了使用spring整合Quartz實(shí)現(xiàn)—定時(shí)器功能,不基于特定的基類的方法,需要的朋友可以參考下2018-04-04
Spring中@Transactional(rollbackFor=Exception.class)屬性用法介紹
這篇文章介紹了Spring中@Transactional(rollbackFor=Exception.class)屬性的用法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12

