一、背景介绍

环境:Win10 + QT5 + VS2015
Excel文件类型:Microsoft Excel 97-2003 工作表 (.xls)

目的:用QT处理Excel自动计算一下加班时间等信息。
主要涉及到Excel的读写操作、单元格格式设置等内容。

待处理的Excel表格内容如图所示:

二、涉及问题

QT相关配置

1、引入Active Qt库
QT += axcontainer

2、配置
右键项目→属性→VC++目录→库目录 加入.lib文件目录
右键项目→属性→链接器→输入 加入Qt5AxBase.lib、Qt5AxContainer.lib【release版】
Debug版加d:Qt5AxContainerd.lib、Qt5AxBased.lib

中文字符问题

由于中间涉及到对中文字符的操作,为了解决中文字符的乱码问题,需在编译时加入命令行参数,设置执行字符集为utf-8。
因此,需要在源文件中加入:

#pragma execution_character_set("utf-8")

三、代码内容

界面:

OvertimeCalculate.h内容:

#pragma once#include <QtWidgets/QMainWindow>
#include "ui_OvertimeCalculate.h"#include <QFileDialog>
#include<ActiveQt/QAxObject>
#include <QDebug>
#pragma execution_character_set("utf-8")  //中文字符class OvertimeCalculate : public QMainWindow
{Q_OBJECTpublic:OvertimeCalculate(QWidget *parent = Q_NULLPTR);private slots:void openFileSlot();private:Ui::OvertimeCalculateClass ui;QString filename;
};

OvertimeCalculate.cpp内容:

#include "OvertimeCalculate.h"OvertimeCalculate::OvertimeCalculate(QWidget *parent): QMainWindow(parent)
{ui.setupUi(this);
}void OvertimeCalculate::openFileSlot()
{//打开文件QString filePath = QFileDialog::getOpenFileName(this, tr("Open File"), ".", tr("Microsoft Office 2007 (*.xls)"));//获取保存路径QAxObject *excel = new QAxObject("this");excel->setControl("Excel.Application");excel->dynamicCall("SetVisible(bool)", true); //true 表示操作文件时可见 false表示不可见QAxObject *workbooks = excel->querySubObject("WorkBooks");//按文件路径打开文件QAxObject *workbook = workbooks->querySubObject("Open(QString&)", filePath);QAxObject * worksheets = workbook->querySubObject("WorkSheets");// 获取excel文件中所有工作sheetQAxObject * worksheet = worksheets->querySubObject("Item(int)", 1);//获取第1个//获取sheet的数据范围QAxObject * usedrange = worksheet->querySubObject("UsedRange");//获取行数QAxObject * rows = usedrange->querySubObject("Rows");int iRows = rows->property("Count").toInt();//获取列数QAxObject * columns = usedrange->querySubObject("Columns");int iColumns = columns->property("Count").toInt();QString stringWrite;while (iRows-1){QString cell = QString::number(iRows, 10);QAxObject *range0 = worksheet->querySubObject("Range(QString)", "D" + cell);//周末判断QString strRowD = "";strRowD = range0->property("Value").toString();QAxObject *range1 = worksheet->querySubObject("Range(QString)", "F" + cell);QAxObject *range2 = worksheet->querySubObject("Range(QString)", "G" + cell);//下班时间QString strRowF = "";QString strRowG = "";strRowF = range1->property("Value").toString();QString RowFhh = strRowF.mid(11, 2); //上班时间hhQString RowFmm = strRowF.mid(14, 2); //上班时间mmstrRowG = range2->property("Value").toString();QString RowGhh = strRowG.mid(11, 2); //上班时间hhQString RowGmm = strRowG.mid(14, 2); //上班时间mmbool ok;int intRowFhh = RowFhh.toInt(&ok, 10);//上班时间hhint intRowFmm = RowFmm.toInt(&ok, 10);//上班时间mmint intRowGhh = RowGhh.toInt(&ok, 10);//下班时间hhint intRowGmm = RowGmm.toInt(&ok, 10);//下班时间mmdouble weekendOvertime = 0;double weekdayOvertime = 0;QString stringWeekendOvertime = "";QString stringWeekdayOvertime = "";double lunchTime = 0.5;double dinnerTime = 0.5;double mmTimeGo = 0;double mmTimeOff = 0;if (strRowD == "星期六" || strRowD == "星期日"){if (intRowFhh < 8) //早于8点按8点{intRowFhh = 8;intRowFmm = 0;  //8点整开始}if (intRowFhh == 12) //12点-13点到 按13点整{intRowFhh = 13;intRowFmm = 0;  //13点整开始}//-------------------------------------if (intRowFhh <12){if (intRowGhh <= 12)//上午来上午走{lunchTime = 0;dinnerTime = 0;}if (intRowGhh < 17)//上午来下午走{lunchTime = 1;dinnerTime = 0;}if (intRowGhh >= 17)//上午来晚上走{if (intRowGhh == 17 || (intRowGhh == 18 && intRowFmm < 30)) //晚上不足1小时 按17点整{intRowGhh = 17;intRowGmm = 0;  //17点整开始lunchTime = 1;dinnerTime = 0;}else{lunchTime = 1;dinnerTime = 0.5;}}}if (intRowFhh >12 && intRowGhh <= 17){if (intRowGhh < 17)//下午来下午走{lunchTime = 0;dinnerTime = 0;}if (intRowGhh >= 17)//下午来晚上走{if (intRowGhh == 17 || (intRowGhh == 18 && intRowFmm < 30)) //晚上不足1小时 按17点整{intRowGhh = 17;intRowGmm = 0;  //17点整开始lunchTime = 0;dinnerTime = 0;}else{lunchTime = 0;dinnerTime = 0.5;}}}if (intRowGhh > 17)//晚上来晚上走{lunchTime = 0;dinnerTime = 0;}if (intRowFmm >= 30) //某点半到  去掉0.5小时{mmTimeGo = -0.5;}if (intRowGmm >= 30) //某点半走  加上0.5小时{mmTimeOff = 0.5;}weekendOvertime = intRowGhh - intRowFhh - lunchTime - dinnerTime + mmTimeGo + mmTimeOff;stringWeekendOvertime = QString::number(weekendOvertime);if (intRowFhh == 0 || intRowGhh == 0){stringWeekendOvertime = "";}stringWrite = stringWeekendOvertime;}else{if (intRowGhh > 17){if (intRowGmm < 30) //30前{weekdayOvertime = intRowGhh - 17 - 0.5;}else{weekdayOvertime = intRowGhh - 17;}stringWeekdayOvertime = QString::number(weekdayOvertime);if (weekdayOvertime < 1) //小于一小时不计入{stringWeekdayOvertime = "";}}else{stringWeekdayOvertime = "";}stringWrite = stringWeekdayOvertime;}//写入数据//获取K*的位置QAxObject *range3 = worksheet->querySubObject("Range(QString)", "K"+ cell);//写入数据, 第*行,第K列range3->setProperty("Value", stringWrite);QAxObject* interior = range3->querySubObject("Interior");interior->setProperty("Color", QColor(150, 150, 0)); //设置单元格背景色QAxObject* border = range3->querySubObject("Borders");border->setProperty("Color", QColor(0, 0, 125)); //设置单元格边框色QAxObject *font = range3->querySubObject("Font"); //获取单元格字体font->setProperty("Color", QColor(255, 0, 0)); //设置单元格字体颜色(红色)font->setProperty("Bold", true);  //设置单元格字体加粗iRows--;qDebug() << "第" << iRows << "行";}//获取K*的位置  //写入数据, 第*行,第K列QAxObject *range3 = worksheet->querySubObject("Range(QString)", "K1");range3->setProperty("Value", "加班时间");QAxObject* interior = range3->querySubObject("Interior");interior->setProperty("Color", QColor(150, 150, 0)); //设置单元格背景色QAxObject* border = range3->querySubObject("Borders");border->setProperty("Color", QColor(0, 0, 125)); //设置单元格边框色QAxObject *font = range3->querySubObject("Font"); //获取单元格字体font->setProperty("Color", QColor(255, 0, 0)); //设置单元格字体颜色(红色)font->setProperty("Bold", true);  //设置单元格字体加粗//另存为//workbook->dynamicCall("SaveAs(const QString &)",QDir::toNativeSeparators(filePath));//close文件//workbook->dynamicCall("Close(Boolean)", false);//excel->dynamicCall("Quit(void)");//delete excel;qDebug() << "Over!!" ;return;
}

main.cpp内容:

#include "OvertimeCalculate.h"
#include <QtWidgets/QApplication>int main(int argc, char *argv[])
{QApplication a(argc, argv);OvertimeCalculate w;w.setWindowTitle("加班计算");//窗体名称w.show();return a.exec();
}

处理结果如图所示:

VS2015+QT Excel相关处理相关推荐

  1. Qt Excel操作

    Qt Excel操作 简单介绍 其他库 基础操作 添加模块 相关代码 遇到的坑 简单介绍 最近在写一个小工具涉及到了Excel操作,顺便学习记录一下.文章内使用的是Windows系统的ActiveX对 ...

  2. vs2015打开EXCEL文档范例及其注意事项!!!

    基于MFC的Dialog创建一个工程: 导入EXCEL相关类资源: 注释 :://#import "C:\\Program Files (x86)\\Microsoft Office\\OF ...

  3. VS2015+QT运行C# dll,出现“错误C2182 “t”: 非法使用“void”类型”的解决方案

    VS2015+QT运行C# dll,出现"错误C2182 "t": 非法使用"void"类型"的解决方案 问题 解决方案 参考链接 问题 项 ...

  4. QT excel导出照片

    QT excel的编写,总是想要导出相应的文字,图片等信息. 导入文字的excel方法: QString fileName = QFileDialog::getSaveFileName(NULL,&q ...

  5. 近日测试发现所有Excel相关功能均会抛异常,查后发现与福昕阅读器不兼容

    近日测试发现所有Excel相关功能均会抛异常,查后发现与福昕阅读器不兼容 参考文章: (1)近日测试发现所有Excel相关功能均会抛异常,查后发现与福昕阅读器不兼容 (2)https://www.cn ...

  6. VS2015+QT环境

    VS2015+QT环境 1.VS2015+Qt环境搭建 1)安装好vs2015,并安装好Qt: 2)在VS中安装Qt插件,该插件由Qt公司提供,可以到Qt官网下载,插件如下图: 3)安装好之后,打开V ...

  7. 【QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结】

    [QT 5 相关实验-仪表盘-学习笔记-表盘组件练习与使用总结] 1.概述 2.实验环境 3.参考资料-致谢 4.自我提升+实验效果 5.代码练习-学习后拆解 (1)头文件部分 (2)绘制事件+绘制表 ...

  8. 解决Vs2015+Qt+obs studio配置软件环境问题汇总

    遇见事情不要慌,打开百度来帮忙!!!!!!!好了,今天又是面向百度编程的一天...... 最近公司项目需要用的vs2015+qt5.8.0的环境进行编程,特此记录一下安装软件,配置环境中遇见的一些问题 ...

  9. VS2015——Qt工程不能生成moc文件的解决办法

    问题:在VS2015开发Qt应用程序时发现,编译器提示无法关联信号槽,无法经过moc工具生成相关函数. 解决办法: 1.找到无法生成转换的槽函数头文件,右键头文件(xxx.h)-->找到属性选项 ...

最新文章

  1. 做人工智能必看的45篇论文 | 附下载地址
  2. java怎么给类中的私有变量赋值_Java核心技术笔记分享------第二章 类与对象
  3. HDU6395 Sequence(矩阵快速幂+数论分块)
  4. python do while语句_python控制语句执行流程(while)
  5. 使用pscp实现Windows 和 Linux服务器间远程拷贝文件
  6. java ftpclient quit_一步一步android(6):关于FtpClient类的学习
  7. 文本输入框的两种div+css的写法
  8. 计算机u启动无法识别,电脑不识别u盘启动盘
  9. c 语言实现链表反转(超详细,有手就行)
  10. 复合函数求导经典例题_导数--复合函数的导数练习题
  11. 河海大学计算机专硕英语面试,河海大学翻译硕士(英语)考研复试流程
  12. 【Kind2(基于SMT的自动模型检查器)学习笔记】基本语法
  13. 学习达人榜:学无止尽,追梦无悔
  14. 第十四期公关大讲堂:公关稿件写作理念、方法与技巧.
  15. TokenInsight 对话首席——加密通证期货世界,究竟是投机还是金融工具?
  16. 网络安全——攻防对抗
  17. 计算机毕业设计论文不会做怎么办?这里送教程送代码送开题送答辩
  18. 树以及二叉树的常用性质以及遍历
  19. Uncaught ReferenceError: Mustache is not defined
  20. 奇偶校验(Parity Check)

热门文章

  1. 如何永久禁止百战沙城,血饮龙纹等流氓软件的安装。
  2. Partition算法
  3. 数据挖掘第八章——聚类分析
  4. 二次元头像生成(DCGAN/WGAN)数据集下载,人工删除部分错误图像.
  5. vue 使用 FullCalendar 实现日程管理 外部拖拽 自定义事件 事件拖拽 缩放 悬浮框 分类
  6. Selenium基础 — 键盘操作
  7. CorelDraw 2019 启动的时候出现尝试重新启动计算机和应用程序.如果这些操作还是不能解决问题
  8. 文件共享之SMB/CIFS协议及Samba的使用
  9. 个人网站微信支付如何在线收款不需要下载监听
  10. 高德地图加渐变色3D线段