通过xml生成word文档
Xml生成word总结使用xml生成word的基本步骤在《使用xslt转化xml数据形成word文档导出.doc》中说明比较清楚了。但是其中的细节并未说到,因此自己折腾了两天总算成功了。以下是我在使用过程中碰到的问题要点:
必须使用word 2003.1.下面通过例子演示:
简单 的xml以及对应的xml框架 2.分别创建03版本的word文档log_03.doc和o7版本的word文档log_07.docx,并都应用以上生成的log.xsd框架
分别另存为log_03_doc.xml,log_07_doc.xml。 3. 用log_03_doc.xml,log_07_doc.xml生成xslt文件log_03.xslt和log_07.xslt。
log_03_doc.xml生成log_03.xslt时会弹出以上对话框,仅仅选中xml中指定的namespace就可以了。 log_07_doc.xml生成log_07.xslt时会弹出以上对话框,就是没有xml中指定的namespace,所有无论怎么选,生成的xslt都不是我们想要的。 不要选其他namespacelog_03_doc.xml生成log_03.xslt时会弹出以上对话框,不要随便再选其他namespace。 生成的xslt截图
如果再选中其他namespace,生成的xslt也不是我们要的。生成xslt截图 显然跟上面的不一样。 插入图片要实现插入图片,需要修改log_03.doc. 重新生成log_03.xslt,并修改<ns0:image>节点。 1、删除整个v:shapetype 节点 2、删除 <w:binData节点中的数据,并添加<xsl:value-ofselect="."/> 修改之后 3、修改v:shape 节点,去掉 style 属性,增加xsl 节点,如下:
4、去掉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 ); (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |