借鉴参考文献中的内容,并将其封装成一个ExcelExporter类,除了实现一些基本的写数据的功能,还增加了设置单元格样式、合并单元格的功能。在Qt中使用QAxObject类访问Com组件对象,需要在pro文件中添加下面的内容:

QT       +=axcontainer

Excel对象的主要层次结构:

核心代码:

/*!*新建一个excel表格*/
bool ExcelExporter::newExcel(const QString &fileName)
{pApplication = new QAxObject();bool b = pApplication->setControl("Excel.Application");//连接Excel控件if(!b)return false;pApplication->dynamicCall("SetVisible(bool)", false);//false不显示窗体pApplication->setProperty("DisplayAlerts", false);//不显示任何警告信息。pWorkBooks = pApplication->querySubObject("Workbooks");QFile file(fileName);if (file.exists()){pWorkBook = pWorkBooks->querySubObject("Open(const QString &)", fileName);}else{pWorkBooks->dynamicCall("Add");pWorkBook = pApplication->querySubObject("ActiveWorkBook");}if(!pWorkBook)return false;pSheets = pWorkBook->querySubObject("Sheets");if(!pSheets)return false;pSheet = pSheets->querySubObject("Item(int)", 1);if(!pSheet)return false;return true;
}/*!* 设置最后一个Sheet名字*/
void ExcelExporter::setSheetName(const QString &sheetName)
{if(pSheet)pSheet->setProperty("Name", sheetName);
}/*!*增加一个sheet表*/
void ExcelExporter::appendSheet(const QString &sheetName)
{int sheet_count = pSheets->property("Count").toInt();  //获取工作表数目QAxObject *pLastSheet = pSheets->querySubObject("Item(int)", sheet_count);//获取最后一个工作表pSheet = pSheets->querySubObject("Add(QVariant)", pLastSheet->asVariant());pLastSheet->dynamicCall("Move(QVariant)", pSheet->asVariant());pSheet->setProperty("Name", sheetName);
}/*!*删除一个sheet表*/
void ExcelExporter::deleteSheet(const int index)
{QAxObject *sheet = pSheets->querySubObject("Item(int)", index);if(sheet){sheet->dynamicCall("delete");delete sheet;}
}/*!*设置单元格的值*/
void ExcelExporter::setCellValue(int row, int column, const QString &value)
{QAxObject *pCell = pSheet->querySubObject("Cells(int,int)", row, column);if(pCell){pCell->dynamicCall("Value", value);pCell->setProperty("WrapText", true);  //内容过多,自动换行delete pCell;}
}/*!*设置单元格背景色*/
void ExcelExporter::setCellBackground(int row, int column, const QColor &c)
{QAxObject *pCell = pSheet->querySubObject("Cells(int,int)", row, column);if(pCell){QAxObject* interior = pCell->querySubObject("Interior");interior->setProperty("Color",QVariant::fromValue(c));delete pCell;}
}/*!* 设置单元边框颜色*/
void ExcelExporter::setCellBorder(int row, int column, const QColor &c)
{QAxObject *pCell = pSheet->querySubObject("Cells(int,int)", row, column);if(pCell){QAxObject* border = pCell->querySubObject("Borders");border->setProperty("Color", QVariant::fromValue(c));delete pCell;}
}/*!* 设置行高*/
void ExcelExporter::setCellRowHeight(int row, int column, const int h)
{QAxObject *pCell = pSheet->querySubObject("Cells(int,int)", row, column);if(pCell){pCell->setProperty("RowHeight", h);  //设置单元格行高delete pCell;}
}/*!* 设置列宽*/
void ExcelExporter::setCellColumnWidth(int row, int column, const int w)
{QAxObject *pCell = pSheet->querySubObject("Cells(int,int)", row, column);if(pCell){pCell->setProperty("ColumnWidth", w);  //设置单元格列宽delete pCell;}
}/*!* 合并单元格* \param begRow 起始行* \param begCol 起始列* \param endRow 终止行* \param endCol 终止列*/
void ExcelExporter::mergeCell(int begRow, int begCol, int endRow, int endCol)
{QString merge_cell;convertToColName(begCol,merge_cell);         //初始列merge_cell.append(QString::number(begRow));  //初始行merge_cell.append(":");convertToColName(endCol,merge_cell);         //终止列merge_cell.append(QString::number(endRow));  //终止行QAxObject *merge_range = pSheet->querySubObject("Range(const QString&)", merge_cell);if(!merge_range)return;merge_range->setProperty("HorizontalAlignment", -4108);merge_range->setProperty("VerticalAlignment", -4108);merge_range->setProperty("WrapText", true);merge_range->setProperty("MergeCells", true);  //合并单元格delete merge_range;
}/*!* \brief 把列数转换为excel的字母列号* \param data 大于0的数* \return 字母列号,如1->A 26->Z 27 AA*/
void ExcelExporter::convertToColName(int data, QString &res)
{if(data <=0 || data >= 65535)return;int tempData = data / 26;int mode = data % 26;if(tempData > 0 && mode != 0){convertToColName(tempData,res);convertToColName(mode,res);}else if(tempData > 0 && mode == 0){convertToColName(tempData - 1,res);res += to26AlphabetString(26);}else{res += to26AlphabetString(data);}
}/*!* \brief 数字转换为26字母*        1->A 26->Z* \param data* \return*/
QString ExcelExporter::to26AlphabetString(int data)
{QChar ch = data + 0x40;//A对应0x41return QString(ch);
}/*!*保存*/
void ExcelExporter::saveExcel(const QString &fileName)
{pWorkBook->dynamicCall("SaveAs(const QString &)",QDir::toNativeSeparators(fileName));pWorkBook->dynamicCall("Close(Boolean)", false);  //关闭文件if (pApplication != NULL){pApplication->dynamicCall("Quit()");delete pApplication;pApplication = NULL;}
}

本方法下,写入excel表格时间较长,可能会造成程序假死现象,可以重新开启一个线程来处理这个导出过程。

参考文献中给出了一种快速读写Excel表格的方法。文章分析了导致速度满的原因是当对单元格进行读写,每处理一个单元格都要调用一个Excel子对象,如果读写很多单元格时候,就会造成反复调用而不析构,就会导致处理速度慢。

读取慢的根源就在于sheet->querySubObject("Cells(int, int)", row, col)

试想有10000个单元就得调用10000次querySubObject,网络上90%的教程都没说这个querySubObject产生的QAxObject*最好进行手动删除,虽然在它的父级QAxObject会管理它的内存,但父级不析构,子对象也不会析构,若调用10000次,就会产生10000个QAxObject对象

参考文献:

Qt导出excel

COM组件开发

Qt快速读写Excel

Qt:Qt导出Excel表格相关推荐

  1. 用QT导出Excel表格

    用QT导出Excel表格 前景描述:作者的需求是要在qt开发环境下能把数据导出到Excel表格,原本是打算是用Qt-QAxObject(QAxObject 是Qt提供的包装COM组件的类,通过COM操 ...

  2. Qt高仿Excel表格组件-支持冻结列、冻结行、内容自适应和合并单元格

    目录 一.概述 二.效果展示 三.实现思路 1.冻结行.冻结列 2.行高自适应 3.蚂蚁线 四.测试代码 1.添加表格数据 2.设置冻结行.列 3.行高.列宽 4.单元格背景色 5.单元格文字 6.其 ...

  3. elementui中有导出组件吗_Element-ui组件库Table表格导出Excel表格

    安装 npm install --save xlsx file-saver 两个插件的详细地址在下面 https://github.com/SheetJS/js-xlsx https://github ...

  4. 使用NPOI将数据库里信息导出Excel表格并提示用户下载

    使用NPOI进行导出Excel表格大家基本都会,我在网上却很少找到导出Excel表格并提示下载的 简单的代码如下 1 //mvc项目可以传多个id以逗号相隔的字符串2 public ActionRes ...

  5. java中使用jxl导出Excel表格详细通用步骤

    该方法一般接收两个参数,response和要导出的表格内容的list. 一般我们将数据库的数据查询出来在页面进行展示,根据用户需求,可能需要对页面数据进行导出. 此时只要将展示之前查询所得的数据放入s ...

  6. php 导出csv设置列宽度,php数据库导出excel表格数据-php从数据库导出csv格式的Excel表格是,字段本身就......

    PHP如何将查询出来的数据导出成excel表格(最好做... $objPHPExcel->getActiveSheet()->getDefaultColumnDimension(A)-&g ...

  7. java 导出excel教程_Java导出Excel表格

    Java导出Excel表格 导出Excel表格需要一个poi-3.9.jar的包,该包在网上可以找到. 第一步,创建Excel对象. HSSFWorkbook workbook = new HSSFW ...

  8. com.alibaba.easyexcel导出指定的列_使用Python导入导出Excel表格

    这篇文章的目的是讲解使用python导入导出Excel表格,目前还不涉及数据处理,主要实现为数据的展示. 第一步,准备材料 python3.8的安装包 一个Excel表格 第二步,安装软件 pytho ...

  9. 使用python将数据导出excel表格

      python可用于数据分析,有时候获得了数据需要导出以作其他作用.本文就介绍python导出excel表格的方法.   导出excel表格,python提供了两个库:xlwt,xlrd.本文只讨论 ...

  10. java代码实现导出Excel表格、工具ssm框架、maven、idea

    第一步.导入依赖 <!--生成excel文件--><dependency><groupId>org.apache.poi</groupId><ar ...

最新文章

  1. HTML5本地存储IndexedDB基础使用
  2. php获取当前时间的毫秒数,并且利用它测试代码段执行时间
  3. 动态的添加和丢弃关键点---32
  4. eclipse开发javaweb项目配置tomcat
  5. cgi备份还原和ghost有什么区别_手动GHOST还原重装系统详细教程
  6. IOS+Android马甲包封装上架!
  7. android 请求网络异步载入
  8. egg框架访问 Mysql 数据库 egg-mysql 增删改查
  9. 如何保证企业IT基础设施的高可用性
  10. 在CentOs 5.1中使用rpm安装NGINX+php+mysql(二)
  11. CentOS 7部署 Ceph分布式存储架构
  12. 力扣算法题—071简化路径
  13. 怎么用计算机解锁手机密码华为,华为手机忘记解锁密码如何解锁?两招轻松搞定...
  14. 等保2.0三级物联网安全扩展要求
  15. 用量子物理学原理解释为什么振金可以吸收能量(论发散思维的重要性)
  16. 【转载】阿里面试回来,想和Java程序员谈一谈
  17. STL剖析(二):容器底层数据结构及常见用法
  18. 集赞神器!朋友圈集赞一键秒搞定!从此集赞随心所欲!
  19. 银河麒麟桌面操作系统V10上安装使用MySQL5.7、MySQL Workbench
  20. 进销存系统--ERP软件常用货物计量单位汇总

热门文章

  1. android 手机分区失败怎么办,一种Android系统Data分区自修复方法及系统专利_专利查询 - 天眼查...
  2. leetcode387题解
  3. 回归算法(最小二乘法拟合)
  4. onsubmit函数触发事件
  5. 域名解析协议-DNS
  6. PAT(乙级)2022年夏季考试
  7. 初学数据治理必读书单(2022年版本)
  8. Java***冒泡排序***
  9. vue3之定义数据(Ref全家桶)
  10. python invoking c++