首页 > 系统相关 >Linux平台C++读写Word文档(DuckX库)

Linux平台C++读写Word文档(DuckX库)

时间:2023-08-03 17:56:58浏览次数:56  
标签:文档 duckx doc C++ add run Linux Word include

1、安装cmake

如果没有cmake或者cmake版本太旧,都需要进行重新安装
此次推荐直接安装编译好的软件包

进入官网:https://cmake.org/download/

下载后直接在拷贝到系统里进行解压

添加环境变量

vim /etc/profile

添加下面这条命令,路径换成自己安装的路径

export PATH=$PATH:/root/cmake/bin

执行

source /etc/profile

2、安装DuckX库

git clone https://github.com/amiremohamadi/DuckX.git
cd DuckX
mkdir build
cd build
cmake ..
cmake --build .
make && make install

3、读取Word文档内容

文件名:test.docx

内容如下图:

#include <iostream>
#include <duckx/duckx.hpp>

int main() {

    duckx::Document doc("test.docx");   

    doc.open();


    for (auto p : doc.paragraphs())
    for (auto r : p.runs())
            std::cout << r.get_text() << std::endl;
}

开始编译

g++ -o word_read word_read.cpp --std=c++11 -lduckx

此时出现报错1

这是因为代码里面头文件路径不对,改一下就行了。

vim /usr/local/include/duckx/duckx.hpp

然后在编译。

此时出现报错2

报错没找到这个头文件,发现只有在代码库里存在,所以直接我直接从代码库里拷贝了一份出来

cp /root/DuckX/thirdparty/pugixml/pugixml.cpp /usr/local/include/duckx/

继续编译,成功。

执行体效果如下:

4、编辑Word文档

官方示例代码如下:

#include <iostream>
#include <duckx/duckx.hpp>
using namespace std;
int main() 
{
    duckx::Document doc("my_test.docx");
    doc.open();
    duckx::Paragraph p = doc.paragraphs().insert_paragraph_after("You can insert text in ");
    p.add_run("italic, ", duckx::none); //纯文本
    p.add_run("bold, ", duckx::bold); //加粗
    p.add_run("underline, ", duckx::strikethrough);//删除线格式
    p.add_run("superscript", duckx::superscript);//上标形式显示
    p.add_run(" or ");
    p.add_run("subscript, ", duckx::subscript); //下标形式显示
    p.add_run("small caps, ", duckx::smallcaps); //小型大写字母形式
    p.add_run("and shadows, ", duckx::shadow); //阴影效果显示
    p.add_run("and of course ");
    p.add_run("combine them.", duckx::bold | duckx::italic | duckx::underline |         duckx::smallcaps);
    doc.save();
    return 0;
}

编译正常

g++ -o word_write word_write.cpp --std=c++11 -lduckx

运行后发现的确生成了my_test.docx文档,但是我试过不管代码里面写多少东西,文件大小也不变,所以我怀疑这个文档有问题,下载到windows平台后的确发现这是个异常文件。

我去GitHub里面翻了下的确看到有人提出过类似问题,目前来看无法解决

所以只能采用另外一种思路,就是使用存在的文档进行编辑。这里我使用仓库里面的示例文档,my_test.docx,里面只有两行内容。

然后重新执行之前编译出来的程序。此时程序执行完后文档内容如下图:

内容的的确成功的编辑上了,但是原有的内容还在,不是很符合我的需要,所以我在原有代码上进行了修改。

#include <duckx/duckx.hpp>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>


using namespace std;



int main() {

    int pn = 0, rn = 0;
    duckx::Document write_doc("my_test.docx");
    write_doc.open();

    //先判断文档本身存在多少内容,并把内容替换成我们需要的
    for(auto p :  write_doc.paragraphs())
    {
        pn++;
        for (auto r : p.runs())
        {
            rn++;
            if(r.get_text().length())
                r.set_text("替换成我想要的runs");
        }
    }
    duckx::Paragraph p2 = write_doc.paragraphs();
    while(pn > 1)
    {
        p2 = p2.next();
        pn--;
    }


    for (int i=0; i<10; i++)
    {
        char msg[128] = {0};
        sprintf(msg, "这是第%d条数据!", i+1);
        p2.insert_paragraph_after("");
        p2.add_run(msg); //纯文本
        p2 = p2.next();
    }

    write_doc.save();
    return 0;
}

执行体后效果如下,之前的内容被正确替换了:

但是发现好像被吞了一条数据,可能还需要在慢慢调试。

标签:文档,duckx,doc,C++,add,run,Linux,Word,include
From: https://www.cnblogs.com/mehong/p/17603724.html

相关文章

  • c++
    1,2章输出printf(    输入scanf(一,变量通用形式<类型名><变量名>变量名=标识符(不能用数字开头,不能用关键字/保留字)前缀const【不变的】即锁定变量值(不允许改变)若变量要作为赋值则变量初始时要赋值(初始化) eg:inta; =》inta=0;二,浮点数类型名:int整点   do......
  • Windows\Linux安装docker
    Docker架构Docker 包括三个基本概念:镜像(Image):Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和......
  • Linux Shell实现模拟多进程并发执行
        在bash中,使用后台任务来实现任务的“多进程化”。在不加控制的模式下,不管有多少任务,全部都后台执行。也就是说,在这种情况下,有多少任务就有多少“进程”在同时执行。我们就先实现第一种情况:实例一:正常情况脚本———————————————————————————–#......
  • Linux:wget指令
    学习自:linux系统安装.tar.gz文件,Linux中下载、解压、安装.tar.gz文件wget常用命令详解_懿曲折扇情的博客-CSDN博客说明wget命令是Linux系统用于从Web下载文件的命令行工具,支持HTTP、HTTPS及FTP协议下载文件,而且wget还提供了很多选项,例如下载多个文件、后台下载,使用代理等等,......
  • Linux文件管理知识查找文件
    Linux文件管理知识:查找文件前几篇文章一一介绍了LINUX进程管理控制命令及网络层面的知识体系,综所周知,一个linux系统是由很多文件组成的,那么既然有那么多文件,那我们该如何管理这些文件呢?Linux中的所有数据都是以文件形式存在的,那么所有文件分别被归类到不同的文件系统中。而文件系......
  • Linux2
    目录切换相关命令(cd/pwd)cd切换工作目录当Linux终端(命令行)打开的时候,会默认以用户的HOME目录作为当前的工作目录。我们可以通过cd命令,更改当前所在的工作目录语法:cd[Linux路径]cd命令无需选项,只有参数,表示要切换到哪个目录下cd命令直接执行,不写参数,表示回到用户的HOME......
  • Linux常用命令(工作)
    1、查询相关服务例:ps-ef|grepjava2、切换用户默认切换管理员:su切换至指定用户:suname3、给用户赋予文件夹权限例:chown -Rname:name/home/4、ll与lsls:查看当前目录下的文件ll:查看当前目录下的文件详情5、查看当前位置pwd6、修改文......
  • Linux离线升级pip
    Linux离线升级pip1、下载pip包pypi链接:https://pypi.org/project/pip/#files 2、上传安装1)将源码包上传服务器 2)解压安装tar-zxvfpip-23.2.1.tar.gzcdpip-23.2.1/python3setup.pyinstall 3)查看版本pip3version......
  • 遵守 MISRA 如何提高C++应用的安全性
    Perforce在支持需要稳定和安全的应用程序方面有着悠久的历史。凭借50多年的应用程序开发经验,从客户、趋势和竞争对手那里学到了很多东西。Perforce从软件开发的所有领域都采用了最佳实践,并试图将这些实践应用于Perforce所做的一切。Perforce采用了单元测试、自动化测试、敏捷开......
  • Linux:安装部署Tomcat和Nginx
    学习自:linux环境安装部署tomcat、nginx_ernesto_ji的博客-CSDN博客系统相关Linux服务器:Linuxrhel1.myguest.virtualbox.org 3.10.0-1160.el7.x86_64虚拟机平台:VirtualBox终端模拟器:Tabby步骤1、Linux环境安装部署Tomcat1)wget下载安装包apache-tomcat-8.5.82.tar.gz①先......