使用xml生成word的基本步驟在《使用xslt轉化xml數據造成word文檔導出.doc》中說明比較清楚了。可是其中的細節並未說到,所以本身折騰了兩天總算成功了。如下是我在使用過程當中碰到的問題要點:app
1.下面經過例子演示:框架
簡單 的xml以及對應的xml框架dom
2.分別建立03版本的word文檔log_03.doc和o7版本的word文檔log_07.docx,並都應用以上生成的log.xsd框架spa
分別另存爲log_03_doc.xml,log_07_doc.xml。.net
3. 用log_03_doc.xml,log_07_doc.xml生成xslt文件log_03.xslt和log_07.xslt。code
log_03_doc.xml生成log_03.xslt時會彈出以上對話框,僅僅選中xml中指定的namespace就能夠了。xml
log_07_doc.xml生成log_07.xslt時會彈出以上對話框,就是沒有xml中指定的namespace,全部不管怎麼選,生成的xslt都不是咱們想要的。blog
log_03_doc.xml生成log_03.xslt時會彈出以上對話框,不要隨便再選其餘namespace。 生成的xslt截圖圖片
若是再選中其餘namespace,生成的xslt也不是咱們要的。生成xslt截圖文檔
顯然跟上面的不同。
要實現插入圖片,須要修改log_03.doc.
從新生成log_03.xslt,並修改<ns0:image>節點。
一、刪除整個v:shapetype 節點
二、刪除 <w:binData節點中的數據,並添加<xsl:value-ofselect="."/>
修改以後
三、修改v:shape 節點,去掉 style 屬性,增長xsl 節點,以下:
四、去掉w:pict 節點後面的帶<xsl:value-ofselect="."/>的全部節點
例子中去掉了以下代碼:
<w:r>
<w:t>
<xsl:value-of select="." />
</w:t>
</w:r>
若是沒作第四步,則在word中會出現圖片的二進制代碼。
例子:
QDomDocumentdom;
QDomProcessingInstructionproc =
dom.createProcessingInstruction(
"xml",
"version=\"1.0\"standalone=\"no\""
);
dom.appendChild(proc);
QDomElementr =dom.createElement("log");
dom.appendChild(r);
r.setAttribute("xmlns","logs");
QDomElementuserNode =dom.createElement("user");
r.appendChild(userNode);
QDomTextuserTextNode =dom.createTextNode("john");
userNode.appendChild(userTextNode);
QDomElementloginNode =dom.createElement("login");
r.appendChild(loginNode);
QDomTextloginTextNode =dom.createTextNode("2015-01-1811:10:12");
loginNode.appendChild(loginTextNode);
QDomElementlogoffNode =dom.createElement("logoff");
r.appendChild(logoffNode);
QDomTextlogoffTextNode =dom.createTextNode("2015-01-1813:10:12");
logoffNode.appendChild(logoffTextNode);
QDomElementimageNode =dom.createElement("image");
r.appendChild(imageNode);
QStringpng;
FILE*fpng =fopen("2.jpg","rb");
if( fpng )
{
encode(fpng,png,0 );
fclose(fpng );
}
imageNode.setAttribute("style","width:300pt;height:300pt" );
charszBuffer[256];
//sprintf(szBuffer,"wordml://5.png");
imageNode.setAttribute("key","2.jpg" );
QDomTextlogonNodeTextNode =dom.createTextNode(png);
imageNode.appendChild(logonNodeTextNode);
QStringxml =dom.toString();
QFilefile("log.xml");
if(file.open(QIODevice::WriteOnly))
{
QTextStreamoutput( &file);
output.setCodec(QTextCodec::codecForName("UTF-8"));
//QStringcontent = dom.toString();
output<< xml;
file.close();
}
QStringsrc ="msxsl.exe";
QStringsrc1 ="log.xml";
QStringsrc2 ="log_03.xslt";
QStringsrc3 =QString("122")+".doc";
QProcess*proce =newQProcess( );
QStringListargumentList;
argumentList.append(src1 );
argumentList.append(src2 );
argumentList.append("-o");
argumentList.append(src3 );
proce->start(src, argumentList );
bool ret =proce->waitForStarted( 5000 );
http://blog.csdn.net/hai200501019/article/details/42900905
http://blog.csdn.net/hai200501019/article/details/42923865