在工程文件(pro文件)中加入QT += axcontainer
在源文件中加入相关头文件
#include <QFileDialog>
#include <QAxObject>
获取Excel文件,代码如下:
QString strFile = QFileDialog::getOpenFileName(this,QStringLiteral("选择Excel文件"),"",tr("Exel file(xls xlsx)"));
if (strFileisEmpty())
{
return;
}
获取Excel驱动,以及表格信息。代码如下:
QAxObject excel("ExcelApplication"); //加载Excel驱动
excelsetProperty("Visible", false); //不显示Excel界面,如果为true会看到启动的Excel界面
QAxObject pWorkBooks = excelquerySubObject("WorkBooks");
pWorkBooks->dynamicCall("Open (const QString&)", strFile);//打开指定文
QAxObject pWorkBook = excelquerySubObject("ActiveWorkBook")
QAxObject pWorkSheets = pWorkBook->querySubObject("Sheets");//获取工作表
int nSheetCount = pWorkSheets->property("Count")toInt(); //获取工作表的数目
分区域获取Excel表格中的内容,最后一定要关闭Excel文件,不然该文件会一直处于“只读”状态。代码如下:
if(nSheetCount > 0)
{
QAxObject pWorkSheet = pWorkBook->querySubObject("Sheets(int)", 1);//获取第一张表
int nSection = 20;
int nSectionEnd = 0;
QVariantList params;
int nRowEnd = 20;
QVariant varData; for (int i = 1; i <= nRowEnd; i += nSection)
{
nSectionEnd = i+nSection - 1;
if (nSectionEnd > nRowEnd)
{
nSectionEnd = nRowEnd;
}
char cZimu = 1 + 64; //1-26分别代表A-Z,符合Excel表的列标识
//Ai至Ai+nSectionEnd的数据,这里为了测试一次是读取20条
params <<QString("%1%2")arg(cZimu)arg(i)<<QString("%1%2")arg(cZimu)arg(nSectionEnd)
QAxObject pCell = pWorkSheet->querySubObject("Range(QVariant,QVariant)",params);
varData = pCell->dynamicCall("Value2()"); qDebug()<<varData;
}
pWorkBooks->dynamicCall("Close()");
测试文档已经读出结果如图,可以发现我们读出的数据包含了三层外衣。前两层都是QVariantList。
为了取出正确的数据,我们需要剥开这些外衣。该代码写在for循环之后。代码如下:
QVariantList varList = varDatatoList(); //解除第一层List
if(varListcount() <= 0)//防止内存溢出
{
qDebug()<<"无数据!";
pWorkBooks->dynamicCall("Close()");
return;
}
QVariantList varLstData = varList[0]toList(); //解除第二层List if(varLstDatacount() <= 0)
{
qDebug()<<"无数据!";
pWorkBooks->dynamicCall("Close()");
return;
}
//判断数据类型,防止转化出错。
if(QString(varLstData[0]typeName()) == "QString")
{
QString str = varLstData[0]toString(); //取出数据
qDebug()<<"字符串:"+str;
}
if(QString(varLstData[0]typeName()) == "double")
{
double dData = varLstData[0]toDouble(); //取出数据
qDebug()<<dData; //注意,int型读出来也是double,所以一定要注意转化 }
8
取出数据的结果如图。
1、首先建议你不要传入到Object对象,既然你知道他们有共同的父类(假设名字叫A),那么你就应该传入到A对象。这样你就可以调用A的query方法。
2、如果你一定要用Object对象,那么,你可以
if (xxx instanceof A) {
A a = (A) xxx;
// TODO
}
在上述TODO的位置写上你要执行的 *** 作,其实就是强制类型转换。至于这个条件不满足的时候怎么 *** 作,则是你要考虑的问题了。A表示你的父类,xxx表示你传入的参数名。
方法/步骤
首先,我们要创建一个项目并进行初步的项目设置,过程参见本系列文章的第一篇。这里就不再多说了,我们将项目文件从qtcreator中打开。
为了显示读取到的数据,我们先在界面文件中添加一个Label,如果读取了数据可以在这里显示一下进行验证。
然后,打开mainwindowcpp文件,在其中引入适当的头文件,具体如图中所示。
接着,我们在头文件中打开置顶的excel文件,并对其中的对象类进行配置,因为前文已经介绍过,就不详细说了,具体代码如下:
QAxObject excel("ExcelApplication");
excelsetProperty("Visible",false);
QAxObject workbooks = excelquerySubObject("WorkBooks");
workbooks->dynamicCall("Open (const QString&)",QString("c:/axls"));
QAxObject workbook = excelquerySubObject("ActiveWorkBook");//获取活动工作簿
QAxObject worksheets = workbook->querySubObject("WorkSheets");//获取所有的工作表,如图
然后,我们开始获取第一工作表。
通过range查询对应的cell,然后获取cell中value值。代码如下:
QAxObject range = worksheet->querySubObject("Cells(int,int)",1,1); //获取cell的值
QString strVal = range->dynamicCall("Value2()")toString();
接着,我们将得到的strVal显示label上用于验证是否成功读取。
我们再在c盘下新建一个axls文件,并且在第一个单元格输入一个字符串,如图所示
之后,我们用程序运行下,查看程序是否达到预期的效果可以看到程序运行成功了
Widget::Widget(QWidget parent) :
QWidget(parent)
{
webWidget = new QAxWidget;
webWidget->setControl(QString::fromUtf8("{8856F961-340A-11D0-A96B-00C04FD705A2}"));
loadNavigate();
webWidget->setObjectName(QString::fromUtf8("webWidget"));
webWidget->setFocusPolicy(Qt::StrongFocus);
webWidget->setProperty("DisplayAlerts",false); //不显示任何警告信息。
webWidget->setProperty("DisplayScrollBars",false); // 显示滚动条
connect(webWidget,SIGNAL(NavigateComplete2(IDispatch,QVariant& )),
this,SLOT(sltNavigateComplete2(IDispatch,QVariant&)));
QPushButton reloadButton = new QPushButton("Reload");
connect(reloadButton,SIGNAL(clicked()),this,SLOT(sltReloadButtonClick()));
QPushButton testButton = new QPushButton("Draw");
connect(testButton,SIGNAL(clicked()),this,SLOT(sltTestButtonClick()));
QHBoxLayout buttonLayout = new QHBoxLayout;
buttonLayout->addStretch();
buttonLayout->addWidget(reloadButton);
buttonLayout->addStretch();
buttonLayout->addWidget(testButton);
buttonLayout->addStretch();
QVBoxLayout mainLayout = new QVBoxLayout;
mainLayout->addWidget(webWidget);
mainLayout->addLayout(buttonLayout);
this->setLayout(mainLayout);
this->resize(1000,500);
}
下面两个地址为本地地图,测试可用
void Widget::loadNavigate()
{
webWidget->dynamicCall("Navigate(const QString&)","file:///E:/MyProjects/MWebBrowser/MWebBrowser/2html");
//webWidget->dynamicCall("Navigate(const QString&)",">
ExcelApplication 是ActiveX 控件的名字
QAxWidget::QAxWidget ( const QString & c, QWidget parent = 0, Qt::WindowFlags f = 0 )
创建一个QAxWidget ,并且初始化ActiveX 控件C
QAxObject workbooks = widgetquerySubObject("WorkBooks");
表示从widget中获取一个com对象
这两行的意思应该是创建一个excel的QAxWidget,并且获取名为工作表的com对象
QAxObject cell= sheet->querySubObject("Cells(int,init)",2,2);
QAxObject border= cell->querySubObject("Borders");
border->setProperty("Color",QColor(0,255,0));
以上就是关于excel算差值mmqtbj全部的内容,包括:excel算差值mmqtbj、java中 怎么通过Object对象参数,获取到在传值时的不同子类里的统一方法query、用qt读写excel文件一定要安装excel么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)