小澄清: 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));
事实上,棺材只是打开了:
问题 1 - 在示例的开头为每个样式分配属性的代码中存在错误。唉,我自己就是个傻子。现在代码是这样的:
问题 2 - 感谢您的建议:@PavelGridin。图书馆已经建成、组装并正在使用。