A. vue如何將html插入到word模板的指定位置
在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)
{
// 這裡面隨便指定了一個位置,在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文檔裡面有沒有圖片,回頭想想,之前是可以正常保存且顯示圖片的,現在不顯示圖片而只顯示一個叉叉,看來是因為圖片路勁出問題了。
B. java 中用poi讀取word和用docx4j讀取word
不知道你是具體讀取Word裡面的什麼元素,下面以讀取文字和圖片為例吧,兩個代碼示例,你參考看看:
讀取文本
import com.spire.doc.Document;
import java.io.FileWriter;
import java.io.IOException;
public class ExtractText {
public static void main(String[] args) throws IOException {
//載入Word文檔
Document document = new Document();
document.loadFromFile("C:\Users\Administrator\Desktop\sample.docx");
//獲取文檔中的文本保存為String
String text=document.getText();
//將String寫入Txt文件
writeStringToTxt(text,"ExtractedText.txt");
}
public static void writeStringToTxt(String content, String txtFileName) throws IOException {
FileWriter fWriter= new FileWriter(txtFileName,true);
try {
fWriter.write(content);
}catch(IOException ex){
ex.printStackTrace();
}finally{
try{
fWriter.flush();
fWriter.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
}}
2. 讀取圖片
import com.spire.doc.Document;
import com.spire.doc.documents.DocumentObjectType;
import com.spire.doc.fields.DocPicture;
import com.spire.doc.interfaces.ICompositeObject;
import com.spire.doc.interfaces.IDocumentObject;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class ExtractImages {
public static void main(String[] args) throws IOException {
//載入Word文檔
Document document = new Document();
document.loadFromFile("C:\Users\Administrator\Desktop\sample.docx");
//創建Queue對象
Queue nodes = new LinkedList();
nodes.add(document);
//創建List對象
List images = new ArrayList();
//遍歷文檔中的子對象
while (nodes.size() > 0) {
ICompositeObject node = nodes.poll();
for (int i = 0; i < node.getChildObjects().getCount(); i++) {
IDocumentObject child = node.getChildObjects().get(i);
if (child instanceof ICompositeObject) {
nodes.add((ICompositeObject) child);
//獲取圖片並添加到List
if (child.getDocumentObjectType() == DocumentObjectType.Picture) {
DocPicture picture = (DocPicture) child;
images.add(picture.getImage());
}
}
}
}
//將圖片保存為PNG格式文件
for (int i = 0; i < images.size(); i++) {
File file = new File(String.format("output/圖片-%d.png", i));
ImageIO.write(images.get(i), "PNG", file);
}
}
}
注意這里使用的jar包是spire.doc.jar,需要在java程序中先導入jar文件。