Skip to content

结构化文档标签(SDT) ​

内容控件是 Word 原生表单域。GoWord 写出 w:sdt → w:sdtPr → w:sdtContent(CT_SdtBlock / CT_SdtRun)。唯一 w:id 从 100000000 起编。复选框使用 Word 2010 w14:checkbox;文档根声明 mc:Ignorable="w14 wps"。

AddSDT* 定义在 element.Container 上,因此节、单元格、页眉和文本 Run 都可以调用。

AddSDTText / AddSDTDropdown / AddSDTDate / AddSDTCheckbox ​

签名 ​

go
func (c *Container) AddSDTText(alias, tag, placeholderText string) *SDT
func (c *Container) AddSDTDropdown(alias, tag string, options map[string]string) *SDT
func (c *Container) AddSDTDate(alias, tag, dateFormat string) *SDT
func (c *Container) AddSDTCheckbox(alias, tag string, checked bool) *SDT
func (c *Container) AddSDT(typ string) *SDT

参数 ​

名称类型说明
aliasstringw:alias — Word 控件标题栏显示的名称。
tagstringw:tag — 后续填充 / 提取用的稳定机器名。
placeholderTextstring可见的 w:sdtContent 文本。非空时同时设置 w:showingPlcHdr。
optionsmap[string]string下拉 value → displayText。键按排序顺序写成 w:listItem。
dateFormatstringw:dateFormat。空则使用 yyyy-MM-dd。区域为 en-US。
checkedboolw14:checked。选中写 ☒,未选写 ☐(字体 MS Gothic)。
typstringAddSDT 的 PHPWord 风格类型:plainText、dropDownList、date、checkbox、comboBox、richText。

可链式调用的设置器 ​

方法效果
SetAlias / SetTag改写 w:alias / w:tag。
SetValue替换可见内容并清除占位标记。
SetListItems替换下拉 / 组合框条目。
SetDateFormat改写 w:dateFormat。
SetChecked切换 w14:checkbox 与内容字形。

注意 ​

  • 节点顺序是 w:sdt → w:sdtPr → w:sdtContent。不要手改这段 XML。
  • 空的下拉 map 仍会写出控件,占位文本为 Choose an item.
  • AddSDT("plainText") 仍是 PHPWord 别名;新代码请使用带类型的辅助方法。
  • 在 Microsoft Word 中填写控件不需要打开“开发工具”选项卡。

完整示例 ​

保存为 main.go 后执行 go run .。Microsoft Word 打开 form.docx 时不会出现修复对话框。

go
package main

import (
	"log"

	"github.com/yunkeweb/go-word"
	"github.com/yunkeweb/go-word/style"
)

func main() {
	doc := word.New()
	doc.SetDefaultFontName("Calibri")
	sec := doc.AddSection()
	sec.AddTitle("Employee onboarding form", 1)

	sec.AddSDTText("Full name", "full_name", "Enter full name")
	sec.AddSDTDropdown("Department", "department", map[string]string{
		"eng": "Engineering",
		"fin": "Finance",
		"hr":  "Human Resources",
	})
	sec.AddSDTDate("Start date", "start_date", "yyyy-MM-dd")

	p := sec.AddTextRun()
	p.AddText("I have read the handbook  ")
	p.AddSDTCheckbox("Handbook", "handbook_ack", false)

	tbl := sec.AddTable(style.Table{Width: 9000})
	hdr := tbl.AddRow()
	hdr.AddCell(3000, style.Cell{Shading: style.Shading{Fill: "1F4E79"}}).
		AddText("Field", style.Font{Bold: true, Color: "FFFFFF"})
	hdr.AddCell(6000, style.Cell{Shading: style.Shading{Fill: "1F4E79"}}).
		AddText("Value", style.Font{Bold: true, Color: "FFFFFF"})
	row := tbl.AddRow()
	row.AddCell(3000).AddText("Manager")
	row.AddCell(6000).AddSDTText("Manager", "manager", "Enter manager name")

	if err := doc.Save("form.docx"); err != nil {
		log.Fatal(err)
	}
}

Word 中的效果 ​

四个内容控件:纯文本框、三项下拉、日期选择器,以及手册句旁未勾选的复选框。经理字段位于单元格内(w:sdt 作为 w:tc 的子节点)。更长的示例见 examples/v0.9.0_sdt。需要锁定页面其余部分时,与 文档保护 一起使用。

基于 GNU LGPL v3.0 发布。