RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1562180
Accepted
Ingvar
Ingvar
Asked:2024-01-18 21:04:38 +0000 UTC2024-01-18 21:04:38 +0000 UTC 2024-01-18 21:04:38 +0000 UTC

使用 Qt 5.x (C++) 生成 ODT/ODS 格式的报告

  • 772

小澄清: Qt 5.15.12

任务:需要编写一个函数,将一些数据上传到 Libre 和其他 Office 可读的 ODT 文档中。该算法应该适用于 Windows 和 Linux。最重要的是,强烈建议不要与计算机上是否存在 LibreOffice 挂钩。也就是说,程序不应该使用与第三方软件的链接(当然如果可能的话)。

该文档包含表的名称以及 3 列 N 行的表本身。可以有多个这样的表。但在一般情况下,报告很简单,没有添加图片或其他花哨的东西。

编写算法本身不是问题。得到的结果如代码所示:

QString strNoInfo ="-";
//-- создаём новый документ, который будет записан в файл
QTextDocument *doc = new QTextDocument();

//-- предварительная очистка документа, не факт, что нужно, но на всякий случай
doc->clear();

QTextCursor cursor(doc);
//-- подготовка форматов
//-- Заголовок
QTextCharFormat fmt_title;
fmt_title.setFont(QFont("Times New Roman", 12, QFont::Normal));
//-- заголовок столбцов таблицы
QTextCharFormat fmt_table_caption;
fmt_title.setFont(QFont("Times New Roman", 10, QFont::Normal));
//-- основной текст таблицы
QTextCharFormat fmt_table_text;
fmt_title.setFont(QFont("Times New Roman", 10, QFont::Normal));

//-- счётчик строк таблицы для расставления номеров п/п
//-- обнуляется для каждой новой таблицы
int cnt = 0;
for (int i = 0; i < data.count(); i++) {
    int table_num = i + 1;
    //-- указываем
    QString corrected_name = data[i]->name;
    QString title =
        QString("Таблица %1 - .... %2\n\n")
            .arg(QString::number(table_num), corrected_name);
    cursor.insertText(title, fmt_title);

    //-- 3 столбца с 20 строками (первая строка - заголовок таблицы)
    //-- указатель на формируемую таблицу
    QTextTable *tbl = cursor.insertTable(20, 3);
    cnt = 0;
    //-- формируем заголовки таблицы
    tbl->cellAt(cnt, 0).firstCursorPosition().insertText("№ п/п", fmt_table_caption);
    tbl->cellAt(cnt, 1).firstCursorPosition().insertText("Наименование",
                                                         fmt_table_caption);
    tbl->cellAt(cnt++, 2).firstCursorPosition().insertText("Значение поля", fmt_table_caption);

    tbl->cellAt(cnt, 0).firstCursorPosition().insertText(QString::number(cnt), fmt_table_text);
    tbl->cellAt(cnt, 1).firstCursorPosition().insertText("Поле 1", fmt_table_text);
    tbl->cellAt(cnt++, 2).firstCursorPosition().insertText(
        data[i]->vul_name.isEmpty() ? strNoInfo : data[i]->name, fmt_table_text);


    tbl->cellAt(cnt, 0).firstCursorPosition().insertText(QString::number(cnt), fmt_table_text);
    tbl->cellAt(cnt, 1).firstCursorPosition().insertText("Поле 2",
                                                         fmt_table_text);
    tbl->cellAt(cnt++, 2).firstCursorPosition().insertText(data[i]->vul_idval.isEmpty() ? strNoInfo : data[i]->value, fmt_table_text);
    ... и так далее ....

    cursor.movePosition(QTextCursor::End);
    cursor.insertText("\n\n", fmt_title);

}

问题 1:尝试使用多个 QTextCharFormat 变量(在代码开头指定)进行格式化不会产生任何结果。表格标题变为指定字体,但大小没有任何变化。表本身对指定的格式没有任何反应。看来 .insertText 函数并不关心描述格式的第二个参数。

在谷歌搜索之后,我没有找到一个易于理解的文档形成示例。阅读文档后,我发现了cursor.insertBlock(),它可能相当于Word中的一个段落,但是插入一个块并不会返回任何可以引用的东西。

问题 2:需要帮助生成 ODS 文件。除了QOds2(但是,它没有构建)之外,我没有找到任何库。所有技巧都归结为使用 LibreOffice SDK 和阅读 ODS 格式的描述。我可以读到,SDK是一个极端的例子,但是真的有更简单的解决方案吗?

我请求充分的建议(和/或代码更正)和评论。

UPD:生成的文档是用ODF编写的:

        QTextDocumentWriter *dw = new QTextDocumentWriter(fileName);
    dw->setFormat("odf");
    dw->write(doc);
    QDesktopServices::openUrl(QUrl::fromLocalFile(fileName));
c++
  • 1 1 个回答
  • 56 Views

1 个回答

  • Voted
  1. Best Answer
    Ingvar
    2024-01-24T14:07:46Z2024-01-24T14:07:46Z

    事实上,棺材只是打开了:

    问题 1 - 在示例的开头为每个样式分配属性的代码中存在错误。唉,我自己就是个傻子。现在代码是这样的:

    QTextCharFormat fmt_title;
    fmt_title.setFont(QFont("Times New Roman", 12, QFont::Normal));
    //-- заголовок столбцов таблицы
    QTextCharFormat fmt_table_caption;
    fmt_table_caption.setFont(QFont("Times New Roman", 10, QFont::Normal));
    QTextCharFormat fmt_table_text;
    fmt_table_text.setFont(QFont("Times New Roman", 10, QFont::Normal));
    

    问题 2 - 感谢您的建议:@PavelGridin。图书馆已经建成、组装并正在使用。

    • 0

相关问题

  • 编译器和模板处理

  • 指针。找到最小数量

  • C++,关于枚举类对象初始化的问题

  • 函数中的二维数组

  • 无法使用默认构造函数创建类对象

  • C++ 和循环依赖

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5