C# XSLT 转换word 生成word

1.简介

 Extensible Stylesheet Language Transformations (XSLT)  扩展样式语言转换。可以将一种格式xml转换成另一种格式xml

https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms256069(v=vs.100)

原始xml文档如下:

 其中,genre表示类别  ,下级movie 表示电影,movie含有两个属性(名称和发行年份)

2.word2007

https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2007/ee872374(v=office.12)?redirectedfrom=MSDN

打开word并添加模板文字,并保存

 将word添加后缀名wordTemplate.docx.zip,用压缩工具打开,将里面的document.xml复制出来。

 添加文件名后缀【.xslt】:document.xml.xslt,然后用文本编辑工具打开。

添加<xsl:stylesheet>标签

 将<w:document>标签的内容简化(因为很多内容我们是不知道,也不需要的,为了方便查看,只保留w空间下的标签,即 w:body,w:p,w:r之类的)

添加<xsl:for-each>和<xsl:value-of >两个标签,用来替换原有模板(因为例子xml数据中,存在两个嵌套,所以用两个for-each)

完成后保存,即我们的xslt模板就建立好了

安装Open xml SDK:http://www.microsoft.com/downloads/details.aspx?familyid=c6e744e5-36e9-45f5-8d8c-331df206e0d0&displaylang=en

visual studio里添加引用

添加代码

  //读取xslt  扩展样式语言转换表
            XslCompiledTransform transform = new XslCompiledTransform();
            FileStream fs = new FileStream("document.xml.xslt", FileMode.Open);
            transform.Load(new XmlTextReader(fs));

            //结果数据
            StringWriter stringWriter = new StringWriter();
            XmlWriter xw = XmlWriter.Create(stringWriter);

            //转换
            transform.Transform("XMLFile1.xml", xw);

            XmlDocument newWordContent = new XmlDocument();
            newWordContent.LoadXml(stringWriter.ToString());

            using (WordprocessingDocument output = WordprocessingDocument.Create("output.docx", WordprocessingDocumentType.Document))
            {
                var mainPart = output.AddMainDocumentPart();
                mainPart.Document = new Document();
                Body updatedBodyContent = new Body(newWordContent.DocumentElement.InnerXml);

                //Replace the existing Document Body with the new content.
                output.MainDocumentPart.Document.Body = updatedBodyContent;

                //Save the updated output document.
                output.MainDocumentPart.Document.Save();
            }

效果:

3.word2003

2003和2007不同,2007是压缩包,而word2003可以直接读取xml格式文件。

参考文档:https://dradisframework.com/support/guides/reporting/xslt_reports.html

https://www.cnblogs.com/yxli2008/p/11073549.html

步骤跟2007类似:

新建word,编辑模板及样式,另存为,选择我认得 2003 xml文档:

 其他步骤一样

代码:

 Assembly executingAssembly = Assembly.GetExecutingAssembly();
            Stream manifestResourceStream = executingAssembly.GetManifestResourceStream("模板生成Word_2013.wordTemplate2013.xml.xslt");

            XslCompiledTransform xslCompiledTransform = new XslCompiledTransform(false);
          
            xslCompiledTransform.Load(new XmlTextReader(manifestResourceStream));

             
            FileInfo fileInfo = new FileInfo("aaa.doc");
            StreamWriter streamWriter = fileInfo.CreateText();
            xslCompiledTransform.Transform("XMLFile1.xml", null, streamWriter);
            streamWriter.Close();

4.源码

个人更推荐用2003,因为更简单,不需要Open xmlSdk,且结构更简单。

https://files.cnblogs.com/files/lizhijian/20201028xslt%E6%A8%A1%E6%9D%BF%E7%94%9F%E6%88%90word.rar

原文地址:https://www.cnblogs.com/congqiandehoulai/p/13895393.html