本文所写的方法仅适用于windows平台,因为该方法需要ActiveX支持. linux下可使用libexcel,这里不作介绍.
首先需要在头文件中添加 QT += axcontainer
#include <QAxObject>
QAxObject excel("Excel.Application");//连接Excel控件
excel.setProperty("Visible", false);// 不显示窗体
excel.setProperty("DisplayAlerts", false); //不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示
QAxObject* workbooks = excel.querySubObject("WorkBooks"); // 获取工作簿集合
if (!workbooks)
{
return false;
}
workbooks->dynamicCall("Add"); // 新建一个工作簿
QAxObject* workbook = excel.querySubObject("ActiveWorkBook"); // 获取当前工作簿
if (!workbook)
{
return false;
}
/*QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", (m_excelPath));
if (!workbook) //新建工作薄或者打开工作薄选择其中一种
{
return ;
}*/
QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", 1); // 获取工作表集合的工作表1, 即sheet1
if (!worksheet)
{
return false;
}
QAxObject* cell = NULL;
int rowCount = 1;
QHashIterator<QString, QString> iter(languageHash);
while(iter.hasNext())
{
iter.next();
cell = worksheet->querySubObject("Cells(int, int)", rowCount, 1);
if (cell)
{
cell->dynamicCall("SetValue(conts QVariant&)", iter.key()); // 设置单元格的值
qDebug() << cell->dynamicCall("Value2()").toString(); //获取单元格的值
}
cell = worksheet->querySubObject("Cells(int, int)", rowCount, 2);
if (cell)
{
cell->dynamicCall("SetValue(conts QVariant&)", iter.value()); // 设置单元格的值
}
rowCount++;
}
workbook->dynamicCall("SaveAs(const QString&)", QDir::toNativeSeparators(m_excelPath)); //保存到filepath // 注意一定要用QDir::toNativeSeparators, 将路径中的"/"转换为"\", 不然一定保存不了
workbook->dynamicCall("Close (Boolean)", false); //关闭文件
excel.dynamicCall("Quit(void)"); //退出