利用DeepSeek将docx生成程序迁移至minidocx

前文的docx生成程序需要预先准备模板文件,不方便。今天找到另一个docx开源库minidocx,它直接生成文件,调用方法也和duckx差不多,非常简单,所以准备迁移到这个库。
我下载的是稳定版本v0.6.0
原来它需要cmake生成Makefile,经过简单分析,发现它与DuckX一样,也是调用的pugixml和zip库,本身的实现只要一个minidocx.h和minidocx.cpp,所以可以直接手写编译命令行如下:

/par/minidocx-0.6.0# g++ -o table examples/basic.cpp src/minidocx.cpp 3rdparty/pugixml-1.13/*.cpp 3rdparty/zip-0.2.1/*.c -I src -I 3rdparty/pugixml-1.13 -I 3rdparty/zip-0.2.1

运行basic果然凭空生成了docx文件。它的源代码如下:

#include "minidocx.hpp"

using namespace docx;

int main()
{
  Document doc;

  auto p1 = doc.AppendParagraph("Hello, World!", 12, "Times New Roman");
  auto p2 = doc.AppendParagraph(u8"你好,世界!", 14, u8"宋体");
  auto p3 = doc.AppendParagraph(u8"Hello, 世界!", 16, "Times New Roman", u8"宋体");

  auto p4 = doc.AppendParagraph();
  p4.SetAlignment(Paragraph::Alignment::Centered);

  auto p4r1 = p4.AppendRun("Sample text here...", 12, "Arial");
  p4r1.AppendLineBreak();
  p4r1.SetCharacterSpacing(Pt2Twip(2));

  auto p4r2 = p4.AppendRun("And another line of sample text here...");
  p4r2.SetFontSize(14);
  p4r2.SetFont("Times New Roman");
  p4r2.SetFontColor("FF0000");
  p4r2.SetFontStyle(Run::Bold | Run::Italic);

  //doc.SetReadOnly();
  doc.Save("basic.docx");
  return 0;
}

实验成功后,就让DeepSeek帮助改写迁移代码。
提示词如下:

我有一个生成docx文档的程序,它调用的duckx类需要预先准备模板文件,不方便,现在准备迁移到minidocx类,它能直接生成文件,请用示例cpp中的调用方法来改写DOCXGlobal中的函数。
生成内容如下:

struct DOCXGlobalState : public FormatGlobalState {
    unique_ptr<docx::Document> document;
    
    explicit DOCXGlobalState(string file_path) {
        this->file_path = std::move(file_path);        
        std::cout << this->file_path << std::endl;

        // 直接创建新的Document对象,不需要模板文件
        document = make_uniq<docx::Document>();
    }
    
    ~DOCXGlobalState() {
        DEBUG_LOG("~DOCXGlobalState开始");
        if (document) {
            document->Save(this->file_path);
        }
    }
};

unique_ptr<GlobalFunctionData> InitializeGlobal(
    ClientContext &context,
    const string &file_path,
    const vector<string> &names,
    const vector<LogicalType> &sql_types,
    FormatOptions &options_base) override {
    
    auto &options = dynamic_cast<DOCXWriteOptions&>(options_base);
    auto gstate = make_uniq<DOCXGlobalState>(file_path);
    auto &doc = *gstate->document;

    // 添加标题
    doc.AppendParagraph(options.title, 12, "Times New Roman").SetFontStyle(docx::Run::Bold);
    
    // 添加表头
    if (options.header) {
        string header_text;
        for (idx_t col = 0; col < names.size(); ++col) {
            if (col != 0) header_text += "\t";
            header_text += names[col];
        }
        auto header_p = doc.AppendParagraph(header_text, 12, "Times New Roman");
        header_p.SetFontStyle(docx::Run::Bold);
    }
    
    DEBUG_LOG("添加标题和表头 完成");
    return gstate;
}

void WriteData(
    ExecutionContext &context,
    GlobalFunctionData &gstate_base,
    LocalFunctionData &lstate_base,
    DataChunk &input,
    const vector<string> &names,
    FormatOptions &options_base) override {
    
    auto &gstate = dynamic_cast<DOCXGlobalState&>(gstate_base);
    lock_guard<mutex> lock(gstate.write_mutex);
    auto &doc = *gstate.document;

    DEBUG_LOG("开始写入数据,行数: " << input.size());    
    for (idx_t row = 0; row < input.size(); row++) {
        string row_text;
        
        for (idx_t col = 0; col < input.ColumnCount(); col++) {
            if (col != 0) row_text += "\t";
            
            auto val = input.GetValue(col, row);
            row_text += val.IsNull() ? "NULL" : val.ToString();
        }
        
        doc.AppendParagraph(row_text, 12, "Times New Roman");
    }
    
    // 立即保存而不是等待析构
    DEBUG_LOG("立即保存DOCX文档");
    doc.Save(gstate.file_path);
    DEBUG_LOG("DOCX文档保存完成");
}

我将上述内容复制粘贴到原有的源代码文件,并把引用的头文件由#include "duckx.hpp"改成#include "minidocx.hpp"。再调整编译命令行为

g++ minidocx-0.6.0/src/minidocx.cpp minidocx-0.6.0/3rdparty/pugixml-1.13/*.cpp minidocx-0.6.0/3rdparty/zip-0.2.1/*.c copy_file6.cpp -o copymini -lduckdb -lxls -I /par/include -I /par/xlslib/xlslib/src -I minidocx-0.6.0/src -I minidocx-0.6.0/3rdparty/pugixml-1.13 -I minidocx-0.6.0/3rdparty/zip-0.2.1  -I xlslib/src -std=c++17

运行结果如下

./copymini
=== XLS导出成功 ===
=== XLSX导出成功 ===
/par/tmp_test_output.docx
=== DOCX导出成功 ===
tmp_auto_recognize.docx

一举完成了docx库的迁移。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值