QT操作Word,插入表格

最近在做QT导出word报表,发现网上的资源不是很多,也浪费了很多时间,我自己做了一份demo,将会详细讲述如何做出需要样式的报表。在网上很容易查到java或者其他语言操作word的接口函数,但是QT能操作word的,不是很多,而且还不太好用。我把自己已经调试出来的代码,贡献出来,免得以后浪费时间。
写了一部分接口函数,可以满足大部分的word报表。在QT工程中,QWorddemo.pro中,需要加入如下:
QT默认安装在C盘中。
下载地址:http://download.csdn.net/download/blackbattery/10001438
分数有点高了,分享一个百度云盘网址:链接: https://pan.baidu.com/s/1qWv4tTY-VGPNONJUvyhLlw 提取码: esqk
链接:https://share.weiyun.com/59gwQjX 密码:v74rng

LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\qtmaind.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Cored.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Guid.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5Widgetsd.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5AxContainerd.lib
LIBS    +=C:\Qt\Qt5.5.1\5.5\msvc2010\lib\Qt5AxBased.lib

在word中插入表格:

void QWord::intsertTable(int row,int column)
{	
	QAxObject* tables = m_document->querySubObject("Tables");	
	QAxObject* selection = m_word->querySubObject("Selection");	
	QAxObject* range = selection->querySubObject("Range");
	QVariantList params;
	params.append(range->asVariant());		
	params.append(row);
	params.append(column);	
	tables->querySubObject("Add(QAxObject*, int, int, QVariant&, QVariant&)", params);
	QAxObject* table = selection->querySubObject("Tables(int)",1);
	table->setProperty("Style","网格型"); 

	QAxObject* Borders = table->querySubObject("Borders");
	Borders->setProperty("InsideLineStyle",1);
	Borders->setProperty("OutsideLineStyle",1);
	
	QString doc = Borders->generateDocumentation();
	QFile outFile("D:\\360Downloads\\Picutres\\Borders.html");
	outFile.open(QIODevice::WriteOnly|QIODevice::Append);
	QTextStream ts(&outFile);
	ts<<doc<<endl;

	/*QString doc = tables->generateDocumentation();
	QFile outFile("D:\\360Downloads\\Picutres\\tables.html");
	outFile.open(QIODevice::WriteOnly|QIODevice::Append);
	QTextStream ts(&outFile);
	ts<<doc<<endl;*/	
}

这是插入表格的函数,其中border使用画出表格边线。其中
QString doc = Borders->generateDocumentation();这部分代码是将其中的关于border属性导出来的。
合并单元格的函数有两种实现方法,我选择的是第一种,其中tableindex表示的是第几个table。
合并单元格的函数:

void QWord::MergeCells(int tableIndex, int nStartRow,int nStartCol,int nEndRow,int nEndCol)//合并单元格
{
	QAxObject* tables = m_document->querySubObject("Tables");
	QAxObject* table = tables->querySubObject("Item(int)",tableIndex);
	QAxObject* StartCell =table->querySubObject("Cell(int, int)",nStartRow,nStartCol);
	QAxObject* EndCell = table->querySubObject("Cell(int, int)",nEndRow,nEndCol);
	StartCell->querySubObject("Merge(QAxObject *)",EndCell->asVariant());
}
//第二种方法调用
// void QWord::MergeCells(int tableIndex, int nStartRow,int nStartCol,int nEndRow,int nEndCol)//合并单元格
// {
// 	QAxObject* tables = m_document->querySubObject("Tables");	
// 	QAxObject* table = tables->querySubObject("Item(int)",tableIndex);
// 	QAxObject* StartCell =table->querySubObject("Cell(int, int)",nStartRow,nStartCol);
// 	QAxObject* EndCell = table->querySubObject("Cell(int, int)",nEndRow,nEndCol);
// 	StartCell->dynamicCall("Merge(LPDISPATCH)",EndCell->asVariant());
// }

插入图片的函数,需要考虑到图片的大小,固定单元格的大小,可以使图片自适应单元格的。
void QWord::insertCellPic(int row,int column,const QString& picPath)
{
	QAxObject* selection = m_word->querySubObject("Selection");	
	QAxObject* table = selection->querySubObject("Tables(1)");
	QAxObject* range = table->querySubObject("Cell(int, int)",row,column)->querySubObject("Range");
	range->querySubObject("InlineShapes")->dynamicCall("AddPicture(const QString&)",picPath);
}

还有增加行的需求,我又写了增加行的接口函数,提供给别人调用。

void QWord::addTableRow(int tableIndex ,int nRow,int rowCount)
{
	QAxObject* tables=m_document->querySubObject("Tables");
	QAxObject* table = tables->querySubObject("Item(int)",tableIndex);
	QAxObject* rows =table->querySubObject("Rows");
	int Count =rows->dynamicCall("Count").toInt();
	if(0< nRow && nRow < Count )
	{   
		for(int i =0; i< rowCount; ++i)
		{
			QString sPos = QString("Item(%1)").arg(nRow+i);
			QAxObject* row= rows->querySubObject(sPos.toStdString().c_str());
			QVariant param =row ->asVariant();
			rows->dynamicCall("Add(Variant)",param);
		}			
	}	
}

这个函数很重要,再插入表格的时候,当你插入第二个表格的时候,必须要使用此函数,要不然的话,
其他表格的数据将会覆盖第一个表格的内容。这个函数将光标移到末尾,跳出单元格。

void QWord::moveForEnd()//光标移到末尾,才能真正的跳出单元格
{
	QAxObject* selection = m_word->querySubObject("Selection");	
	QVariantList params;
	params.append(6);		
	params.append(0);		
	selection->dynamicCall("EndOf(QVariant&, QVariant&)", params).toInt();
}

关于部分接口函数的dynamicCall和querySubObject,需要注意,
querySubObject调用的是属性或者返回值,dynamicCall调用的是方法。

  • 13
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 29
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 29
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值