create .odt with headings and tables



  • I need to create a .odt file that contains headings (such as heading 1 or heading 2) and tables.

    I tried something like this:

    #include <QString>
    #include <QTextStream>
    #include <QTextDocument>
    #include <QTextDocumentWriter>
    
    int main(void)
    {
        QString strStream;
        QTextStream out(&strStream);
    
        QTextDocument *document = new QTextDocument();
    
        out << "<!DOCTYPE html>"
            << "<html>\n"
            << "<head>"
            << "<title>Test</title>"
            << "</head>"
            << "<body>"
            << "<h1>Test heading 1</h1>"
            << "</body>"
            << "</html>";
        document->setHtml(strStream);
    
        QTextDocumentWriter writer("test.odt");
    
        writer.setFormat("odf");
        writer.write(document);
    
        delete document;
        return 0;
    }
    

    but the product .odt file has no heading.
    screenshot
    what I would like to be heading 1 doesn't have the Heading 1 style, but, in fact, it's a Default Style bold text.

    How do I force Heading 1 style?

    best regards
    Max



  • This is not a problem of QTextDocumentWriter, the information about the h1 tag is lost in document->setHtml(strStream); (ref1 and ref2).

    Fixing this would imply a huge effort.



  • @VRonin Is there an alternative way to html to get an odt with heading 1 and a table, maybe even with custom styles?



  • The easiest method I see is using QXmlStreamWriter + a zip library to create the file from scratch but, as you can imagine, it's far from being "easy"



  • @mastupristi said in create .odt with headings and tables:

    @VRonin Is there an alternative way to html to get an odt with heading 1 and a table, maybe even with custom styles?

    You can create you own style using QTextCharFormat and QTextBlockFormat and then creating the document using the QTextDocument API.

    Here is an example:
    You will see htmlToOdf() function is simply your code, but createsOdf() and createsOdfWithTable() creates a ODT file using custom style the the QTextDocument API. Hope it helps

    #include <QString>
    #include <QTextStream>
    #include <QTextDocument>
    #include <QTextDocumentWriter>
    #include <QTextCursor>
    #include <QTextBlock>
    #include <QDate>
    #include <QTextTableCell>
    
    
    void htmlToOdf(){
        QString strStream;
        QTextStream out(&strStream);
    
        QTextDocument *document = new QTextDocument();
    
        out << "<!DOCTYPE html>"
            << "<html>"
            << "<head>"
            << "<title>Test</title>"
            << "</head>"
            << "<body>"
            << "<h1>Test heading 1</h1>"
            << "</body>"
            << "</html>";
        document->setHtml(strStream);
    
        QTextDocumentWriter writer("test.odt");
        writer.setFormat("odf");
        writer.write(document);
        QTextDocumentWriter writer2("test.html");
        writer2.setFormat("html");
        writer2.write(document);
    
        delete document;
    }
    
    void createsOdf(){
        QTextDocument *doc = new QTextDocument;
        doc->setDocumentMargin(10);
    
        QTextCursor cursor(doc);
        cursor.movePosition(QTextCursor::Start);
    
        QTextCharFormat textFormat;
        textFormat.setFontPointSize(10);
    
        QTextCharFormat boldFormat;
        boldFormat.setFontWeight(QFont::Bold);
        //HEADERS
        QTextCharFormat header1Format = boldFormat;
        header1Format.setFontPointSize(12);
        header1Format.setFontUnderline(true);
        header1Format.setForeground(QBrush(QColor("#0000FF")));
    
        QTextCharFormat titleFormat = boldFormat;
        titleFormat.setFontPointSize(20);
        header1Format.setForeground(QBrush(QColor("#0000FF")));
    
        QTextBlockFormat titleBlockFormat = cursor.block().blockFormat();
        titleBlockFormat.setAlignment(Qt::AlignHCenter);
        QTextBlockFormat blockFormat = cursor.block().blockFormat();
    
    
        //Title of the document
        cursor.insertBlock();
        cursor.setBlockCharFormat(titleFormat);
        cursor.setBlockFormat(titleBlockFormat);
        cursor.insertText(QObject::tr("Test !"));
        cursor.insertBlock(); //new line
    
        cursor.setBlockFormat(blockFormat);
        cursor.insertText(QObject::tr("Header 1"), header1Format);
        cursor.insertBlock();
    
        cursor.movePosition(QTextCursor::End);
    
        QTextDocumentWriter writer("test2.odt");
        writer.setFormat("odf");
        writer.write(doc);
        QTextDocumentWriter writer2("test2.html");
        writer2.setFormat("html");
        writer2.write(doc);
    
        delete doc;
    }
    
    void createsOdfWithTable(){
        QTextDocument *doc = new QTextDocument;
        doc->setDocumentMargin(10);
    
        QTextCursor cursor(doc);
        cursor.movePosition(QTextCursor::Start);
    
        QTextCharFormat textFormat;
        textFormat.setFontPointSize(10);
        QTextCharFormat boldFormat;
        boldFormat.setFontWeight(QFont::Bold);
    
        //HEADERS
        QTextCharFormat header1Format = boldFormat;
        header1Format.setFontPointSize(12);
        header1Format.setFontUnderline(true);
        header1Format.setForeground(QBrush(QColor("#0000FF")));
    
        QTextCharFormat header2Format = header1Format;
        header2Format.setFontPointSize(14);
        QTextCharFormat header3Format = header1Format;
        header3Format.setFontPointSize(16);
    
        QTextCharFormat titleFormat = boldFormat;
        titleFormat.setFontPointSize(20);
        header1Format.setForeground(QBrush(QColor("#0000FF")));
    
        QTextBlockFormat blockFormat = cursor.block().blockFormat();
        QTextBlockFormat titleBlockFormat = cursor.block().blockFormat();
        titleBlockFormat.setAlignment(Qt::AlignHCenter);
    
        QTextCharFormat alternateCellFormat = textFormat;
        alternateCellFormat.setBackground(QBrush(QColor("#D1EBFF")));
    
        QTextTableFormat tableFormat;
        tableFormat.setBorder(1);
        tableFormat.setBorderStyle(QTextFrameFormat::BorderStyle_Solid);
        //tableFormat.setBorderBrush(QBrush(QColor("#0072A6")));
        tableFormat.setCellPadding(2);
        tableFormat.setCellSpacing(0);
        tableFormat.setWidth(QTextLength(QTextLength::PercentageLength, 80));
        tableFormat.setAlignment(Qt::AlignLeft);
    
    
        //Title of the document
        cursor.insertBlock();
        cursor.setBlockCharFormat(titleFormat);
        cursor.setBlockFormat(titleBlockFormat);
        cursor.insertText(QObject::tr("My Great Document !"));
        cursor.insertBlock(); //new line
        cursor.insertBlock();
        cursor.insertBlock();
    
        cursor.setBlockFormat(blockFormat);
        cursor.insertText(QObject::tr("Header 1"), header1Format);
        cursor.insertBlock();
    
        cursor.setCharFormat(textFormat);
    
        cursor.insertText("Author:\tMe");
        cursor.insertBlock();
        cursor.insertText("Version:\tMe");
        cursor.insertBlock();
        cursor.insertText("Date:\t" + QDate::currentDate().toString("dd.MM.yyyy"));
        cursor.insertBlock();
    
    
        cursor.insertText(QObject::tr("Header 2"), header2Format);
        cursor.insertBlock();
        cursor.insertText(QObject::tr("Header 3"), header3Format);
        cursor.insertBlock();
    
    
    
        //Insert table with nb row = 10, column = 2
        QTextTable *table = cursor.insertTable(10+1, 2, tableFormat);
        QTextTableCell headerCell = table->cellAt(0, 0);
        QTextCursor headerCellCursor = headerCell.firstCursorPosition();
        headerCellCursor.insertText(QObject::tr("Name"), boldFormat);
        headerCell = table->cellAt(0, 1);
        headerCellCursor = headerCell.firstCursorPosition();
        headerCellCursor.insertText(QObject::tr("Value"), boldFormat);
    
        for(int i = 0; i < 10; i++){
            QTextCharFormat cellFormat = i % 2 == 0 ? textFormat : alternateCellFormat;
            QTextTableCell cell = table->cellAt(i + 1, 0);
            cell.setFormat(cellFormat);
            QTextCursor cellCursor = cell.firstCursorPosition();
            cellCursor.insertText("Row " + QString::number(i));
    
            cell = table->cellAt(i + 1, 1);
            cell.setFormat(cellFormat);
            cellCursor = cell.firstCursorPosition();
            cellCursor.insertText(QString::number(i));
        }
    
        cursor.movePosition(QTextCursor::End);
    
    
        QTextDocumentWriter writer("test3.odt");
        writer.setFormat("odf");
        writer.write(doc);
        QTextDocumentWriter writer2("test3.html");
        writer2.setFormat("html");
        writer2.write(doc);
    
        delete doc;
    
    }
    
    int main(void)
    {
        htmlToOdf();
        createsOdf();
        createsOdfWithTable();
    
        return 0;
    }
    
    

Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.