Welcome

首页 / 软件开发 / .NET编程技术 / OpenXML 替换word模板中的标签

OpenXML 替换word模板中的标签2011-11-23 博客园 翅膀最近的项目(MOSS项目)需要,用户需要根据word模板生成相关的word文档,具体需求是根据infopath 表单中的内容和相关的模板生成一份word文档

着手做之前想想要是用word api操作的话,后台进程,多用户并发操作等等问题

看来还是用openxml来操作比较好,于是找了找资料,实现了这小小的功能

现在把代码贴出来跟大家分享下

使用openxml技术时,首先需要引用windowsbase.dll

部分常量

const string documentRelationshipType = "http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument&quo t;;
const string strUri = "http://schemas.openxmlformats.org/wordprocessingml/2006/main";
static List<string> bookmarkText;
string bookmarkName;

该方法是将模板中所有标签都取出,并放到一个datatable中

void bindTable(string fileName){dt = new DataTable();dt.Columns.Add("标签", typeof(string));dt.Columns.Add("内容", typeof(string));DataRow dr;Stream strm = null;PackagePart documentPart;Package package;using (SPSite site = new SPSite("http://ascentn-moss:8686/")){SPWeb web = site.OpenWeb();strm = web.GetFile(fileName).OpenBinaryStream();documentPart = null;package = Package.Open(strm, FileMode.Open, FileAccess.ReadWrite);//FileStream fs = new FileStream(fileName, FileMode.OpenOrCreate);//PackagePart documentPart = null;//Package package = Package.Open(fileName, FileMode.Open, FileAccess.ReadWrite);//MessageBox.Show(strm.Length.ToString());// Package package = Package.Open(strm, FileMode.Open, FileAccess.ReadWrite);foreach (System.IO.Packaging.PackageRelationship documentRelationship in package.GetRelationshipsByType(documentRelationshipType)){NameTable nt = new NameTable();XmlNamespaceManager nsManager = new XmlNamespaceManager(nt);nsManager.AddNamespace("w", strUri);Uri documentUri = PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), documentRelationship.TargetUri);documentPart = package.GetPart(documentUri);XmlDocument xdoc = new XmlDocument();xdoc.Load(documentPart.GetStream());XmlNodeList nodeList = xdoc.SelectNodes("//w:bookmarkStart", nsManager);foreach (XmlNode node in nodeList){dr = dt.NewRow();if (node.NextSibling.Name.ToString() == "w:bookmarkEnd"){bookmarkText = new List<string>();bookmarkName = node.Attributes["w:name"].Value;bookmarkText.Add(" ");dr[0] = bookmarkName;//dataGridView}else{bookmarkName = node.Attributes["w:name"].Value;dr[0] = bookmarkName;string bookmarkId = node.Attributes["w:id"].Value;bookmarkText = new List<string>();XmlNode nextParentNode = node.ParentNode;XmlNode nodeIterate = node.NextSibling;while (nodeIterate.Name.ToString() != "w:bookmarkEnd"){if (nodeIterate.Name.ToString() == "w:r")bookmarkText.Add(nodeIterate.InnerText);nodeIterate = nodeIterate.NextSibling;if (nodeIterate == null){if (nextParentNode.NextSibling.Attributes.Count != 0){if ((nextParentNode.NextSibling.Attributes["w:id"].Value == bookmarkId)){nodeIterate = nextParentNode.NextSibling;}}else{nextParentNode = nextParentNode.NextSibling;nodeIterate = nextParentNode.FirstChild;bookmarkText.Add("
" + nodeIterate.InnerText);}}}//dic.Add(bookmarkName, bookmarkText);}dt.Rows.Add(dr);}}package.Close();}}