#include "wordhandle.h"
#include <QDomDocument>
#include <QXmlStreamReader>
#include <Windows.h>
#include <QDebug>
const QString WHITESPACE = "x7s2z3";
WordHandle::WordHandle()
{
}
/******************************************************************************
* 函数:open
* 功能:打开文件
* 参数:bVisable 是否显示弹窗
* 返回值: bool
*****************************************************************************/
/*
bool WordHandle::open(bool bVisable)
{
//新建一个word应用程序,并设置为可见
m_wordWidget = new QAxObject();
bool bFlag = m_wordWidget->setControl( "word.Application" );
if(!bFlag)
{
// 用wps打开
bFlag = m_wordWidget->setControl( "kwps.Application" );
if(!bFlag)
{
return false;
}
}
m_wordWidget->setProperty("Visible", bVisable);
//获取所有的工作文档
QAxObject *document = m_wordWidget->querySubObject("Documents");
if(!document)
{
return false;
}
//以文件template.dot为模版新建一个文档
document->dynamicCall("Add(QString)", m_strFilePath);
//获取当前激活的文档
m_wordDocuments = m_wordWidget->querySubObject("ActiveDocument");
m_bOpened = true;
return m_bOpened;
}
*/
/******************************************************************************
* 函数:open
* 功能:打开文件
* 参数:strFilePath 文件路径;bVisable 是否显示弹窗
* 返回值:bool
*****************************************************************************/
bool WordHandle::open(const QString& strFilePath, bool bVisable)
{
m_strFilePath = strFilePath;
//新建一个word应用程序,并设置为可见
m_wordWidget = new QAxObject();
bool bFlag = m_wordWidget->setControl( "word.Application" );
if(!bFlag)
{
// 用wps打开
bFlag = m_wordWidget->setControl( "kwps.Application" );
if(!bFlag)
{
return false;
}
}
m_wordWidget->setProperty("Visible", bVisable);
//获取所有的工作文档
QAxObject *document = m_wordWidget->querySubObject("Documents");
if(!document)
{
return false;
}
//以文件template.dot为模版新建一个文档
document->dynamicCall("Add(QString)", m_strFilePath);
//获取当前激活的文档
m_wordDocuments = m_wordWidget->querySubObject("ActiveDocument");
m_bOpened = true;
return m_bOpened;
}
/******************************************************************************
* 函数:close
* 功能:关闭文件
* 参数:无
* 返回值:bool
*****************************************************************************/
bool WordHandle::close()
{
if (m_bOpened)
{
m_wordDocuments->dynamicCall("Close (bool)", false);
m_wordWidget->dynamicCall("Quit()");
m_bOpened = false;
delete m_wordWidget;
m_wordWidget = NULL;
}
return m_bOpened;
}
/******************************************************************************
* 函数:isOpen
* 功能:获得当前的打开状态
* 参数:无
* 返回值:bool
*****************************************************************************/
bool WordHandle::isOpen()
{
return m_bOpened;
}
/******************************************************************************
* 函数:save
* 功能:保存文件
* 参数:无
* 返回值:void
*****************************************************************************/
void WordHandle::save()
{
m_wordDocuments->dynamicCall("Save()");
}
/******************************************************************************
* 函数:saveAs
* 功能:另存文件
* 参数:strSaveFile 文件路径
* 返回值:void
*****************************************************************************/
bool WordHandle::saveAs(const QString& strSaveFile)
{
return m_wordDocuments->dynamicCall("SaveAs (const QString&)",
strSaveFile).toBool();
}
int WordHandle::getTableCount()
{
int count = m_wordDocuments->querySubObject("Tables")->dynamicCall("Count").toInt();
return count;
}
int WordHandle::getRowCount(int tableID)
{
QAxObject *table = m_wordDocuments->querySubObject("Tables(int)",tableID);
int count = table->querySubObject("Rows")->dynamicCall("Count").toInt();
return count;
}
int WordHandle::getColumnCount(int tableID)
{
QAxObject *table = m_wordDocuments->querySubObject("Tables(int)",tableID);
int count = table->querySubObject("Columns")->dynamicCall("Count").toInt();
return count;
}
QString WordHandle::getCellText(int tableID,int row,int col)
{
QAxObject *table = m_wordDocuments->querySubObject("Tables(int)",tableID);
QAxObject *cell = table->querySubObject("Cell(int, int)",row,col);
QString strQuestion = cell->querySubObject("Range")->dynamicCall("Text").toString();
strQuestion = strQuestion.remove(strQuestion.length()-1,1).trimmed();
return strQuestion;
}
QString WordHandle::getCellXML(int tableID,int row,int col)
{
QAxObject *table = m_wordDocuments->querySubObject("Tables(int)",tableID);
QAxObject *cell = table->querySubObject("Cell(int, int)",row,col);
QString cellXml = cell->querySubObject("Range")->dynamicCall("XML").toString();
//将空格替换为特殊字符
cellXml.replace(QRegExp(" "), WHITESPACE);
//cellXml.replace(QRegExp(" "), "  ");
QDomDocument dom;
dom.setContent(cellXml);
QDomElement root = dom.firstChildElement("w:wordDocument");
QDomElement body = root.firstChildElement("w:body");
QDomElement sect = body.firstChildElement("wx:sect");
QDomElement tbl;
if(sect.isNull()){
tbl = body.firstChildElement("w:tbl");
}else{
tbl = sect.firstChildElement("w:tbl");
}
QDomElement tr = tbl.firstChildElement("w:tr");
QDomElement tc = tr.firstChildElement("w:tc");
QDomElement pr = tc.firstChildElement("w:tcPr");
tc.removeChild(pr);
QString strQuestion = "";
QDomDocument doc("Word.Document");
doc.appendChild(tc);
strQuestion = doc.toString(-1);
//将特殊字符替换回空格
strQuestion.replace(QRegExp(WHITESPACE), " ");
return strQuestion;
}
/******************************************************************************
* 函数:setCellString
* 功能:设置表格内容
* 参数:nTable 表格; row 行数; column 列数; text 插入文本
* 返回值:void
*****************************************************************************/
void WordHandle::setCellString(int nTable, int row, int column, const QString& text)
{
QAxObject* pTables = m_wordDocuments->querySubObject( "Tables" );
QAxObject* table = pTables->querySubObject("Item(int)", nTable);
if(table)
{
table->querySubObject("Cell(int, int)", row, column)
->querySubObject("Range")
->dynamicCall("SetText(QString)", text);
}
}
/******************************************************************************
* 函数:addTableRow
* 功能:为表格添加行
* 参数:nTable 表格; nRow 插入行; rowCount 插入的行数
* 返回值:void
*****************************************************************************/
void WordHandle::addTableRow(int nTable, int nRow, int rowCount)
{
QString sTableNo = QString("Item(%1)").arg(nTable);
QAxObject* tables = m_wordDocuments->querySubObject( "Tables" );
QAxObject* table = tables->querySubObject(sTableNo.toStdString().c_str());
QAxObject* rows = table->querySubObject("Rows");
int Count = rows->dynamicCall("Count").toInt();
if(0 < nRow && nRow < Count)
评论0