示例代码
内容段 试一下
void Widget::ExportXML() { const int TB_MAX = 3; //工作表张数 QFile file("./export.xml"); if(!file.open(QFile::WriteOnly | QFile::Text)) { return; } QXmlStreamWriter xml(&file); xml.setCodec("UTF-8"); //设置UTF-8编码 xml.setAutoFormatting(true); //标签缩进 xml.setAutoFormattingIndent(1); //标签缩进空格数 xml.writeStartDocument(); xml.writeProcessingInstruction("mso-application progid=\"Excel.Sheet\""); xml.writeStartElement("Workbook"); xml.writeAttribute("xmlns", "urn:schemas-microsoft-com:office:spreadsheet"); xml.writeAttribute("xmlns:x", "urn:schemas-microsoft-com:office:excel"); xml.writeAttribute("xmlns:ss", "urn:schemas-microsoft-com:office:spreadsheet"); xml.writeAttribute("xmlns:html", "http://www.w3.org/TR/REC-html40"); for(int i = 0; i < TB_MAX; i++) { xml.writeStartElement("Worksheet"); //工作表 xml.writeAttribute("ss:Name", tr("表 ")+QString::number(i+1)); //工作表名 xml.writeStartElement("Table"); xml.writeStartElement("Column"); xml.writeAttribute("ss:AutoFitWidth", "0"); xml.writeEndElement(); ///【"Column"】 QStringList slData; slData << tr("姓名") << tr("年龄") << tr("身高"); xml.writeStartElement("Row"); foreach(QString str, slData) { xml.writeStartElement("Cell"); xml.writeStartElement("Data"); xml.writeAttribute("ss:Type", "String"); xml.writeCharacters(str); xml.writeEndElement(); ///【"Data"】 xml.writeEndElement(); ///【"Cell"】 } xml.writeEndElement(); ///【"Row"】 xml.writeStartElement("Row"); slData.clear(); slData << "博丽灵梦" << "18" << "163"; foreach(QString str, slData) { xml.writeStartElement("Cell"); xml.writeStartElement("Data"); xml.writeAttribute("ss:Type", "String"); xml.writeCharacters(str); xml.writeEndElement(); ///【"Data"】 xml.writeEndElement(); ///【"Cell"】 } xml.writeEndElement(); ///【"Row"】 xml.writeEndElement(); ///【"Table"】 //START <-- 这部分是为了冻结前1行的表头 xml.writeStartElement("WorksheetOptions"); xml.writeAttribute("xmlns", "urn:schemas-microsoft-com:office:excel"); xml.writeStartElement("FreezePanes"); xml.writeEndElement(); ///【"FreezePanes"】 xml.writeStartElement("FrozenNoSplit"); xml.writeEndElement(); ///【"FrozenNoSplit"】 xml.writeStartElement("SplitHorizontal"); xml.writeCharacters("1"); xml.writeEndElement(); ///【"SplitHorizontal"】 xml.writeStartElement("TopRowBottomPane"); xml.writeCharacters("1"); xml.writeEndElement(); ///【"TopRowBottomPane"】 xml.writeStartElement("ActivePane"); xml.writeCharacters("2"); xml.writeEndElement(); ///【"ActivePane"】 xml.writeStartElement("Panes"); xml.writeStartElement("Pane"); xml.writeStartElement("Number"); xml.writeCharacters("3"); xml.writeEndElement(); ///【"Number"】 xml.writeEndElement(); ///【"Pane"】 xml.writeStartElement("Pane"); xml.writeStartElement("Number"); xml.writeCharacters("2"); xml.writeEndElement(); ///【"Number"】 xml.writeEndElement(); ///【"Pane"】 xml.writeEndElement(); ///【"Panes"】 xml.writeStartElement("ProtectObjects"); xml.writeCharacters("False"); xml.writeEndElement(); ///【"ProtectObjects"】 xml.writeStartElement("ProtectScenarios"); xml.writeCharacters("False"); xml.writeEndElement(); ///【"ProtectScenarios"】 xml.writeEndElement(); ///【"WorksheetOptions"】 //这部分是为了冻结前1行的表头 --> END xml.writeEndElement(); ///【"Worksheet"】 } xml.writeEndElement(); ///【"Workbook"】 xml.writeEndDocument(); file.close(); }
写入类型问题
如果写入类型是数字,则需要将Cell
=> Data
标签的ss:Type
属性设置为Number,如下图代码:
//... QString strNum = "1994"; xml.writeStartElement("Cell"); xml.writeStartElement("Data"); xml.writeAttribute("ss:Type", "Number"); xml.writeCharacters(strNum ); xml.writeEndElement(); ///【"Data"】 xml.writeEndElement(); ///【"Cell"】 //...
注意:
如果写入类型为Number,但是writeCharacters
写入的又是空文本,则xml实际打开会是显示为”0″的数字单元格。
所以如果想写入为空的单元格,一定不要设置为Number类型。