duckX 读写word,替换word中内容的整理

news/2025/3/14 9:17:55/文章来源:https://www.cnblogs.com/bang20221103/p/18677083

一、库编译

1.下载地址:https://github.com/amiremohamadi/DuckX

2. 使用git 下载: git clone https://github.com/amiremohamadi/DuckX

3.编译

1.打开代码所在目录

2.创建生成目录build

3.依次点击 config generate

 4. 打开项目,选择编译库的种类

 

 生成库位置

 

 

二、使用

C++读写word文档(.docx) DuckX库的使用-CSDN博客

1.需求文件和第三方库

a.头文件

b.第三方依赖

c.库文件

 

2、配置库文件以及头文件包含

 

 3.代码

#include <iostream>
#include"include/duckx.hpp"
#include"duckXWordHelper.h"
using namespace std;int main()
{duckXWordHelper duckHelper("c:\\word\\my_test.docx","c:\\word\\newmy_test.docx");duckHelper.addTable();duckHelper.addNewLineText("okay","this is a new line");duckHelper.save();
}

 

#pragma once
#include <fstream>
#include <iostream>
#include<unordered_map>
#include"duckx.hpp"
/// <summary>
/// duckX word操作帮助类
/// 项目常见的word操作封装
/// 需求c++17
/// </summary>
class duckXWordHelper
{
public:duckXWordHelper();duckXWordHelper(const std::string& docFileName);duckXWordHelper(const std::string& docFileName, const std::string& docCopyFileName);~duckXWordHelper();void open(const std::string& strFileName);void save();bool copyFile(const std::string& sourceFilePath, const std::string& destinationFilePath);bool addNewLineText(const std::string& strFindeText, const std::string& strNewLine);void addTable();bool replace(const std::unordered_map<std::string, std::string>& replacements);
private:duckx::Document m_doc;
};
#include "duckXWordHelper.h"duckXWordHelper::duckXWordHelper()
{
}duckXWordHelper::duckXWordHelper(const std::string& docFileName)
{m_doc.file(docFileName);m_doc.open();
}duckXWordHelper::duckXWordHelper(const std::string& docFileName, const std::string& docCopyFileName)
{copyFile(docFileName, docCopyFileName);m_doc.file(docCopyFileName);m_doc.open();
}duckXWordHelper::~duckXWordHelper()
{
}void duckXWordHelper::open(const std::string& strFileName)
{m_doc.file(strFileName);m_doc.open();
}void duckXWordHelper::save()
{m_doc.save();
}bool duckXWordHelper::copyFile(const std::string& sourceFilePath, const std::string& destinationFilePath)
{std::ifstream source(sourceFilePath, std::ios::binary);if (!source) {std::cerr << "Error opening source file: " << sourceFilePath << std::endl;return false;}std::ofstream destination(destinationFilePath, std::ios::binary);if (!destination) {std::cerr << "Error opening destination file: " << destinationFilePath << std::endl;return false;}destination << source.rdbuf();if (!destination) {std::cerr << "Error writing to destination file: " << destinationFilePath << std::endl;return false;}return true;
}bool duckXWordHelper::addNewLineText(const std::string& strFindeText, const std::string& strNewLine)
{bool bFind = false;duckx::Paragraph& paragraph = m_doc.paragraphs();while (paragraph.has_next()) {// 在某段中追加运行文本if (paragraph.runs().get_text() == strFindeText) {paragraph.add_run(strNewLine);bFind = true;}// 移动到下一个段落
        paragraph.next();}return bFind;
}void duckXWordHelper::addTable()
{//表头 内容// 遍历表格duckx::Table& table = m_doc.tables();//table.rows().cells().add_run(cellText);std::string cellText = "111";m_doc.tables().rows().cells().paragraphs().add_run(cellText);m_doc.tables().rows().cells().paragraphs().add_run(cellText);m_doc.tables().rows().cells().paragraphs().add_run(cellText);m_doc.tables().rows().cells().paragraphs().add_run(cellText);//m_doc.tables().//while (table.has_next()) {//    duckx::TableRow& row = table.rows();//    while (row.has_next()) {//        duckx::TableCell& cell = row.cells();//        while (cell.has_next()) {//            // 在单元格内新增段落//            duckx::Paragraph& paragraph = cell.paragraphs();//            if (paragraph.runs().get_text() == "") {//                paragraph.add_run("2024");//            }//            cell.next();//        }//        row.next();//    }//    table.next();//}
}bool duckXWordHelper::replace(const std::unordered_map<std::string, std::string>& replacements)
{// 遍历段落for (auto p = m_doc.paragraphs(); p.has_next(); p.next()) {// 遍历运行文本for (auto r = p.runs(); r.has_next(); r.next()) {// 获取当前运行文本内容std::string text = r.get_text();// 检查键值对中的键是否存在于当前文本中 c++17for (const auto& [key,value] : replacements) {// 如果找到匹配键,进行替换size_t pos = text.find(key);if (pos != std::string::npos) {text.replace(pos, key.length(), value);r.set_text(text);}}}}// 遍历表格for (auto t = m_doc.tables(); t.has_next(); t.next()) {// 遍历表格行for (auto r = t.rows(); r.has_next(); r.next()) {// 遍历表格单元格for (auto c = r.cells(); c.has_next(); c.next()) {// 遍历单元格中的段落for (auto p = c.paragraphs(); p.has_next(); p.next()) {// 遍历单元格段落中的运行文本for (auto r = p.runs(); r.has_next(); r.next()) {// 获取当前运行文本内容std::string text = r.get_text();// 检查键值对中的键是否存在于当前文本中for (const auto& [key, value] : replacements) {// 如果找到匹配键,进行替换size_t pos = text.find(key);if (pos != std::string::npos) {text.replace(pos, key.length(), value);r.set_text(text);}}}}}}}return true;
}

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/870796.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenAI 宕机思考丨Kubernetes 复杂度带来的服务发现系统的风险和应对措施

本文以社区主流服务发现系统 Nacos 为例,从可靠性、可伸缩性、高性能、可维护性等 4 个方面探讨如何提升 Kubernetes 中微服务应用的稳定性。作者:王建伟(正己) 12 月 11 日,OpenAI 旗下 AI 聊天机器人平台 ChatGPT、视频生成工具 Sora 及其面向开发人员的 API 自太平洋时…

如何删除www目录下无法删除的文件?

您好,有时在尝试删除www目录下的文件时,可能会遇到权限不足或其他问题导致无法删除。以下是详细的排查步骤和解决方案,帮助您顺利删除这些文件:检查文件权限:确认要删除的文件和目录具有适当的权限。可以通过FTP客户端或SSH连接到服务器并检查文件夹权限。例如:bashls -l…

请问忘记FTP账号密码,如何重置?

如果您忘记了FTP账号密码,可以通过以下几种方式重置密码,确保您的FTP账户能够正常使用:通过控制面板重置:大多数云服务提供商和托管平台都提供了在线控制面板,您可以在其中找到FTP管理选项。登录控制面板后,选择“FTP管理”或类似选项,然后点击“重置密码”。按照提示完…

如何解决FTP上传文件失败的问题?

您好,FTP(文件传输协议)是用于在互联网上进行文件传输的常用工具。如果遇到FTP上传文件失败的情况,可能是由多种原因引起的。以下是详细的排查步骤和解决方案:检查FTP账户信息:确认您使用的FTP账户名和密码是否正确。如果不确定,可以尝试使用其他已知有效的账户进行测试…

如何开通25端口发送邮件

开通25端口通常是为了发送邮件。以下是详细的步骤和注意事项:检查防火墙设置:登录到您的服务器,确保防火墙已放行25端口。 使用命令行工具(如iptables或firewalld)查看防火墙规则。 示例命令:sudo iptables -L sudo firewall-cmd --list-all配置邮件服务:安装并配置邮件…

请问所有网站不能打开,云服务器问题如何排查?

当所有网站无法打开时,可能是由于云服务器配置错误或网络问题引起的。以下是详细的排查和解决方案:检查服务器状态:确认云服务器是否正常运行,可以通过云平台的管理界面查看服务器状态。 如果服务器处于关机或重启状态,尝试手动启动服务器,并等待其完全启动后再进行测试。…

多站点绑定同一域名的不同端口

要实现用户直接通过域名访问不同端口上的多个网站,可以通过以下几种方式来解决:使用反向代理: 反向代理是一种常见的解决方案,它允许您将不同的子域名或路径映射到不同的后端服务器或端口。具体步骤如下:安装Nginx或Apache:确保您的服务器上已经安装了Nginx或Apache作为反…

网站流量异常,如何排查和解决?

当您发现网站流量异常增加时,这可能是由多种原因引起的,包括恶意攻击、爬虫抓取、推广活动等。为了帮助您更好地理解和解决这个问题,以下是几个可能的原因及相应的解决方案:检查日志文件日志文件是排查流量异常的重要工具。大多数Web服务器(如Nginx、Apache)都会记录详细…

如何安全地修改织梦网站登录密码?

修改织梦CMS(DedeCMS)网站的登录密码是一个重要的安全操作,可以确保网站的安全性和稳定性。以下是详细步骤:登录后台: 使用管理员账号登录织梦CMS后台。进入用户管理: 在左侧菜单中找到“用户管理”或“管理员管理”选项,点击进入。选择管理员用户: 在用户管理页面中,…

如何轻松修改网站的公司信息?

修改网站上的公司信息是一个重要的维护任务,可以确保信息的准确性和时效性。以下是详细步骤:登录后台: 使用管理员账号登录网站的后台管理系统。进入内容管理: 在后台管理系统中,找到“内容管理”或“文章管理”选项,点击进入。选择公司信息页面: 在内容管理页面中,找到…

如何顺利升级虚拟主机和数据库空间以满足业务需求

随着业务的增长,现有的虚拟主机和数据库空间可能无法满足需求。此时,升级空间成为必要。以下是详细的升级步骤和注意事项,确保升级过程顺利进行:问题 可能的原因 解决方案虚拟主机空间不足 文件过多或大文件占用 升级到更高配置的虚拟主机,增加磁盘空间。数据库空间不足 数…

如何解决HTTP 403.18错误并恢复正常网站访问

HTTP 403.18错误表示IIS服务器无法在指定的应用程序池中处理请求。这通常是由于应用程序池配置错误或URL重定向问题引起的。以下是详细的排查步骤和解决方案:问题 可能的原因 解决方案HTTP 403.18错误 应用程序池配置错误 确保应用程序池配置正确,所有应用程序在同一池中运行…