C# 創建可填充Word表單
阿新 • • 發佈:2018-10-30
sha 位置 選項 file 文件夾 tab ron textinput 表格 背景介紹
有時候,我們需要制作一個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);
生成文檔:
C# 創建可填充Word表單