写 excel

    // step1:连接控件
QAxObject* excel = new QAxObject(this);
excel->setControl("Excel.Application"); // 连接Excel控件
excel->dynamicCall("SetVisible (bool Visible)", "false"); // 不显示窗体
excel->setProperty("DisplayAlerts", false); // 不显示任何警告信息。如果为true, 那么关闭时会出现类似"文件已修改,是否保存"的提示 // step2: 打开工作簿
QAxObject* workbooks = excel->querySubObject("WorkBooks"); // 获取工作簿集合
workbooks->dynamicCall("Add"); // 新建一个工作簿
QAxObject* workbook = excel->querySubObject("ActiveWorkBook"); // 获取当前工作簿 // step3: 打开sheet
QAxObject* worksheet = workbook->querySubObject("WorkSheets(int)", ); // 获取工作表集合的工作表1, 即sheet1 QAxObject* cell = worksheet->querySubObject("Cells(int, int)", , ); cell->dynamicCall("SetValue(conts QVariant&)", QVariant()); workbook->dynamicCall("SaveAs(const QString&)",QDir::currentPath() + "/IMEI.xlsx");
workbook->dynamicCall("Save()"); //保存文件
workbook->dynamicCall("Close(Boolean)", false); //关闭文件 delete excel;

读 excel

    QAxObject excel("Excel.Application");
excel.setProperty("Visible", false); //隐藏打开的excel文件界面
QAxObject *workbooks = excel.querySubObject("WorkBooks");
QAxObject *workbook = workbooks->querySubObject("Open(QString, QVariant)", QDir::currentPath() + "/IMEI.xls"); //打开文件
QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", ); //访问第一个工作表
QAxObject * usedrange = worksheet->querySubObject("UsedRange");
QAxObject * rows = usedrange->querySubObject("Rows");
int intRows = rows->property("Count").toInt(); //行数
qDebug() << "使用了 " << intRows << " 行"; QString Range = "A1:B" +QString::number(intRows);
QAxObject *allEnvData = worksheet->querySubObject("Range(QString)", Range); //读取范围
QVariant allEnvDataQVariant = allEnvData->property("Value");
QVariantList allEnvDataList = allEnvDataQVariant.toList(); for(int i=; i< intRows; i++)
{
QVariantList allEnvDataList_i = allEnvDataList[i].toList() ;
QString data1 = allEnvDataList_i[].toString(); //第i行第0列的数据
qDebug() << data1;
}
workbooks->dynamicCall("Close()");
excel.dynamicCall("Quit()");

如果出现以下情况,可能是所选的Excel控件不支持要打开的excel文件(.xls、.xlsx)

读写 excel

    QAxObject *excel = new QAxObject("Excel.Application");
uint8_t flag = ;
excel->setProperty("Visible", false); //隐藏打开的excel文件界面
QAxObject *workbooks = excel->querySubObject("WorkBooks"); QFile file_xls(QDir::currentPath() + "/IMEI.xls");
QAxObject *workbook;
if(file_xls.exists())
{
qDebug() << "文件已存在";
workbook = workbooks->querySubObject("Open(QString, QVariant)", QDir::currentPath() + "/IMEI.xls"); //打开文件
}else
{
qDebug() << "文件不存在,创建一个";
workbooks->dynamicCall("Add"); // 新建一个工作簿
workbook = excel->querySubObject("ActiveWorkBook"); // 获取当前工作簿
} QAxObject * worksheet = workbook->querySubObject("WorkSheets(int)", ); //访问第一个工作表
QAxObject * usedrange = worksheet->querySubObject("UsedRange");
QAxObject * columns = usedrange->querySubObject("Columns");
columns->dynamicCall("AutoFit");
QAxObject * rows = usedrange->querySubObject("Rows");
int intRows = rows->property("Count").toInt(); //行数,实际使用0行或者1行,这个值都是1
QString Range = "A1:B" +QString::number(intRows);
QAxObject *allEnvData = worksheet->querySubObject("Range(QString)", Range); //读取范围
QVariant allEnvDataQVariant = allEnvData->property("Value");
QVariantList allEnvDataList = allEnvDataQVariant.toList(); QString data;
for(int i=; i< intRows; i++)
{
QVariantList allEnvDataList_i = allEnvDataList[i].toList() ;
data = allEnvDataList_i[].toString(); //第i行第1列的数据
if(data == IMEI_str)
{
flag = ;
qDebug() << "excel 内已含此 IMEI";
break;
}
qDebug() << data;
}
if((data == "") && (intRows == ))
{
intRows = intRows -;
}
qDebug() << "使用了 " << intRows << " 行";
if(flag == )
{
QAxObject* cell = worksheet->querySubObject("Cells(int, int)", intRows+, );
cell->setProperty("NumberFormatLocal", "@"); // 设置为文本
cell->dynamicCall("SetValue(conts QVariant&)", QVariant(IMEI_str));
} if(!file_xls.exists())
{
workbook->dynamicCall("SaveAs(const QString&)",QDir::currentPath() + "/IMEI.xls");
}
workbook->dynamicCall("Close(Boolean)", true); //true为关闭前保存
excel->dynamicCall("Quit()");
delete excel;

Qt ------ excel 操作的更多相关文章

  1. Qt QAxObject操作excel文件过程总结(转):

    正好同事问道Qt下操作excel. 转自:http://blog.csdn.net/a156392343/article/details/48092515 配制方面: 1.确保Excel软件在本地服务 ...

  2. Qt之操作Excel

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

  3. Qt之excel 操作使用说明

    学习背景: 适合熟悉些qt开发,但是不是深入了解的开发者学习.具体实现(qt 5.1版本),office2007 Excel做验证,Win 7(64位),如有讲解有误,欢迎斧正! 一.简单介绍 QAx ...

  4. Npoi导入导出Excel操作

    之前公司的一个物流商系统需要实现对订单的批量导入和导出,翻阅了一些资料,最后考虑使用NPOI实现这个需求. 在winform上面实现excel操作:http://www.cnblogs.com/Cal ...

  5. Delphi Excel 操作大全

    Delphi Excel 操作大全 (一) 使用动态创建的方法首先创建 Excel 对象,使用ComObj:var ExcelApp: Variant;ExcelApp := CreateOleObj ...

  6. C#EXCEL 操作类--C#ExcelHelper操作类

    主要功能如下1.导出Excel文件,自动返回可下载的文件流 2.导出Excel文件,转换为可读模式3.导出Excel文件,并自定义文件名4.将数据导出至Excel文件5.将指定的集合数据导出至Exce ...

  7. Excel 操作类

    转载:http://www.cnblogs.com/fellowcheng/archive/2010/08/21/1805158.html ExcelHelper(Excel2007) Code hi ...

  8. C# excel操作

    开源的Excel操作项目: http://www.cnblogs.com/lwme/archive/2011/11/27/2265323.html 添加引用:Microsoft Excel 11.0 ...

  9. [Excel操作]Microsoft Office Excel 不能访问文件

    最近,客户服务器迁移,因操作系统环境变化而引起的的环境问题一堆,遇到的问题并解决方法在“[Excel]操作”类别会体现. Microsoft Office Excel 不能访问文件“C:\\LMSEx ...

随机推荐

  1. js对日期的判断

    在初始页面获取倒当前时间并向前推N天后作为起始时间       function date(){          var myDate = new Date();          //获取当前时间 ...

  2. PC平台主要SIMD扩展发展简史

    Single Instruction Multiple Data,简称SIMD.SIMD描述的是微处理器中单条指令能完成对数据的并行处理.SIMD所使用的是特殊的寄存器,一个寄存器上存储有多个数据,在 ...

  3. 二、Java多人博客系统-演变

    任何项目都是由小到大,逐步演变的.自己写的这个博客系统也不例外. 更新日志如下: 一.2014年底-2015年初 功能及技术: 1.定位为个人网站,介绍自己情况和发布文章等. 2.首页模块有:个人简介 ...

  4. socket跟TCP/IP 的关系,单台服务器上的并发TCP连接数可以有多少

    常识一:文件句柄限制 在Linux下编写网络服务器程序的朋友肯定都知道每一个tcp连接都要占一个文件描述符,一旦这个文件描述符使用完了,新的连接到来返回给我们的错误是"Socket/File ...

  5. Codeforces Round #445 Div. 1

    A:每次看是否有能走回去的房间,显然最多只会存在一个,如果有走过去即可,否则开辟新房间并记录访问时间. #include<iostream> #include<cstdio> ...

  6. BZOJ2877 NOI2012魔幻棋盘(二维线段树)

    显然一个序列的gcd=gcd(其差分序列的gcd,序列中第一个数).于是一维情况直接线段树维护差分序列即可. 容易想到将该做法拓展到二维.于是考虑维护二维差分,查询时对差分矩阵求矩形的gcd,再对矩形 ...

  7. HDU 1556-Color the ball-树状数组

    树状数组的成段更新. 首先要明白,insert函数的意思是更新某一点值,query函数的意思是从起点到某一点的和. 更新[a,b]段时,在a点插入一个1,在b+1点插入一个-1.这时,query(a) ...

  8. 树形DP和状压DP和背包DP

    树形DP和状压DP和背包DP 树形\(DP\)和状压\(DP\)虽然在\(NOIp\)中考的不多,但是仍然是一个比较常用的算法,因此学好这两个\(DP\)也是很重要的.而背包\(DP\)虽然以前考的次 ...

  9. Nginx 网站域名80 反向代理并且重定向到 tomcat 8080 网站固定页

    配置 server { listen 80 default_server; listen [::]:80 default_server; server_name :127.0.0.1:8080; 反向 ...

  10. 【Gym 100971G】Repair

    BUPT 2017 summer training (for 16) #1B 题意 Alex is repairing his country house. He has a rectangular ...