遇到此問題,首先想到的就是各種百度。結果度娘了一會並沒有發現有用的有效的解決方法,哎,看來還得靠自己啊。
首先整理了下手頭上的資源,一是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]);編譯時不報錯,這種方式是不出效果,
總之,希望這個東西對有需要的人能有所幫助。如果有問題可以跟我溝通,如果有好的解決方法也可以告訴我,在此謝謝了。