在Word指定位置插⼊富⽂本域值(html⽂本)遇到此问题,⾸先想到的就是各种百度。结果度娘了⼀会并没有发现有⽤的有效的解决⽅法,哎,看来还得靠⾃⼰啊。
⾸先整理了下⼿头上的资源,⼀是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)html document是什么
{
// 这⾥⾯随便指定了⼀个位置,在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]);编译时不报错,这种⽅式是不出效果,
总之,希望这个东西对有需要的⼈能有所帮助。如果有问题可以跟我沟通,如果有好的解决⽅法也可以告诉我,在此谢谢了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。