如何通過Java程式碼在Word中建立可填充表單

2023-03-21 18:02:48

有時候,我們需要製作一個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);
    }
}

效果圖

—本文完—