Qt xml:DOM写可以直接用EXCEL打开的xml文件
2012-03-05 23:17
239 查看
前一篇写了如何用DOM方式生成XML文件,生成的文件可以直接用浏览器打开,可以选择EXCEL打开,将数据导入到EXCEL中,不能直接用EXCEL打开。但是有时候有需求需要不看到xml文件源码,而只希望看到其中的内容,比如直接双击就可以在EXCEL中显示,此篇就是实现将table列表中的内容直接导出到可以用EXCEL打开的xml文件中。其实生成过程是一样的 ,就是需要按照EXCEL的XML源码方式式样去写文件。
其实我个人对XML并不是很了解,现用现学的去了解了一些内容,可以到 http://www.w3school.com.cn/xml/ 中学习XML的相关知识。对EXECL那些更不懂了,老大教了一个简单方法,直接将excel文件保存为xml格式,用ultraEdit打开,然后可以照着写预处理指令了,我只采用了最简单的,把很多指令都去掉,只剩下基本的EXCEL页面。保留一个worksheet。具体实现如下:
QDomDocument modelDoc;
生成的xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet" ?>
<Workbook
xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office">
<Worksheet ss:Name="Sheet1">
<Table ss:DefaultRowHeight="13" x:FullRows="1" x:FullColumns="1" ss:ExpandedRowCount="8" ss:ExpandedColumnCount="18" ss:DefaultColumnWidth="54">
<Row>
<Cell>
<Data ss:Type="String">高度</Data>
</Cell>
<Cell>
<Data ss:Type="String">速度</Data>
</Cell>
</Row>
<Row>
<Cell>
<Data ss:Type="String">113.8682922</Data>
</Cell>
<Cell>
<Data ss:Type="String">33.0761344</Data>
</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
正因为有了前面那些execl格式的预处理指令加节点名称,所以导出的XML文件可以直接双击用EXCEL打开了
其实我个人对XML并不是很了解,现用现学的去了解了一些内容,可以到 http://www.w3school.com.cn/xml/ 中学习XML的相关知识。对EXECL那些更不懂了,老大教了一个简单方法,直接将excel文件保存为xml格式,用ultraEdit打开,然后可以照着写预处理指令了,我只采用了最简单的,把很多指令都去掉,只剩下基本的EXCEL页面。保留一个worksheet。具体实现如下:
QDomDocument modelDoc;
QDomProcessingInstruction instruction;
instruction = modelDoc.createProcessingInstruction("xml version=\"1.0\"", "encoding=\"utf-8\"");
modelDoc.appendChild(instruction);
instruction = modelDoc.createProcessingInstruction("mso-application progid=\"Excel.Sheet\"", "");
modelDoc.appendChild(instruction);
//生成根节点
QDomElement root = modelDoc.createElement("Workbook"); //添加预处理指令,有了这些,才能用excel直接打开xml文件
root.setAttribute("xmlns", "urn:schemas-microsoft-com:office:spreadsheet");
root.setAttribute("\nxmlns:o", "urn:schemas-microsoft-com:office:office");
root.setAttribute("\nxmlns:x", "urn:schemas-microsoft-com:office:excel");
modelDoc.appendChild(root); //添加根元素
QDomElement workSheet = modelDoc.createElement("Worksheet");
QDomAttr rootAttr = modelDoc.createAttribute("ss:Name");
rootAttr.setValue("Sheet1");
workSheet.setAttributeNode(rootAttr);
root.appendChild(workSheet);
QDomElement table = modelDoc.createElement("Table");
workSheet.appendChild(table);
QString count;
count = count.setNum(pModel->columnCount());
table.setAttribute("ss:ExpandedColumnCount", count);
count.clear(); count = count.setNum(pModel->rowCount() + 1); //加上列头1行 table.setAttribute("ss:ExpandedRowCount", count); table.setAttribute("x:FullColumns", "1"); table.setAttribute("x:FullRows", "1"); table.setAttribute("ss:DefaultColumnWidth", "54"); table.setAttribute("ss:DefaultRowHeight", "13"); //定义xml树的节点 QDomElement modelElement; QDomElement dataElement; QDomText modelElementNodeText; //写列头 QDomElement row = modelDoc.createElement(tr("Row")); table.appendChild(row); for(int columnIndex = 0; columnIndex < pModel->columnCount(); columnIndex++) { modelElement = modelDoc.createElement("Cell"); dataElement = modelDoc.createElement("Data"); dataElement.setAttribute("ss:Type", "String"); modelElement.appendChild(dataElement); modelElementNodeText = modelDoc.createTextNode(pModel->horizontalHeaderItem(columnIndex)->data(Qt::DisplayRole).toString()); dataElement.appendChild(modelElementNodeText); row.appendChild(modelElement); }
//生成xml树 for(int rowIndex = 0; rowIndex < pModel->rowCount(); rowIndex++) { QDomElement row = modelDoc.createElement(tr("Row")); table.appendChild(row); for(int columnIndex = 0; columnIndex < pModel->columnCount(); columnIndex++) { modelElement = modelDoc.createElement("Cell"); dataElement = modelDoc.createElement("Data"); dataElement.setAttribute("ss:Type", "String"); modelElement.appendChild(dataElement); if(pModel->item(rowIndex, columnIndex) != NULL) { modelElementNodeText = modelDoc.createTextNode(pModel->item(rowIndex, columnIndex)->data(Qt::EditRole).toString()); } else { modelElementNodeText = modelDoc.createTextNode(""); } dataElement.appendChild(modelElementNodeText); row.appendChild(modelElement); } table.appendChild(row); } QTextStream outFile(&file); modelDoc.save(outFile, 4); file.close();
生成的xml文件如下:
<?xml version="1.0" encoding="utf-8"?>
<?mso-application progid="Excel.Sheet" ?>
<Workbook
xmlns:x="urn:schemas-microsoft-com:office:excel" xmlns="urn:schemas-microsoft-com:office:spreadsheet"
xmlns:o="urn:schemas-microsoft-com:office:office">
<Worksheet ss:Name="Sheet1">
<Table ss:DefaultRowHeight="13" x:FullRows="1" x:FullColumns="1" ss:ExpandedRowCount="8" ss:ExpandedColumnCount="18" ss:DefaultColumnWidth="54">
<Row>
<Cell>
<Data ss:Type="String">高度</Data>
</Cell>
<Cell>
<Data ss:Type="String">速度</Data>
</Cell>
</Row>
<Row>
<Cell>
<Data ss:Type="String">113.8682922</Data>
</Cell>
<Cell>
<Data ss:Type="String">33.0761344</Data>
</Cell>
</Row>
</Table>
</Worksheet>
</Workbook>
正因为有了前面那些execl格式的预处理指令加节点名称,所以导出的XML文件可以直接双击用EXCEL打开了
相关文章推荐
- IE中点击链接下载EXCEL文件直接以乱码方式打开解决
- android ctrl + 左键(鼠标左键)直接打开xml文件
- 用XML编写EXCEL文件,XML的写法注意事项,可以C#+xslt导出Excel
- ie无法直接打开xml 文件的解决方法:
- weblogic服务上传word等文件直接打开问题解决 博客分类: web应用服务器 在weblogic上发布的web项目,测试中发现出现当上传word、excel、pdf等文件在下载的时候出现
- 用C#编程从数据库中读取图片数据导进Excel文件的方法(如何从数据库中读取保存的文件,直接打开,中间不保存到本地)
- 通过excel可识别的xml结构直接生成xls文件收藏
- 在VS2017环境下Qt读写Excel遇到"无法打开 源 文件 'QAxObject'"的错误解决办法
- Ubuntu11.10中打开Qt creator,提示无法覆盖文件 /home/xiaofeng/.config/Nokia/qtversion.xml : Permission denied
- java导出Excel文件,直接可以下载,然后更新状态,刷新页面
- 通过excel可识别的xml结构直接生成xls文件
- qt无法直接打开debug中的exe文件
- csv文件,不是excel格式的,不是excel格式的,不是excel格式的,其实csv就是纯文本格式即txt,可以用txt打开
- Excel保存文件不能直接打开,打开之后显示灰屏,从左上角的文件中,再找到要打开的文件才能打开?
- 关于eclipse android ctrl + 左键(鼠标左键)直接打开xml文件
- 怎么解决 配置 Microsoft Dynamics CRM 2011 IFD 虚拟机上用IE9打开 federationmetadata.xml文件显示不了,或者直接显示下载,但是下载失败?
- 打开qt出现提示无法覆盖文件 /home/xxx/.config/Qtcreator/qtversion.xml : Permission denied
- IE中点击链接下载EXCEL文件直接以乱码方式打开解决
- qt中打开excel、word等文件方法
- 双击DOC/xls文件打不开,但从Word/excel里可以打开的解决方法