目录
开发环境
vs2022 + Qt 5.9.1 + msvc2017_x64,在文章最后提供了源码。
原理
Qt对于word文档的操作都是在书签位置进行插入文本、图片或表格的操作。
使用的QT库
除了基本的gui、core、widget库外,还需要ActiveQt库。
Qt5AxBased.lib,Qt5AxContainerd.lib
搭建开发环境
我是在vs2022上进行开发,换成qt creator同理。
右键属性选择-》Qt projecting-》勾选这几个
链接器-》常规-》输入
c
Qt5AxBased.lib
Qt5AxContainerd.lib
Qt5Widgetsd.lib
Qt5Guid.lib
准备word模板
在想要插入的地方设置书签
c
// 接口文件
#pragma once
#include <iostream>
class IQtWordProject
{
public:
virtual ~IQtWordProject() {}
/*
* @brief 根据word模板创建报告,后缀是.dot
* @param _templatePat 模板路径(绝对路径)
* @return true表示成功, false表示失败
*/
virtual bool WordApplication(const std::string& _templatePath) = 0;
/*
* @brief 根据wps模板创建报告,后缀是.wpt
* @param _templatePath 模板路径(绝对路径)
* @return true表示成功,false表示失败
*/
virtual bool WpsApplication(const std::string& _templatePath) = 0;
/*
* @brief 设置生成报告时报告是否可见,默认不可见
* @param _visible true表示可见,false表示不可见
* @return 无。
*/
virtual void SetVisible(const bool& _visible = false) = 0;
/*
* @brief 往指定书签插入文本内容
* @param _mark 书签名
* @param _content 内容
* @return 成功返回true,失败返回false
*/
virtual bool SetMarkContent(const std::string& _mark, const std::string _content) = 0;
/*
* @brief 往指定书签插入图片
* @param _mark 书签名
* @param _pngPath 图片路径(绝对路径)
* @return 成功返回true,失败返回false
*/
virtual bool SetMarkPicture(const std::string& _mark, const std::string& _pngPath) = 0;
/*
* @brief 往指定书签创建表格
* @param _mark 书签名
* @param _row 创建的表格行数
* @param _col 创建的表格列数
* @param _tableTitle 表格标题
* @return 成功返回true 失败返回false
*/
virtual bool SetMarkTable(const std::string& _mark, const int& _row, const int& _col
, const std::string& _tableTitle) = 0;
/*
* @brief 指定表格插入行
* @param _tableNum 指定表格是第几个(从1开始)
* @param _startRow 插入的起始行
* @param _rows 插入的行数
* @return 成功返回true 失败返回false
*/
virtual bool InsertTableRows(const int& _tableNum, const int& _startRow, const int& _rows) = 0;
/*
* @brief 指定表格删除行
* @param _tableNum 指定表格是第几个(从1开始)
* @param _row 删除的行号(从1开始)
* @return 成功返回true 失败返回false
*/
virtual bool DeleteTableRow(const int& _tableNum, const int& _row) = 0;
/*
* @brief 刷新表格内容
* @param _tableNum 指定表格是第几个(从1开始)
* @param _tableContent 表格内容
* @return 成功返回true 失败返回false
*/
virtual bool UpdateTableData(const int& _tableNum, const std::vector<std::string>& _tableContent) = 0;
/*
* @brief 保存文件并退出
* @param _docPath 保存的文件路径+文件名,支持doc、docx
* @return 无
*/
virtual void SaveFileQuit(const std::string& _docPath) = 0;
};
测试用例
测试用例实现了插入文本、插入图片、对表格进行插入行、创建表格、给表格添加内容的功能。
c
// main.cpp
#include "QtWordProject.h"
#include <QtWidgets/QApplication>
#include <QString>
#include <QVariantList>
#include <qdebug.h>
#include <memory>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
std::shared_ptr<IQtWordProject> word = std::make_shared<QtWordProject>();
// 替换为你的模板路径
QString templatePath = QApplication::applicationDirPath() + "/../../template.doc";
word->WordApplication(QString2StdString(templatePath));
// 向指定标签插入文本内容
word->SetMarkContent("Customer_Name", "CJX");
word->SetMarkContent("Name", "语文");
word->SetMarkContent("Number", "100");
// 替换为你的图片路径
QString imagePath = QApplication::applicationDirPath() + "/../../1.png";
word->SetMarkPicture("picture", QString2StdString(imagePath));
// 创建表格
word->SetMarkTable("table", 3, 3, "Table Test");
// 给第一个表格插入行
word->InsertTableRows(1, 2, 2);
// 第二个表格删除一行
word->DeleteTableRow(2, 1);
// 给第二个表格刷新内容
std::vector<std::string> tableContent = { "1","2","3","4","5","6"};
word->UpdateTableData(2, tableContent);
// 保存文件
//将文件保存为doc,同样可以生成docx文档
QString pathsave = QApplication::applicationDirPath() + "/../../result.doc";
word->SaveFileQuit(QString2StdString(pathsave));
// 这个widget显示出来说明整个文档已经保存下来了
QWidget* widget = new QWidget;
widget->show();
return a.exec();
}
结果