写在前面
之前对与Qt和Excel、Word的交互不太了解,知道有这么回事,但是具体怎么写和涉及到那些类不太清楚。
结果工作中要用到,因为不太熟悉这方面,所以被另外一个“同事”接下了客户发布的“赏金任务”,感到遗憾,失去了一个在工作中锻炼自己和表现自己的机会。
不过没关系,自己看看和了解一下基本操作还是可以滴。
Qt与Excel交互
-
主要用到QAxObject类,所有Excel中的对象(excel,workbook,sheet,cell等等)和Word中的对象(word,document,selection等等)都被看做QAxObject对象。
-
除了要添加头文件#include <QAxObject>之外,还要再.pro文件中添加:
QT = axcontainer
-
基本操作:
QAxObject *m_excel; QAxObject *m_workBooks; QAxObject *m_workBook; QAxObject *m_sheets;
m_excel = new QAxObject("Excel.Application"); m_workBooks = m_excel->dynamicCall("WorkBooks"); //m_workBooks->dynamicCall("Open(const QString&)","X:\\xx\\xx.xlsx"); //打开一个已经存在excel m_workBooks->dynamicCall("Add"); //新建一个excel m_workBook = m_excel->querySubObject("ActiveWorkBook"); //获得当前激活的excel m_sheets = m_workBook->querySubObject("Sheets); //注意下述新建sheet和获得一个已有的sheet,调用querySubObject的对象区别 //QAxObject *m_sheet = m_sheets->querySubObject("Item(int)",n); //打开第n个sheet m_sheets->dynamicCall("Add"); //新建一个sheet QAxObject *m_sheet= m_workbook->querySubObject("ActiveSheet"); QAxObject *m_cell = m_sheet->querySubObject("Range(QVariant,QVariant)","C3");//获得C3单元格 m_cell->dynamicCall("SetValue(const QVariant&)",QVariant("Qttttt");//向单元格写入 QString str = m_cell->dynamicCall("Value2()").toString();从单元格读出 //关闭excel,结束对excel的操作 m_workBook->dynamicCall("SaveAs(const QString&)","X:\\xx\\xx.xlsm"); m_workBook->dynamicCall("Close()"); m_excel->dynamicCall("Quit()");
Word的操作类似吧,不写了。
4.QAxWidget
用于实时显示和浏览Office文档内容,还是相当于调用的Office。需要用一个Qt控件进行包装。
QAxWidget *m_widget = new QAxWidget("Excel.Application",ui->lable);
m_Widget->dynamicCall("DisplayAlerts",false);//忽略excel弹出的警告框
m_widget->setGeometry(x,y,width,height);//设置显示区域位置和大小
m_widget->setControl("X:\\xx\\xx.xlsx");//要打开的文件路径
m_widget->show();
5. 总结
dynamicCall执行操作,querySubObject获得对象。
经常写不对的原因是,各个对象是由哪个对象调用querySubOject获得的,经常搞不清楚。还是得孰能生巧,回头写个比较综合的东西锻炼一下。