qt对excel的基本操作
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的基本操作相关推荐
- c++ qt 操作Excel 实现冻结窗格的功能。
使用qt操作Excel的一些基本操作内容我就不介绍了,你们搜一下就可以了,如果不想麻烦可以去下面这个链接地址看一下. qt操作Excel基础使用技巧 本文主要讲一个知识点,就是使用qt操作Excel实 ...
- 一文搞定Qt读写excel以及qt读写xml数据
一文搞定Qt读写excel以及qt读写xml数据 最终的实现效果图 RC_ICONS = logo.ico .pro文件同级目录下加入 logo.ico 图标文件,运行文件,文件的图标就被写入软件 u ...
- QT之Excel表格操作
QT之Excel表格操作 提前准备 打开读取excel文件 写入保存excel文件 提前准备 pro文件中添加: QT += axcontainer 在需要使用excel的文件中添加: #includ ...
- Qt:Qt导出Excel表格
借鉴参考文献中的内容,并将其封装成一个ExcelExporter类,除了实现一些基本的写数据的功能,还增加了设置单元格样式.合并单元格的功能.在Qt中使用QAxObject类访问Com组件对象,需要在 ...
- Qt 设置Excel单元格文本属性
前段时间通过Qt设置Excel的内容,每次设置 1-3 这种内容的时候,会被Excel自动转为日期格式. 后来查了一下,可以设置单元格为文本属性,显示内容与输入内容保持一致. 需要先设置单元格的格式再 ...
- 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 ...
- QT 制作 Excel 表格常用操作方法
Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件. ...
- qt与excel 一去二三里整理
Visual Basic for Applications(VBA)是一种Visual Basic的一种宏语言,主要能用来扩展Windows的应用程式功能,特别是Microsoft Office软件. ...
- linux qt写入excel文件内容,Qt 读取Excel表格数据 生成Excel表格并写入数据
Qt 读取Excel表格数据 生成Excel表格并写入数据 Qt 读取Excel表格数据 生成Excel表格并写入数据 修改.pro文件,增加 axcontainer QT += axcontaine ...
最新文章
- 小说里的lt什么意思_脂肪醇里的脂肪是什么意思
- 厉害!Java集合框架综述,这篇让你吃透!
- java获取gbk文件名 linux_Java读取linux系统中文文件名时候乱码,并显示文件不存在...
- 深入理解HashMap和LinkedHashMap的区别
- Caffe:导入caffePython-PyQt failed
- Java JDK 安装配置
- Linux Crontab 定时任务 及 Ubuntu 中cron指令使用
- CDOJ 1803 绿帽自动机 思维题
- exchange 2010 relay设定
- linux定时任务crontab的设置
- C/C++语言编程修养
- 采用C#泛型实现数据库之间的切换
- 联想拯救者y7000p加内存条_内存、硬盘不够用?手把手教你升级联想拯救者Y7000P...
- java最大值代码_Java中求最大值的4种方法实例代码
- 小型微型计算机系统杂志好投么,小型微型计算机系统杂志
- 当python遇上echarts (三)绘制3D图表
- 五种常见的嵌入式操作系统
- [luogu2294] [HNOI2005]狡猾的商人
- 详细了解软件测试过程中的V 模型,W模型,H模型
- win8(四)实例讲解win8(XAML+C#)开发--------课程表:Snapped模式和动态磁贴,徽章(badge)