当前位置:主页   - 电脑 - 网站开发 - ASP.Net
OpenXML 替换word模板中的标签
来源:网络   作者:   更新时间:2012-08-22
收藏此页】    【字号    】    【打印】    【关闭

  本文示例源代码或素材下载

  最近的项目(MOSS项目)需要,用户需要根据word模板生成相关的word文档,具体需求是根据infopath表单中的内容和相关的模板生成一份word文档

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

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

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

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

  部分常量

 conststringdocumentRelationshipType="http://schemas.openxmlformats.org/officeDocument/2006/relationships/officeDocument";
    conststringstrUri="http://schemas.openxmlformats.org/wordprocessingml/2006/main";
    staticList<string>bookmarkText;
    stringbookmarkName;

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

voidbindTable(stringfileName)
    {
      
      dt=newDataTable();
      dt.Columns.Add("标签",typeof(string));
      dt.Columns.Add("内容",typeof(string));
      DataRowdr;
      Streamstrm=null;
      PackagePartdocumentPart;
      Packagepackage;
      
      
      using(SPSitesite=newSPSite("http://ascentn-moss:8686/"))
      {
        SPWebweb=site.OpenWeb();
        strm=web.GetFile(fileName).OpenBinaryStream();
        documentPart=null;
        package=Package.Open(strm,FileMode.Open,FileAccess.ReadWrite);
        //FileStreamfs=newFileStream(fileName,FileMode.OpenOrCreate);
        //PackagePartdocumentPart=null;
        //Packagepackage=Package.Open(fileName,FileMode.Open,FileAccess.ReadWrite);
        //MessageBox.Show(strm.Length.ToString());
        //Packagepackage=Package.Open(strm,FileMode.Open,FileAccess.ReadWrite);
        foreach(System.IO.Packaging.PackageRelationshipdocumentRelationshipinpackage.GetRelationshipsByType(documentRelationshipType))
        {
          NameTablent=newNameTable();
          XmlNamespaceManagernsManager=newXmlNamespaceManager(nt);
          nsManager.AddNamespace("w",strUri);
          UridocumentUri=PackUriHelper.ResolvePartUri(newUri("/",UriKind.Relative),documentRelationship.TargetUri);
          documentPart=package.GetPart(documentUri);
          XmlDocumentxdoc=newXmlDocument();
          xdoc.Load(documentPart.GetStream());
          XmlNodeListnodeList=xdoc.SelectNodes("//w:bookmarkStart",nsManager);
          foreach(XmlNodenodeinnodeList)
          {
            dr=dt.NewRow();
            if(node.NextSibling.Name.ToString()=="w:bookmarkEnd")
            {
              bookmarkText=newList<string>();
              bookmarkName=node.Attributes["w:name"].Value;
              bookmarkText.Add("");
              dr[0]=bookmarkName;
              //dataGridView
            }
            else
            {
              bookmarkName=node.Attributes["w:name"].Value;
              dr[0]=bookmarkName;
              stringbookmarkId=node.Attributes["w:id"].Value;
              bookmarkText=newList<string>();
              XmlNodenextParentNode=node.ParentNode;
              XmlNodenodeIterate=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('n'+nodeIterate.InnerText);
                  }
                }
              }
              //dic.Add(bookmarkName,bookmarkText);
            }
            dt.Rows.Add(dr);
          }
        }
        package.Close();
      }
    }

其它资源
来源声明

版权与免责声明
1、本站所发布的文章仅供技术交流参考,本站不主张将其做为决策的依据,浏览者可自愿选择采信与否,本站不对因采信这些信息所产生的任何问题负责。
2、本站部分文章来源于网络,其版权为原权利人所有。由于来源之故,有的文章未能获得作者姓名,署“未知”或“佚名”。对于这些文章,有知悉作者姓名的请告知本站,以便及时署名。如果作者要求删除,我们将予以删除。除此之外本站不再承担其它责任。
3、本站部分文章来源于本站原创,本站拥有所有权利。
4、如对本站发布的信息有异议,请联系我们,经本站确认后,将在三个工作日内做出修改或删除处理。
请参阅权责声明