Формирование отчёта в формате ODT/ODS на Qt 5.x (C++)
Небольшое уточнение: Qt 5.15.12
Задача: Необходимо написать функцию, которая выгружает некоторые данные в документ ODT, читаемый Libre- и прочими Office. Алгоритм должен работать на 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 шт):
Собственно ларчик просто открывался:
Проблема 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 - спасибо за совет to: @PavelGridin. Библиотека подошла, собралась и используется.