excel算差值mmqtbj

excel算差值mmqtbj,第1张

在工程文件(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么等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9580525.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-29
下一篇 2023-04-29

发表评论

登录后才能评论

评论列表(0条)

保存