本文实例演示一个完整的Excel操作,首先读取Excel文件数据并显示,然后代码实现Excel公式计算,最后将结果保存到Excel文件中并在界面上显示。
数据准备
在“D:Temp”下创建一个Excel表格文件,名为“exam.xlsx”,在其中预先录入2015—2019年高考人数、录取人数和录取率,如下图所示。
程序界面
创建Qt桌面应用程序项目,项目名称为“ExcelTable”。设计程序界面,Excel公式计算及显示程序界面如图所示。
全局变量及方法
“mainwindow.h”头文件的代码如下:
#include
功能实现
实现具体功能的代码皆在“mainwindow.cpp”源文件中,如下:
void MainWindow::on_btnOpen_clicked()
{
QFileDialog fdialog; //打开文件对话框
fdialog.setFileMode(QFileDialog::ExistingFile);
fdialog.setViewMode(QFileDialog::Detail);
fdialog.setOption(QFileDialog::ReadOnly, true);
fdialog.setDirectory(QString("D:/Temp"));
fdialog.setNameFilter(QString("所有文件(*.*);;Microsoft Excel (*.xlsx);;"
"Microsoft Excel 97-2003 工作表(*.xls)")); // (a)
if(fdialog.exec()){
QStringList files = fdialog.selectedFiles();
for(auto fname:files){
if(fname.endsWith(".xlsx") || fname.endsWith(".xls")){ //本例兼容两种Excel
this->view_Excel(fname); //在界面上显示Excel表格
}else{
QMessageBox::information(this, tr("提示"),tr("你选择的不是Excel文件!"));
}
}
}
}
void MainWindow::view_Excel(QString& filename)
{
mywidget = new QAxWidget("Excel.Application", ui->labView); //(b)
mywidget->dynamicCall("SetVisible(bool Visible)","false");
mywidget->setProperty("DisplayAlerts", false); //(c)
mywidget->setGeometry(0, 0, ui->labView->width(), ui->labView->height()); //设置显示尺寸
mywidget->setControl(filename);
mywidget->show(); //显示 Excel 表格
}
void MainWindow::closeExcel() //(d)
{
if(this->mywidget){
mywidget->close();
mywidget->clear();
delete mywidget;
mywidget = nullptr;
}
}
void MainWindow::on_btnCount_clicked() //统计功能实现
{
myexcel = new QAxObject("Excel.Application");
myworks = myexcel->querySubObject("WorkBooks");
myworks->dynamicCall("Open(const QString&)","D:\Temp\exam.xlsx");
workbook = myexcel->querySubObject("ActiveWorkBook");
mysheets = workbook->querySubObject("Sheets");
QAxObject *sheet = mysheets->querySubObject("Item(int)", 1);
QAxObject *cell = sheet->querySubObject("Range(QVariant, QVariant)", "C7");
//定位至第一张表的C7单元格
cell->dynamicCall("SetValue(const QVariant&)", QVariant("=sum(C2:C6)"));
//调用Excel内置的公式计算功能
cell = sheet->querySubObject("Range(QVariant, QVariant)","D7");
cell->dynamicCall("SetValue(const QVariant&)", QVariant("=average(D2:D6)"));
//单元格D7存放平均录取率值
workbook->dynamicCall("SaveAs(const QString&)","D:\Temp\exam.xlsx");
workbook->dynamicCall("Close()");
myexcel->dynamicCall("Quit()");
delete myexcel;
myexcel = nullptr;
QMessageBox::information(this, tr("完毕"),tr("统计完成!"));
closeExcel();
QString fname = "D:\Temp\exam.xlsx";
view_Excel(fname); //统计完及时浏览刷新界面显示
}
其中,
- (a) fdialog.setNameFilter(QString("所有文件(*.*);;Microsoft Excel(*.xlsx);;"Microsoft Excel 97-2003 工作表(*.xls)")):这里利用文件对话框的过滤机制,筛选出目录下Excel类型的文件,这么做可避免因用户误操作打开其他不兼容类型的文件而导致程序崩溃。
- (b) mywidget = new QAxWidget("Excel.Application", ui->labView):用QAxWidget将Excel应用程序包装为Qt界面上的可视化部件。
- (c) mywidget->setProperty("DisplayAlerts", false):将Excel软件自身的一些警告消息提醒机制封禁,可以避免后台Excel进程打扰前台Qt应用程序的运行。
- (d) void MainWindow::closeExcel(): 这个方法的几条语句是对Excel部件进程的善后处理,在关闭Excel后必须及时清除后台进程并将Qt界面上的Excel进程部件指针置空,请读者注意这几行语句的执行顺序(必须严格按顺序写),否则将出现程序关闭后其操作过的Excel文档无法再次打开的问题。
运行演示
运行程序,按以下步骤操作。
- (1)选择打开要计算的文件。单击界面上的“打开...”按钮,弹出“打开”对话框,选中先前创建好的“exam.xlsx”文件。
- (2)打开文件之后,其中的Excel表格会在Qt程序界面上显示,如图所示。
- (3)统计录取总人数与平均录取率。单击左下方“统计”按钮,稍候片刻,程序自动计算出5年高考录取总人数及平均录取率,并更新于Qt程序界面上,如图所示。
————————————————
觉得有用的话请关注点赞,谢谢您的支持!
对于本系列文章相关示例完整代码有需要的朋友,可关注并在评论区留言!