Qt使用QAxObject读写Excel文件。
使用前在工程文件中加入:
QT += axcontainer
源文件中引入:
#include <QAxObject>
// 读Excel文件
int ReadExcel(const QString& filePath)
{
QAxObject *excel = new QAxObject("ket.Application");
excel->setControl("ket.Application");// wps程序(需要安装wps)
// excel->setControl("Excel.Application");// excel程序(需要激活)
excel->setProperty("Visible", false); // 不显示窗体
excel->setProperty("DisplayAlerts", false); // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
QAxObject* workbooks = excel->querySubObject("WorkBooks"); //获取工作簿集合
workbooks->dynamicCall("Open(const QString&)", filePath); //打开打开已存在的工作簿
QAxObject* workbook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿
QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", 1);//获取工作表集合的工作表1,即sheet1
QAxObject* range = sheet->querySubObject("UsedRange"); //获取该sheet的使用范围对象
QVariant var = range->dynamicCall("Value");
delete range;
QVariantList dataList = var.toList(); //得到表格中的所有数据
workbooks->dynamicCall("Close()"); //关闭工作簿
excel->dynamicCall("Quit()"); //退出进程
if (dataList.isEmpty()) {
return -1;
}
// 所有数据用QVariantList存储,每行用QVariantList存储
/***********************数据存储格式************************/
// list1:data1,data2,data3,data4,data5
// list2:data1,data2,data3,data4,data5
// list3:data1,data2,data3,data4,data5
// list4:data1,data2,data3,data4,data5
// list5:data1,data2,data3,data4,data5
for (int i = 1; i < dataList.size(); ++i) {
QVariantList rowData = dataList[i].toList();
qDebug() << rowData[0].toString(); // 第i行0列数据
qDebug() << rowData[1].toString(); // 第i行1列数据
qDebug() << rowData[2].toString(); // 第i行2列数据
}
return dataList.count();
}
// 写Excel文件
void ExcelOperator::WriteExcel(const QString& filePath)
{
QAxObject* excel = new QAxObject("ket.Application");
excel->setControl("ket.Application"); // wps程序(需要安装wps)
//excel->setControl("Excel.Application"); // excel文件(需要激活)
excel->setProperty("Visible", false); // 不显示窗体
excel->setProperty("DisplayAlerts", false); // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
QAxObject* workbooks = excel->querySubObject("WorkBooks"); // 获取工作簿(excel文件)集合
workbooks->dynamicCall("Add"); // 新建一个工作簿
QAxObject* workbook = excel->querySubObject("ActiveWorkBook"); //获取当前工作簿
QAxObject* sheet = workbook->querySubObject("WorkSheets(int)", 1);//获取工作表集合的工作表1,即sheet1
QAxObject* user_range = sheet->querySubObject("Range(const QString&)", "A1:D100");//写数据在表格的范围(A1:A列1行位置;D100:D列100行位置)
if (NULL == user_range || user_range->isNull()) {
return;
}
QList<QVariant> dataList;
for (int i = 0; i < 100; i++) {
dataList.push_back(QList<QVariant>() << "1" << "2" << "3" << "4");
}
user_range->dynamicCall("SetValue(const QVariant&)", QVariant(dataList));
workbook->dynamicCall("SaveAs(const QString&)", filePath); // 保存到filepath,路径需要把"/"改为"\\"
workbook->dynamicCall("Close (Boolean)", false); // 关闭文件
excel->dynamicCall("Quit(void)"); // 关闭excel
}