C# 创建可填充Word表单

背景介绍

有时候,我们需要制作一个Word模板文档,然后发给用户填写,但我们希望用户只能在指定位置填写内容,其他内容不允许编辑和修改。这时候我们就可以通过表单控件来轻松实现这一功能。
本文将介绍如何使用C#在Word文档中创建可填充的Word表单。

使用工具

? Visual Studio
? Spire.Doc for .NET组件

在添加以下代码前,需要下载Spire.Doc组件,并从安装路径下的bin文件夹中引用Spire.Doc.dll到程序中。

代码

在Word中,表单控件主要分为两种:

? 旧式窗体域
? 内容控件 (Word 2010及以后版本)

下面看看如何使用Spire.Doc添加旧式窗体域和内容控件到Word模板文档。

添加旧式窗体域

Word 2007及以前的版本中是旧式窗体域。旧式窗体域分为:文本型窗体域、复选框型窗体域和下拉型窗体域。

下面的代码创建了一个Word文档,然后添加了一个表格,并给表格添加文本型、复选框型和下拉型窗体域,最后保护Word文档。

{
//创建Document实例
Document doc = new Document();
//添加一个section
Section section = doc.AddSection();

//标题
Paragraph title = section.AddParagraph();
TextRange titleText = title.AppendText("职位申请表");
titleText.CharacterFormat.FontName = "宋体";
titleText.CharacterFormat.FontSize = 16f;
title.Format.HorizontalAlignment = HorizontalAlignment.Center;

//添加一个7行2列的表格
Table table = section.AddTable(true);
table.ResetCells(7, 2);

//合并首行的单元格
table.ApplyHorizontalMerge(0, 0, 1);

//设置表头
TableRow headerRow = table.Rows[0];
headerRow.IsHeader = true;
headerRow.RowFormat.BackColor = Color.FromArgb(0x00, 0x71, 0xb6);
headerRow.Cells[0].CellFormat.VerticalAlignment = VerticalAlignment.Middle;
Paragraph headerParagraph = headerRow.Cells[0].AddParagraph();
TextRange headerText = headerParagraph.AppendText("第一部分、个人信息");
headerText.CharacterFormat.Bold = true;

//添加段落到单元格[1,0]
Paragraph paragraph = table.Rows[1].Cells[0].AddParagraph();
TextRange textRange = paragraph.AppendText("姓名");

//添加文本型窗体到单元格[1,1]
paragraph = table.Rows[1].Cells[1].AddParagraph();
AddTextFormField(paragraph, "Name");

//添加段落到单元格[2,0]
paragraph = table.Rows[2].Cells[0].AddParagraph();
textRange = paragraph.AppendText("年龄");

//添加文本型窗体到单元格[2,1]
paragraph = table.Rows[2].Cells[1].AddParagraph();
AddTextFormField(paragraph, "Age");

//添加段落到单元格[3,0]
paragraph = table.Rows[3].Cells[0].AddParagraph();
textRange = paragraph.AppendText("婚否");

//添加复选框型窗体到单元格[3,1]
paragraph = table.Rows[3].Cells[1].AddParagraph();
AddCheckBoxFormField(paragraph, "Married");

//添加段落到单元格[4,0]
paragraph = table.Rows[4].Cells[0].AddParagraph();
textRange = paragraph.AppendText("专业");

//添加下拉型窗体到单元格[4,1]
paragraph = table.Rows[4].Cells[1].AddParagraph();
AddDropDownFormField(paragraph, "Major");

//添加段落到单元格[5,0]
paragraph = table.Rows[5].Cells[0].AddParagraph();
textRange = paragraph.AppendText("申请职位");

//添加文本型窗体到单元格[5,1]
paragraph = table.Rows[5].Cells[1].AddParagraph();
AddTextFormField(paragraph, "Position");

//添加段落到单元格[6,0]
paragraph = table.Rows[6].Cells[0].AddParagraph();
textRange = paragraph.AppendText("申请理由");

//添加文本型窗体到单元格[6,1]
paragraph = table.Rows[6].Cells[1].AddParagraph();
AddTextFormField(paragraph, "Reason");

//创建段落样式
ParagraphStyle style = new ParagraphStyle(doc);
style.Name = "style";
style.CharacterFormat.FontName = "宋体";
style.CharacterFormat.FontSize = 11f;
doc.Styles.Add(style);

for (int i = 0; i < table.Rows.Count; i++)
{
    //设置表格行高
    table.Rows[i].Height = 20f;
    for (int j = 0; j < table.Rows[i].Cells.Count; j++)
    {
        //设置单元格文本垂直对齐方式
        table[i, j].CellFormat.VerticalAlignment = VerticalAlignment.Middle;
        //设置单元格的宽度,即列宽
        table[i, j].Width = 200f;
        foreach (Paragraph para in table[i, j].Paragraphs)
        {
            //应用段落样式
            para.ApplyStyle(style.Name);
        }
    }
}

//设置表格居中排列
table.TableFormat.HorizontalAlignment = RowAlignment.Center;

//保护文档,并设置模式为仅允许编辑表单域
doc.Protect(ProtectionType.AllowOnlyFormFields, "123");

//保存
doc.SaveToFile("AddFormFields.docx", FileFormat.Docx2013);
}

//添加文本型窗体、复选框型窗体和下拉型窗体的方法如下:
//添加文本型窗体
static void AddTextFormField(Paragraph paragraph, string fieldName)
{
    TextFormField textForm = paragraph.AppendField(fieldName, FieldType.FieldFormTextInput) as TextFormField;
    textForm.DefaultText = "";
    textForm.Text = "";
}

//添加复选框型窗体
static void AddCheckBoxFormField(Paragraph paragraph, string fieldName)
{
    CheckBoxFormField checkBoxForm = paragraph.AppendField(fieldName,    FieldType.FieldFormCheckBox) as CheckBoxFormField;
    checkBoxForm.SizeType = CheckBoxSizeType.Exactly;
    checkBoxForm.CheckBoxSize = 8;
}

//添加下拉型窗体
static void AddDropDownFormField(Paragraph paragraph, string fieldName)
{
    DropDownFormField dropDownForm = paragraph.AppendField(fieldName, FieldType.FieldFormDropDown) as DropDownFormField ;
    dropDownForm.DropDownItems.Add("选择一个专业");
    dropDownForm.DropDownItems.Add("计算机科学与技术");
    dropDownForm.DropDownItems.Add("软件工程");
    dropDownForm.DropDownItems.Add("信息管理");
    dropDownForm.DropDownItems.Add("电子商务");
}
}
}

用户打开下面的生成文档,只能编辑表格中的窗体,不能修改其他内容:

添加内容控件

Word 2010及以后的版本中添加了内容控件。下面就介绍如何使用Spire.Doc添加内容控件到Word文档。

Spire.Doc支持多种内容控件类型,可在枚举SdtType中查看,如下图所示:

//创建Document实例
Document document = new Document();
//添加一个section
Section section = document.AddSection();

//添加段落
Paragraph paragraph = section.AddParagraph();
paragraph.AppendText("姓名: ");

//添加纯文本内容控件
StructureDocumentTagInline sdt = new StructureDocumentTagInline(document);
paragraph.ChildObjects.Add(sdt);
sdt.SDTProperties.SDTType = SdtType.Text;
sdt.SDTProperties.Alias = "纯文本";
//设置展示文本
SdtText text = new SdtText(false);
text.IsMultiline = true;
sdt.SDTProperties.ControlProperties = text;
TextRange rt = new TextRange(document);
rt.Text = "姓名";
sdt.SDTContent.ChildObjects.Add(rt);

paragraph.AppendBreak(BreakType.LineBreak);

//添加段落
paragraph = section.AddParagraph();
paragraph.AppendText("性别: ");

//添加下拉列表内容控件
sdt = new StructureDocumentTagInline(document);
paragraph.ChildObjects.Add(sdt);
sdt.SDTProperties.SDTType = SdtType.DropDownList;
sdt.SDTProperties.Alias = "下拉列表";
//添加下拉选项
SdtDropDownList sddl = new SdtDropDownList();
sddl.ListItems.Add(new SdtListItem("男", "1"));
sddl.ListItems.Add(new SdtListItem("女", "2"));
sdt.SDTProperties.ControlProperties = sddl;
//设置控件展示的初始选项
rt = new TextRange(document);
rt.Text = sddl.ListItems[1].DisplayText;
sdt.SDTContent.ChildObjects.Add(rt);

paragraph.AppendBreak(BreakType.LineBreak);

//添加段落
paragraph = section.AddParagraph();
paragraph.AppendText("出生日期: ");

//添加日期选取器内容控件
sdt = new StructureDocumentTagInline(document);
paragraph.ChildObjects.Add(sdt);
sdt.SDTProperties.SDTType = SdtType.DatePicker;
sdt.SDTProperties.Alias = "日期选取器";
//设置日历格式
SdtDate date = new SdtDate();
date.CalendarType = CalendarType.Default;
date.DateFormat = "yyyy.MM.dd";
date.FullDate = DateTime.Now;
sdt.SDTProperties.ControlProperties = date;
//设置展示日期
rt = new TextRange(document);
rt.Text = "1991.02.08";
sdt.SDTContent.ChildObjects.Add(rt);

paragraph.AppendBreak(BreakType.LineBreak);

//添加段落
paragraph = section.AddParagraph();
paragraph.AppendText("国籍: ");

//添加组合框内容控件
sdt = new StructureDocumentTagInline(document);
paragraph.ChildObjects.Add(sdt);
sdt.SDTProperties.SDTType = SdtType.ComboBox;
sdt.SDTProperties.Alias = "组合框";
//添加选项
SdtComboBox cb = new SdtComboBox();
cb.ListItems.Add(new SdtListItem("中国", "1"));
cb.ListItems.Add(new SdtListItem("英国", "2"));
cb.ListItems.Add(new SdtListItem("意大利", "3"));
sdt.SDTProperties.ControlProperties = cb;
//设置展示选项
rt = new TextRange(document);
rt.Text = cb.ListItems[0].DisplayText;
sdt.SDTContent.ChildObjects.Add(rt);

paragraph.AppendBreak(BreakType.LineBreak);

//创建段落样式
ParagraphStyle style = new ParagraphStyle(document);
style.Name = "style";
style.CharacterFormat.FontName = "宋?体??";
style.CharacterFormat.FontSize = 11f;
document.Styles.Add(style);

//应用段落样式
foreach(Paragraph para in section.Paragraphs)
{
para.ApplyStyle(style.Name);
}

//保护文档,仅允许修改表单
document.Protect(ProtectionType.AllowOnlyFormFields, "123");

//保存
document.SaveToFile("ContentControls.docx", FileFormat.Docx2013);

生成文档:

原文地址:http://blog.51cto.com/13688031/2310656

时间: 2024-10-16 13:29:05

C# 创建可填充Word表单的相关文章

JavaScript 创建一个 form 表单并提交

<!DOCTYPE HTML> <html lang="en-US"> <head> <meta charset="UTF-8"> <title></title> </head> <body> <input onclick="MakeForm()" type="button" class="btn grey"

用javascript动态创建并提交表单form,表格table

<script> //helper function to create the formfunction getNewSubmitForm(){ var submitForm = document.createElement("FORM"); document.body.appendChild(submitForm); submitForm.method = "POST"; return submitForm;} //helper function t

【转】Java创建填充pdf表单域

表单域,可以按用途分为多种不同的类型,常见的有文本框.多行文本框.密码框.隐藏域.复选框.单选框和下拉选择框等,目的是用于采集用户的输入或选择的数据.下面的示例中,将分享通过Java编程在PDF中添加以及填充表单域的方法.这里填充表单域可分为2种情况,一种是在创建表单域时填充,一种是加载已经创建好表单域的文档进行填充.此外,对于已经创建表单域并填写好的文档,也可以设置只读,防止修改.编辑. 要点概括: 1.创建表单域 2.填充表单域 3.设置表单域只读 工具: Free Spire.PDF fo

创建通用的表单校验逻辑库

表单校验一直是web开发中最基础,也是最不好做的一个环节.说是基础,相信多少从事web开发的人第一件事就是学习如果基于js.jQuery实现表单验证工作.在10年前,甚至是5年前,JavaScript还是被多数工程师轻视的一门语言,那时候很多人认为JavaScript充其量也就能完成一部分表单校验的工作.由此可知表单校验是多么基础的一件事情:说它不好做,是因为表单校验往往工作量极大,可以说是一个没太大技术含量但是很耗费体力的活,而且在一些对交互友好性要求较高的项目中,表单校验就更加费事了. 于是

创建简单的表单

上周跟着老师的讲解以及自己的学习后,写了一个简单的创建html表单的代码: <!DOCTYPE html><html><head> <meta charset="utf-8"> <title>创建表单</title></head> <body> <form action="" method=""> <h2>初学创建表单</

activiti自己定义流程之整合(二):使用angular js整合ueditor创建表单

基础环境搭建完成,接下来就该正式着手代码编写了,在说代码之前.我认为有必要先说明一下activit自己定义流程的操作. 抛开自己定义的表单不谈.通过之前的了解,我们知道一个新的流程開始.是在启动流程实例(processIntence)的时候,而流程实例依赖于流程定义(processDefinition).流程定义又依赖于流程模型(model). 我们用到的自己定义表单须要在创建模型,画模型图的时候就指定表单的名称formKey.须要保证这个formKey和我们创建的表单名称一致. 表单并不在创建

【Java】向一个页面发送post请求并获取其处理之后的结果与用javascript创建一个表单后提交的安全性

本文对比与<[Java]读取网页中的内容>(点击打开链接)一文,向一个页面发送get请求,并获取其处理之后的结果,这里是向一个页面发送post请求,并获取其处理之后的结果.如果向一个页面发送get请求,并获取其处理之后的结果,只需要直接读取一个网页用?后接各种用&参数连接的参数即可,而向一个页面发送post请求,并获取其处理之后的结果,就不是这么简单了. 这里方法可能在普通的Java文件中不会太常见,但在jsp.安卓等javaweb的网页编程中却十分常用 import java.io.

MFC属性表单的创建

一个属性表单由一个或多个属性页组成.它有效地解决了大量信息无法在一个对话框上显示这一问题. 1.创建属性页 为了创建属性表单,首先需要创建属性页,后者对应的MFC类是CPropertyPage,该类生成的对象代表了属性表单中一个单独的属性页. 在资源编译器下添加3个属性页资源,并修改这三个属性页资源的ID及标题(Caption属性),属性页的标题就是最终在属性页上显示的选项卡的名称.有三种类型的属性页,如图: 说明:如果知道了属性页资源与对话框资源之间的属性区别,也可以在程序中先增加一个普通对话

雷林鹏分享:jQuery EasyUI 表单 - 创建树形下拉框

jQuery EasyUI 表单 - 创建树形下拉框 树形下拉框(ComboTree)是一个带有下列树形结构(Tree)的下拉框(ComboBox).它可以作为一个表单字段进行使用,可以提交给远程服务器. 在本教程中,我们将要创建一个注册表单,带有 name.address.city 字段.city 字段是一个树形下拉框(ComboTree)字段,在里面用户可以下拉树面板(tree panel),并选择一个特定的城市. 创建表单(Form) title="Register" butto