Qt编写xls和xlsx⽂件
使⽤Qt开发⼩⼯具时,有时会涉及到Excel⽂件读写操作,就我⾃⼰的经历总结了三种⽅法。
1. 使⽤XmlDocument 写xls
Qt定义了xml⽂件读写接⼝QDomDocument,也可以通过这个接⼝写Excel表格,但仅限于xls⽂件。
bool MainWindow::TestQDomDocument()
{
QString selectedFile = QFileDialog::getSaveFileName(this,QStringLiteral("保存"), "./data/", QStringLiteral("XLS file(*.xls)"));
if (selectedFile.isEmpty() == true)
return false;
if (dsWith(".xls") == false)
selectedFile += ".xls";
QFile file(selectedFile);
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
QMessageBox::warning(this, QStringLiteral("错误"), QStringLiteral("创建⽂件出错!"));
return false;
}
QApplication::setOverrideCursor(Qt::WaitCursor);
QDomDocument domDoc;
QDomProcessingInstruction instruction = ateProcessingInstruction("xml","version=\'1.0\'");
domDoc.appendChild(instruction);
instruction = ateProcessingInstruction("mso-application","progid=\'Excel.Sheet\'");
domDoc.appendChild(instruction);
QDomElement rootEle = ateElement("Workbook");
rootEle.setAttribute("xmlns","urn:schemas-microsoft-com:office:spreadsheet");
rootEle.setAttribute("xmlns:ss","urn:schemas-microsoft-com:office:spreadsheet");
domDoc.appendChild(rootEle);
QDomElement workSheetEle = ateElement("Worksheet");
workSheetEle.setAttribute("ss:Name","Sheet1");
rootEle.appendChild(workSheetEle);
createprocessaQDomElement tableEle = ateElement("Table");
workSheetEle.appendChild(tableEle);
//按⾏写数据
QStringList header;
header << QStringLiteral("名称") << QStringLiteral("类型")<< QStringLiteral("⼦类型")<<QStringLiteral("数量");
QList<QStringList> allTables;
allTables.push_back(header);
for(int i=0; i<m_pointList.size(); i++)//QList<PointInfo>
{
QStringList itemlist = m_pointList[i].toList();
allTables.push_back(itemlist);
//QStringList toList()
//{
//return QStringList()<<name<<type<<subtype<<num;//结构体转为QStringList
//}
}
int count = allTables.size();
for(int i=0; i<count; i++)
{
qApp->processEvents();
QStringList item = allTables[i];
QDomElement rowEle = ateElement("Row"); //添加标题
for(int j=0; j&unt(); j++)
{
QDomElement cellEle = ateElement("Cell");
QDomElement dataEle = ateElement("Data");
QString strValue = item.at(j);
dataEle.setAttribute("ss:Type", "String");
QDomText domText = ateTextNode(strValue);
dataEle.appendChild(domText);
cellEle.appendChild(dataEle);
rowEle.appendChild(cellEle);
}
tableEle.appendChild(rowEle);
}
QTextStream outStream(&file);
outStream.setCodec(QTextCodec::codecForName("UTF-8"));
domDoc.save(outStream, 4, QDomNode::EncodingFromTextStream);
file.close();
QApplication::restoreOverrideCursor();
QMessageBox::information(this, QStringLiteral("提⽰"), QStringLiteral("保存⽂件成功!"));
return true;
}
1. 使⽤QtXlsx写xlsx
QtXlsx并不是Qt5本⾝提供的库,需要下载源码编译才能使⽤,下载和编译部分我是参考链接:,拜谢!
实际上源码部分已经给出了很多demo,⼤家到examples⽬录可以看到具体内容,包括各种图⽚,⽂字,字体设置等等操作都有对应的⼩demo。
bool MainWindow::TestQXlsx()
{
QString selectedFile = QFileDialog::getSaveFileName(this,QStringLiteral("保
存"), "./data/", QStringLiteral("XLSX file(*.xlsx)"));
if (selectedFile.isEmpty() == true)
return false;
if (dsWith(".xlsx") == false)
selectedFile += ".xlsx";
QXlsx::Document xlsx(selectedFile);
QStringList header;
header << QStringLiteral("名称") << QStringLiteral("类型")<< QStringLiteral("⼦类型")<<QStringLiteral("数量");
QList<QStringList> allTables;
allTables.push_back(header);
for(int i=0; i<m_pointList.size(); i++)
{
QStringList itemlist = m_pointList[i].toList();
allTables.push_back(itemlist);
}
int rowCount = allTables.size();
for (int row =0; row<rowCount; ++row)
{
QStringList item = allTables[row];
int colCount = item.size();
for (int col=0; col<colCount; ++col)
{
if(col == 3 && row > 0)
{
QString numstr = item[col];
double num = Double();
xlsx.write(row+1, col+1, num);
}
else
xlsx.write(row+1, col+1, item[col]);
}
}
xlsx.save();
QMessageBox::information(this, QStringLiteral("提⽰"), QStringLiteral("保存⽂件成功!"));
QDesktopServices::openUrl(QUrl::fromLocalFile(selectedFile));
return true;
}
1. 使⽤QAxObject直接操作Excel
这部分内容也是我从⽹上到的使⽤较多的⽅法,顺便列出来。我⾃⼰本⾝没有使⽤这个⽅法,但据说在windows上读写Excel⽂件是很快的(;),⼤家可以根据⾃⼰的情况尝试下。(ps.代码部分参考博⽂地址没有单独保存,如果博主看到可以联系我。)
bool MainWindow::TestQAxObject(QString path)
{
QAxObject *excel = NULL; //本例中,excel设定为Excel⽂件的操作对象
QAxObject *workbooks = NULL;
QAxObject *workbook = NULL; //Excel操作对象
excel = new QAxObject("Excel.Application");
excel->dynamicCall("SetVisible(bool)", true); //true表⽰操作⽂件时可见,false表⽰为不可见
workbooks = excel->querySubObject("WorkBooks");
//————————————————按⽂件路径打开⽂件————————————————————
workbook = workbooks->querySubObject("Open(QString&)", path);
//获取打开的excel⽂件中所有的⼯作sheet
QAxObject * worksheets = workbook->querySubObject("WorkSheets");
//—————————————————Excel⽂件中表的个数:——————————————————
int iWorkSheet = worksheets->property("Count").toInt();
qDebug() << QString("Excel⽂件中表的个数:%1").arg(QString::number(iWorkSheet));
//————————————————获取第n个⼯作表querySubObject("Item(int)",n);——————————
QAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);//本例获取第⼀个,最后参数填1
//—————————获取该sheet的数据范围(可以理解为有数据的矩形区域)————
QAxObject * usedrange = worksheet->querySubObject("UsedRange");
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论