qt对excel的基本操作

1.环境

1.1 配置方面

​ ① 确保Excel软件在本地服务器注册成功,没注册成功的可以通过 在运行中"E:\program Files\Microsoft Office\Office12\EXCEL.EXE" /regserver 手动注册,注意路径要用自己的excel路径。

​ ② 确保组件配制正确,运行命令:dcomcnfg,查看DCOM配置下是否有Microsoft Excel Application,有的话万事大吉,开始设置(1)常规,身份验证:无(2)安全、配制权限自定义,控制权限,完全控制选中,保存

2.指令

2.1 常用操作指令

连接Excel控件

QAxWidget excel(“Excel.Application”);

显示当前窗口:
excel.setProperty(“Visible”, true);

更改 Excel 标题栏:
excel.setProperty(“Caption”, “Invoke Microsoft Excel”);

不显示任何警告信息

setProperty(“DisplayAlerts”,0)

添加新工作簿:
QAxObject * workbooks = excel.querySubObject(“WorkBooks”);
workbooks->dynamicCall(“Add”);

打开已存在的工作簿:
workbooks->dynamicCall(“Open (const QString&)”, QString(“c:/test.xls”));

获取活动工作簿:
QAxObject * workbook = excel.querySubObject(“ActiveWorkBook”);

获取所有的工作表:
QAxObject * worksheets = workbook->querySubObject(“WorkSheets”);

获取工作表数量:
int intCount = worksheets->property(“Count”).toInt();

获取第一个工作表:
QAxObject * worksheet = workbook->querySubObject(“Worksheets(int)”, 1);

获取cell的值:
QAxObject * range = worksheet->querySubObject(“Cells(int,int)”, 1, 1 );

获取已使用区域

m_pworksheet->querySubObject(“UsedRange”)

获取行数

QAxObject *rows = usedrange->querySubObject(“Rows”);

int nRows = rows->property(“Count”).toInt();

获取列数

QAxObject *columns = usedrange->querySubObject(“Columns”);

int nCols = columns->property(“Count”).toInt();

2.2 设置单元格属性

QAxObject *pCell = work_sheet->querySubObject("Range(const QString&)", "A1:C1");
if (pCell)
{                       //字体对齐(居中)pCell ->setProperty("HorizontalAlignment", -4108);//左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152pCell ->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107//设置字体QAxObject *font = pCell->querySubObject("Font");  //获取单元格字体font->setProperty("Bold", true);  //字体加粗font->setProperty("Name", QStringLiteral("华文彩云"));  //设置单元格字体font->setProperty("Bold", true);  //设置单元格字体加粗font->setProperty("Size", 20);  //设置单元格字体大小font->setProperty("Italic", true);  //设置单元格字体斜体font->setProperty("Underline", 2);  //设置单元格下划线font->setProperty("Color", QColor(255, 0, 0));  //设置单元格字体颜色(红色)//设置单元格背景色(灰色)QColor bkColor(125, 125, 125);QAxObject* interior = pCell->querySubObject("Interior");interior->setProperty("Color", bkColor);//绘制单元格边框(黑色)QAxObject* border = pCell->querySubObject("Borders");border->setProperty("Color", QColor(0, 0, 0)); //创建组QAxObject* rows = pCell->querySubObject("Rows");rows->querySubObject("Group");
}//宽度自适应
auto range = work_sheet->querySubObject("UsedRange");
QAxObject * cells = range->querySubObject("Columns");
if (cells)
{cells->dynamicCall("AutoFit");
}   //设置单元格格式(文本)
QAxObject *oRange = work_sheet->querySubObject("Range(QString)", "A1:A99");
if (oRange)
{oRange->setProperty("NumberFormatLocal", "@");
}oRange = work_sheet->querySBubObject("Range(QString)", "A1:B1");
if (oRange)
{pCell ->setProperty("WrapText", true); //内容过多,自动换行pCell ->setProperty("MergeCells", true); //合并单元格//pCell ->setProperty("MergeCells", false);  //拆分单元格//pcell->dynamicCall("ClearContents()");  //清空单元格内容
}

3.问题

3.1 Open失败

querySubObject(“Open(QString&)”,“path”)命令执行是出现如下异常信息

报错:800706BE 远程过程调用失败

描述:改报错在dynamicCall(“SetVisible(bool)”, true)时不会报错

去掉下面pdf的勾选

4.excel操作

4.1 初始化excel环境

连接COM组件,设置基本属性

int InitExcel()
{
#ifdef Q_OS_WINCoInitialize(nullptr);m_pExcel = new QAxObject();bool b_ret = m_pExcel->setControl("Excel.Application");if (!b_ret){b_ret = m_pExcel->setControl("ket.Application");if (!b_ret){return -1;}}m_pExcel->dynamicCall("SetVisible(bool)", false);m_pExcel->setProperty("DisplayAlerts", false);m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");if (!m_pWorkBooks){CloseExcel();return -2;}return 0;
#elsereturn -1;
#endif
}

4.2 打开Excel

int OpenExcel(const QString& path)
{int i_ret = 0;
#ifdef Q_OS_WINi_ret = InitExcel();if (0 != i_ret){return -1;}CloseWorkBook();QFile file(path);if (!file.exists()){CreateExcel(path);}else{m_pWorkBook = m_pWorkBooks->querySubObject("Open(QString&)", QDir::toNativeSeparators(path));if (!m_pWorkBook){return -2;}}file.close();m_pWorkSheets = m_pWorkBook->querySubObject("Sheets");if (!m_pWorkSheets){return -3;}m_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)", 1);if (!m_pWorkSheet){return -4;}m_sFileName = path;return 0;
#elsereturn -1;
#endif
}//关闭workbook
void CloseWorkBook()
{
#ifdef Q_OS_WINif (m_pWorkBook){QVariant ret = m_pWorkBook->dynamicCall("Close()");}
#endif
}void CreateExcel(const QString &path)
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkBooks);if (m_pWorkBooks){m_pWorkBooks->dynamicCall("Add");m_pWorkBook = m_pExcel->querySubObject("ActiveWorkBook");SaveAsExcel(path);}
#endif
}

4.3 另存为

int SaveAsExcel(const QString& path)
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkBook);try{if (m_pWorkBook){QVariant ret = m_pWorkBook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(path));if (ret.toBool()){return 0;}}}catch (...){return -2;}return -1;
#elsereturn -1;
#endif
}

4.4 关闭Excel

void CloseExcel()
{m_sFileName = "";#ifdef Q_OS_WINQ_ASSERT(m_pWorkBooks);Q_ASSERT(!m_pWorkBooks->isNull());if (m_pWorkBooks && !m_pWorkBooks->isNull()){QVariant ret = m_pWorkBooks->dynamicCall("Close()");}if (m_pExcel){QVariant ret = m_pExcel->dynamicCall("Quit()");}RELEASE_POINTER(m_pWorkSheet);RELEASE_POINTER(m_pWorkSheets);RELEASE_POINTER(m_pWorkBook);RELEASE_POINTER(m_pWorkBooks);RELEASE_POINTER(m_pExcel);CoUninitialize();
#endif
}

4.5 宽度自适应

int ColumnAutoFit()
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheet);Q_ASSERT(!m_pWorkSheet->isNull());if (m_pWorkSheet && !m_pWorkSheet->isNull()){try{QAxObject *rang = m_pWorkSheet->querySubObject("UsedRange");QAxObject *columns = rang->querySubObject("Columns");if (columns){QVariant var = columns->dynamicCall("AutoFit");RELEASE_POINTER(columns);}RELEASE_POINTER(rang);}catch (...){return -2;}return 0;}return -1;
#elsereturn -1;
#endif
}

4.6 获取工作表数量

int GetWorkSheetCount()
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheets);Q_ASSERT(!m_pWorkSheet->isNull());if (m_pWorkSheets && !m_pWorkSheet->isNull()){return m_pWorkSheets->property("Count").toInt();}return -1;
#elsereturn -1;
#endif
}

4.7 读取所有数据

int ReadAll(QList<QList<QVariant>> &list)
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheets);Q_ASSERT(!m_pWorkSheet->isNull());if (!m_pWorkSheet && m_pWorkSheet->isNull()){return -1;}list.clear();QAxObject* usedRange = m_pWorkSheet->querySubObject("UsedRange");//auto var = usedRange->dynamicCall("Value()");auto var = usedRange->property("Value2");auto rowList = var.toList();for (auto rowData : rowList){auto subData = rowData.toList();QList<QVariant> subList;for (auto data : subData){subList.push_back(data);}list.push_back(subList);}RELEASE_POINTER(usedRange);return 0;
#elsereturn -1;
#endif
}

4.8 将List数据写入表格

int Write(const QList<QList<QVariant>> &data, bool overwrite)
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheets);Q_ASSERT(!m_pWorkSheet->isNull());if (data.size() <= 0){return -1;}if (!m_pWorkSheet && m_pWorkSheet->isNull()){return -2;}QVariantList variantList;for (size_t i = 0; i < data.size(); i++){variantList.push_back(data.at(i));}QVariant variant = (QVariant)variantList;int i_row = data.size();int i_col = data.at(0).size();int i_row_start = 1;int i_row_count = 0;if (!overwrite){i_row_count = GetRowCount();i_row_start = i_row_count + 1;}QString strRang;ConvertToColName(i_col, strRang);strRang += QString::number(i_row + i_row_count);strRang = QString("A%1:").arg(i_row_start) + strRang;try{QAxObject *range = m_pWorkSheet->querySubObject("Range(const QString&)", strRang);range->setProperty("Value2", variant);range->setProperty("WrapText", true); //内容过多自动换行range->setProperty("NumberFormatLocal", "@"); //设置单元格格式(文本)range->setProperty("HorizontalAlignment", -4108);//左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152range->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107QAxObject *border = range->querySubObject("Borders");border->setProperty("Color", QColor(0, 0, 0)); //设置边框颜色RELEASE_POINTER(border);RELEASE_POINTER(range);}catch (...){return -3;}return 0;
#elsereturn -1;
#endif
}//
QString ConvertToLetters(int data)
{QChar ch = data + 0x40; //A对应0x41return QString(ch);
}void ConvertToColName(int data, QString &res)
{
#ifdef Q_OS_WINQ_ASSERT(data > 0 && data < 65535);int tempData = data / 26;if (tempData > 0){int mode = data % 26;ConvertToColName(mode, res);ConvertToColName(tempData, res);}else{res = ConvertToLetters(data) + res;}
#endif
}

4.9 获取某个单元格的数据

int GetCellValue(const int row, const int column, QVariant &value)
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheet);Q_ASSERT(!m_pWorkSheet->isNull());if (!m_pWorkSheet && !m_pWorkSheet->isNull()){return -1;}try{QAxObject *range = m_pWorkSheet->querySubObject("Cells(int,int)", row, column);auto var = range->property("Value2");value = var;RELEASE_POINTER(range);}catch (...){return -2;}return 0;
#elsereturn -1;
#endif
}

4.10 设置某个单元格的数据

int SetCellValue(const int row, const int column, const QVariant &value)
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheet);Q_ASSERT(!m_pWorkSheet->isNull());if (!m_pWorkSheet && !m_pWorkSheet->isNull()){return -1;}try{QAxObject *range = m_pWorkSheet->querySubObject("Cells(int,int)", row, column);bool ret = range->setProperty("Value2", value);RELEASE_POINTER(range);}catch (...){return -2;}return 0;
#elsereturn -1;
#endif
}

4.11 设置当前操作worksheet序号


int SetWorkSheetNum(const int num)
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkBook);Q_ASSERT(!m_pWorkBook->isNull());if (!m_pWorkBook && !m_pWorkBook->isNull()){return -1;}if (m_pWorkSheet){    RELEASE_POINTER(m_pWorkSheet);}try{m_pWorkSheet = m_pWorkBook->querySubObject("Worksheets(int)", num);}catch (...){return -2;}return 0;
#elsereturn -1;
#endif
}

4.12 获取总列数

int GetColumnCount()
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheet);if (m_pWorkSheet && !m_pWorkSheet->isNull()){int nCols = 0;try{QAxObject *usedRange = m_pWorkSheet->querySubObject("UsedRange");QAxObject *columns = usedRange->querySubObject("Columns");nCols = columns->property("Count").toInt();RELEASE_POINTER(columns);RELEASE_POINTER(usedRange);}catch (...){return -2;}return nCols;}return -1;
#elsereturn -1;
#endif
}

4.13 获取总行数

int GetRowCount()
{
#ifdef Q_OS_WINQ_ASSERT(m_pWorkSheet);if (m_pWorkSheet){int nRows = 0;try{QAxObject *usedRange = m_pWorkSheet->querySubObject("UsedRange");if (usedRange){QAxObject *rows = usedRange->querySubObject("Rows");if (rows){nRows = rows->property("Count").toInt();RELEASE_POINTER(rows);}      RELEASE_POINTER(usedRange);}}catch (...){return -2;}return nRows;}return -1;
#elsereturn -1;
#endif
}

qt对excel的基本操作相关推荐

  1. c++ qt 操作Excel 实现冻结窗格的功能。

    使用qt操作Excel的一些基本操作内容我就不介绍了,你们搜一下就可以了,如果不想麻烦可以去下面这个链接地址看一下. qt操作Excel基础使用技巧 本文主要讲一个知识点,就是使用qt操作Excel实 ...

  2. 一文搞定Qt读写excel以及qt读写xml数据

    一文搞定Qt读写excel以及qt读写xml数据 最终的实现效果图 RC_ICONS = logo.ico .pro文件同级目录下加入 logo.ico 图标文件,运行文件,文件的图标就被写入软件 u ...

  3. QT之Excel表格操作

    QT之Excel表格操作 提前准备 打开读取excel文件 写入保存excel文件 提前准备 pro文件中添加: QT += axcontainer 在需要使用excel的文件中添加: #includ ...

  4. Qt:Qt导出Excel表格

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

  5. Qt 设置Excel单元格文本属性

    前段时间通过Qt设置Excel的内容,每次设置 1-3 这种内容的时候,会被Excel自动转为日期格式. 后来查了一下,可以设置单元格为文本属性,显示内容与输入内容保持一致. 需要先设置单元格的格式再 ...

  6. Qt Xlsx使用教程、Qt操作Excel、Qt生成Excel图表、跨平台不依赖Office

    文章目录 1.Qt Xlsx库简介 2. 用法①:使用Xlsx作为Qt5的附加模块 2.1 构建模块 2.2 下载QtXlsx源代码 2.3 为编译器安装Xlsx模块 2.3.1 打开 MinGW 7 ...

  7. QT 制作 Excel 表格常用操作方法

    Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件. ...

  8. qt与excel 一去二三里整理

    Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件. ...

  9. linux qt写入excel文件内容,Qt 读取Excel表格数据 生成Excel表格并写入数据

    Qt 读取Excel表格数据 生成Excel表格并写入数据 Qt 读取Excel表格数据 生成Excel表格并写入数据 修改.pro文件,增加 axcontainer QT += axcontaine ...

最新文章

  1. 小说里的lt什么意思_脂肪醇里的脂肪是什么意思
  2. 厉害!Java集合框架综述,这篇让你吃透!
  3. java获取gbk文件名 linux_Java读取linux系统中文文件名时候乱码,并显示文件不存在...
  4. 深入理解HashMap和LinkedHashMap的区别
  5. Caffe:导入caffePython-PyQt failed
  6. Java JDK 安装配置
  7. Linux Crontab 定时任务 及 Ubuntu 中cron指令使用
  8. CDOJ 1803 绿帽自动机 思维题
  9. exchange 2010 relay设定
  10. linux定时任务crontab的设置
  11. C/C++语言编程修养
  12. 采用C#泛型实现数据库之间的切换
  13. 联想拯救者y7000p加内存条_内存、硬盘不够用?手把手教你升级联想拯救者Y7000P...
  14. java最大值代码_Java中求最大值的4种方法实例代码
  15. 小型微型计算机系统杂志好投么,小型微型计算机系统杂志
  16. 当python遇上echarts (三)绘制3D图表
  17. 五种常见的嵌入式操作系统
  18. [luogu2294] [HNOI2005]狡猾的商人
  19. 详细了解软件测试过程中的V 模型,W模型,H模型
  20. win8(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)

热门文章

  1. Tapestry经典入门教程
  2. oracle数据库user表空间不足,oracle 表空间不足解决办法大全
  3. 微服务下的几个难点问题及常见的解决方案
  4. 使用LSV制作KML文件教程
  5. 使地方坐标系BIM模型与CAD严格在LSV内对准
  6. android微信小程序自动填表_微信小程序自动化实战(一)
  7. EXCEL散点图怎么做
  8. 服务器u盘安装linux6.7,U盘如何安装centos7系统?U盘安装centos7详细安装图解教程...
  9. tieredImageNet 数据集介绍
  10. JAVA中多态的理解