QT 写word和转Pdf
2021-09-03 本文已影响0人
c之气三段
pro
win32: QT += axcontainer
.h
#ifndef WRITEDOC_H
#define WRITEDOC_H
#include <QAxObject>
class WriteDoc : public QObject
{
Q_OBJECT
public:
explicit WriteDoc(QObject *parent = nullptr);
enum Alignment
{
WdAlignParagraphCenter,//剧中对其
WdAlignParagraphLeft,//左对齐
WdAlignParagraphRight,//右对齐
WdAlignParagraphJustify,//两端对齐
WdAlignParagraphDistribute//分散对其
};
bool open();
//字体大小
void setFontSize(int size);
//字体格式
void setFontStyle(const QString &strStyle);
//对齐方式
void setAlignment(WriteDoc::Alignment alignType);
//写文本
void writeText(const QString &str);
//回车换行
void insertEnter();
//光标移动到最后跳出单元格
void moveForEnd();
//创建表格
QAxObject *createTable(int rowCount,const QStringList &headList);
//填充表格单元格
void setCellText(QAxObject *table, int row, int column, const QString &text);
//通过QPixmap,插入一张图片
void insertPicture(const QPixmap &picture,const QString &picName);
//创建并填充表格图,两列写死
void creatFillTableOfPictures(const QMap<QString, QPixmap> &pixmaps);
void close();
void save(QString strSavePath);
//写word结束关闭后,再调用转pdf函数
bool saveToPdf(const QString &wordpathName,const QString &PdfpathName);
static WriteDoc *getinstence();
private:
void setCellPictureName(QAxObject *table, int row, int column, const QString &strPicName);
void setCellPicture(QAxObject *table, int row, int column, const QPixmap &pixmap);
private:
QAxObject *m_pWord; //指向整个Word应用程序
QAxObject *m_pWorkDocuments; //指向文档集,Word有很多文档
QAxObject *m_pWorkDocument; //指向m_sFile对应的文档,就是要操作的文档
};
#endif // WRITEDOC_H
.cpp
#include "WriteDoc.h"
#include <QClipboard>
#include <QApplication>
#include <QDir>
#include <QPixmap>
#include<QDebug>
WriteDoc::WriteDoc(QObject *parent) : QObject(parent)
{
}
bool WriteDoc::open()
{
m_pWord = new QAxObject();
bool flag = m_pWord->setControl("kwps.Application");
if(!flag)
{
flag = m_pWord->setControl("Word.Application");
if(!flag)
{
return false;
}
}
m_pWord->setProperty("Visible", true);
QAxObject *documents = m_pWord->querySubObject("Documents");
if(!documents)
{
return false;
}
m_pWorkDocuments = documents;
m_pWorkDocuments->dynamicCall("Add (void)");
//获取当前激活的文档
m_pWorkDocument = m_pWord->querySubObject("ActiveDocument");
if(!m_pWorkDocument)
{
return false;
}
return true;
}
void WriteDoc::setFontSize(int size)
{
QAxObject* selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
selection->querySubObject("Font")->setProperty("Size",size);
}
void WriteDoc::setFontStyle(const QString &strStyle)
{
QAxObject* selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
selection->querySubObject("Font")->setProperty("Name",strStyle);
}
void WriteDoc::setAlignment(WriteDoc::Alignment alignType)
{
QAxObject *selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
switch (alignType) {
case WriteDoc::Alignment::WdAlignParagraphCenter:
selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphCenter");
break;
case WriteDoc::Alignment::WdAlignParagraphLeft:
selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphLeft");
break;
case WriteDoc::Alignment::WdAlignParagraphRight:
selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphRight");
break;
case WriteDoc::Alignment::WdAlignParagraphJustify:
selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphJustify");
break;
case WriteDoc::Alignment::WdAlignParagraphDistribute:
selection->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphDistribute");
break;
}
}
void WriteDoc::writeText(const QString &str)
{
QAxObject* selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
selection->dynamicCall("TypeText(const QString&)",str);
}
void WriteDoc::insertPicture(const QPixmap &picture,const QString &picName)
{
//设置剪贴板内容
QAxObject* selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
QAxObject *range = selection->querySubObject("Range");
QAxObject *tables = m_pWorkDocument->querySubObject("Tables");
if(!tables)
{
return;
}
QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(), 2, 1); //1row 2column
//表格自动拉伸列 0是固定 1是根据内容调整 2根据窗口调整
table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)",1);
QClipboard *clipboard = QApplication::clipboard();//获取系统剪贴板指针
clipboard->setPixmap(picture);
QAxObject* cell_pic = table->querySubObject("Cell(int, int)",1,1);
QAxObject* cellRange_pic = cell_pic->querySubObject("Range");
cellRange_pic->dynamicCall("Paste()");
if(!picName.isEmpty())
{
clipboard->setText(picName);
QAxObject* cell_picName = table->querySubObject("Cell(int, int)",2,1);
QAxObject* cellRange_picName = cell_picName->querySubObject("Range");
cellRange_picName->dynamicCall("Paste()");
}
//设置表格边框
for (int i=1;i<=6;i++)
{
QString m_str = QString("Borders(-%1)").arg(i);
QAxObject *borders = table->querySubObject(m_str.toLatin1().constData());
borders->dynamicCall("SetLineStyle(int)", 0);
}
moveForEnd();
}
void WriteDoc::insertEnter()
{
QAxObject* selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
selection->dynamicCall("TypeParagraph(void)");
}
void WriteDoc::moveForEnd()
{
QAxObject* selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
QVariantList params;
params.append(6);
params.append(0);
selection->dynamicCall("EndOf(QVariant&, QVariant&)", params).toInt();
}
QAxObject *WriteDoc::createTable(int rowCount,const QStringList &headList)
{
QAxObject* selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return nullptr;
}
selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment","wdAlignParagraphCenter");
QAxObject *range = selection->querySubObject("Range");
QAxObject *tables = m_pWorkDocument->querySubObject("Tables");
if(!tables)
{
return nullptr;
}
QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(),rowCount,headList.size());
//表格自动拉伸列 0固定 1根据内容调整 2 根据窗口调整
table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)", 2);
//设置表头
for(int i=0;i<headList.size();i++)
{
table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetText(QString)", headList.at(i));
//加粗
table->querySubObject("Cell(int,int)",1,i+1)->querySubObject("Range")->dynamicCall("SetBold(int)", true);
}
//设置表格边框
for (int i=1;i<=6;i++)
{
QString str = QString("Borders(-%1)").arg(i);
QAxObject *borders = table->querySubObject(str.toLatin1().constData());
borders->dynamicCall("SetLineStyle(int)",1);
}
return table;
}
void WriteDoc::setCellText(QAxObject *table, int row, int column,const QString &text)
{
QAxObject* range = table->querySubObject("Cell(int, int)",row+1,column+1)->querySubObject("Range");
if(!range)
{
return;
}
range->dynamicCall("SetText(QString)", text);
}
void WriteDoc::creatFillTableOfPictures(const QMap<QString, QPixmap > &pixmaps)
{
if(pixmaps.size()<1)
{
return;
}
int rowCount = (pixmaps.size()+1)/2;
int totalCount = rowCount*2;
QAxObject *selection = m_pWord->querySubObject("Selection");
if(!selection)
{
return;
}
insertEnter();
selection->querySubObject("ParagraphFormat")->dynamicCall("Alignment","wdAlignParagraphCenter");
QAxObject *range = selection->querySubObject("Range");
QAxObject *tables = m_pWorkDocument->querySubObject("Tables");
if(!tables)
{
return;
}
QAxObject *table = tables->querySubObject("Add(QVariant,int,int)",range->asVariant(), totalCount, 2 /*2, 2*/); //1row 2column
//表格自动拉伸列 0是固定 1是根据内容调整 2根据窗口调整
table->dynamicCall("AutoFitBehavior(WdAutoFitBehavior)",2);
auto iter=pixmaps.begin();pixmaps.toStdMap();
int rowPic = 0,rowPicName = 1,column = 0;
while(iter!=pixmaps.end())
{
setCellPicture(table,rowPic,column,iter.value());
setCellPictureName(table,rowPicName,column,iter.key());
if(column==1)
{
rowPic+=2;
rowPicName = rowPic+1;
}
column++;
iter++;
}
//设置表格边框
for (int i=1;i<=6;i++)
{
QString m_str = QString("Borders(-%1)").arg(i);
QAxObject *borders = table->querySubObject(m_str.toLatin1().constData());
borders->dynamicCall("SetLineStyle(int)", 0);
}
}
void WriteDoc::setCellPictureName(QAxObject *table, int row, int column, const QString &strPicName)
{
QAxObject* cell = table->querySubObject("Cell(int, int)",row+1,column+1);
QAxObject* range=cell->querySubObject("Range");
range->querySubObject("ParagraphFormat")->setProperty("Alignment","wdAlignParagraphCenter");
range->dynamicCall("SetText(QString)", strPicName);
}
void WriteDoc::setCellPicture(QAxObject *table, int row, int column, const QPixmap &pixmap)
{
QAxObject* cell = table->querySubObject("Cell(int, int)",row+1,column+1);
QAxObject* range = cell->querySubObject("Range");
QFile file("temppicture.png");
if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate))
{
return;
}
pixmap.save(&file, "PNG");
file.close();
QAxObject* pic = range->querySubObject("InlineShapes");
pic->dynamicCall("AddPicture(const QString&)",QDir::currentPath() + "/temppicture.png");
}
void WriteDoc::save(QString strSavePath)
{
if(strSavePath.isEmpty())return;
m_pWorkDocument->dynamicCall("SaveAs (const QString&)",strSavePath);
}
bool WriteDoc::saveToPdf(const QString &wordpathName,const QString &PdfpathName)
{
if(wordpathName.isEmpty())false;
QAxObject *pWordApplication = new QAxObject();
bool flag = pWordApplication->setControl("kwps.Application");
if(!flag)
{
flag = pWordApplication->setControl("Word.Application");
if(!flag)
{
return false;
}
}
QAxObject *pWordDocuments= pWordApplication->querySubObject("Documents");
QVariant filename(wordpathName);
QVariant confirmconversions(false);
QVariant readonly(true);
QVariant addtorecentfiles(false);
QVariant passworddocument("");
QVariant passwordtemplate("");
QVariant revert(false);
//打开
QAxObject* doc = pWordDocuments->querySubObject("Open(const QVariant&, const QVariant&,const QVariant&, "
"const QVariant&, const QVariant&, "
"const QVariant&,const QVariant&)",
filename,
confirmconversions,
readonly,
addtorecentfiles,
passworddocument,
passwordtemplate,
revert);
if(PdfpathName.isEmpty())false;
QVariant OutputFileName(PdfpathName);
QVariant ExportFormat(17); //17是pdf
QVariant OpenAfterExport(false); //保存后是否自动打开
//转成pdf
doc->querySubObject("ExportAsFixedFormat(const QVariant&,const QVariant&,const QVariant&)",
OutputFileName,
ExportFormat,
OpenAfterExport);
//关闭
doc->dynamicCall("Close(boolean)", false);
m_pWord->dynamicCall("Quit()");//退出word
delete pWordApplication;
return true;
}
void WriteDoc::close()
{
m_pWorkDocuments->dynamicCall("Close (bool)", true);//关闭文本窗口
m_pWord->dynamicCall("Quit()");//退出word
delete m_pWorkDocuments;
delete m_pWord;
m_pWorkDocument = nullptr;
m_pWorkDocuments = nullptr;
}
WriteDoc *WriteDoc::getinstence()
{
static WriteDoc wirteDoc;
return &wirteDoc;
}