Heim  >  Artikel  >  Web-Frontend  >  在Word指定位置插入富文本域值(html文本)_html/css_WEB-ITnose

在Word指定位置插入富文本域值(html文本)_html/css_WEB-ITnose

WBOY
WBOYOriginal
2016-06-24 11:33:171815Durchsuche

     遇到此问题,首先想到的就是各种百度。结果度娘了一会并没有发现有用的有效的解决方法,哎,看来还得靠自己啊。

     首先整理了下手头上的资源,一是HtmlAgilityPack,专门解析Html文本用的;二是我有ASPOSE.Word。

     再整理下思路:在Word中插入Html,首先有一点是肯定的,Word跟Html都是Document结构,这点应该是没啥怀疑的。如此的话就感觉好办多了,无非就是Document上插入几个节点,在Html插入节点的方式完全可以运用到此地方。

     那么第一种解决方法就是:首先把Word转换为Html,然后在指定位置插入当前要插入的Html代码,然后再保存成Word格式的文档。

     第二种方式就是:把Html解析出有效的文本,利用Word增加段落的方式添加从Html中解析出来的文本。

     HtmlAgilityPack.HtmlDocument hd = new HtmlAgilityPack.HtmlDocument();
     hd.LoadHtml(txtContent.Value);

     hd.DocumentNode.Elements("p");

     通过此方式就可以获取到富文本域里面的所有文本信息。但是此种方式获取到的节点在ASPOSE类里面不识别。

    再继续折腾吧,回到ASPOSE上面。找帮助文档,寻百度。

      Document doc = new Document(Server.MapPath("~/tem_body.doc"));
      DocumentBuilder docBuilder = new DocumentBuilder(doc);
      docBuilder.InsertHtml(txtContent.Value);

      doc.Save(Server.MapPath("~/") + "/TestWord121.doc"); 

      打开保存后的文件,My God,这样就可以了。再试试带图片的,也很不错,图片也可以正常在Word里面正常显示。看来此插件确实很强大啊,不过到目前还并没有解决我的问题。就是插入的位置问题。目前它是插入的头部,即Body的Paragraph 0 处。

     接下来就是解决如何把HTML文本插入到指定位置,想了想得首先知道要插入的位置,度娘了一会发现了东东。DocumentExplorer,它可以查看Word文档里面的Doc结构。

     速度找了一个,打开后就可以清晰地看到Word文档:

   

   这样的话就知道自己要插入的位置在那个地方。最简单的就是设置好模板,找到要插入的位置节点。

    Document temdoc = new Document(Server.MapPath("~/tem.doc"));
    Document doc = new Document();
    DocumentBuilder docBuilder = new DocumentBuilder(doc);
    docBuilder.InsertHtml(txtContent.Value);
    docBuilder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
    temdoc.AppendDocument(doc, ImportFormatMode.KeepSourceFormatting);

    DocumentBuilder temdocBuilder = new DocumentBuilder(temdoc);

    var temParas = temdocBuilder.Document.Sections[1].Body.Paragraphs;
    //int intIndexer = 0;
     foreach (Paragraph para in temParas)
     {

           // 这里面随便指定了一个位置,在Paragraphs的第六个节点处
           temdocBuilder.Document.Sections[0].Body.InsertAfter(para.Clone(true), temdocBuilder.Document.Sections[0].Body.Paragraphs[5 + intIndexer - 1].NextSibling);
           intIndexer++;
     }
     temdocBuilder.Document.Sections.RemoveAt(1);

    temdoc.Save(Server.MapPath("~/") + "/TestWord1212.doc");

   再次保存后打开测试Word文档,符合自己的预期,解决了把HTML文本插入到Word文档的指定位置。再试试带图片的,结果发现Word文档里面有没有图片,回头想想,之前是可以正常保存且显示图片的,现在不显示图片而只显示一个叉叉,看来是因为图片路劲出问题了。

    Document temdoc = new Document(Server.MapPath("~/tem.doc"));
    Document doc = new Document(Server.MapPath("~/bank_tem.doc"));
    DocumentBuilder docBuilder = new DocumentBuilder(doc);
    docBuilder.InsertHtml(txtContent.Value);
    docBuilder.ParagraphFormat.Alignment = ParagraphAlignment.Left;
    temdoc.AppendDocument(doc, ImportFormatMode.KeepSourceFormatting);

    DocumentBuilder temdocBuilder = new DocumentBuilder(temdoc);

    var temParas = temdocBuilder.Document.Sections[1].Body.Paragraphs;
    //int intIndexer = 0;
     foreach (Paragraph para in temParas)
     {

           // 这里面随便指定了一个位置,在Paragraphs的第六个节点处
           temdocBuilder.Document.Sections[0].Body.InsertAfter(para.Clone(true), temdocBuilder.Document.Sections[0].Body.Paragraphs[5 + intIndexer - 1].NextSibling);
           intIndexer++;
     }
     temdocBuilder.Document.Sections.RemoveAt(1);

    temdoc.Save(Server.MapPath("~/") + "/TestWord1212.doc");

   再次打开,这次图片不显示问题就解决了。

    哎,其实说来此摸索的是还是很漫长,回来折腾了差不多6个小时,感觉总是不得要领,回头又看了看XML的节点操作,才恍然大悟。比如:

    temdocBuilder.Document.Sections[0].Body.InsertAfter(para, temdocBuilder.Document.Sections[0].Body.Paragraphs[5 + intIndexer - 1]);编译时不报错,这种方式是不出效果,

   总之,希望这个东西对有需要的人能有所帮助。如果有问题可以跟我沟通,如果有好的解决方法也可以告诉我,在此谢谢了。

 

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn