diff --git a/examples/xlsx/richtext/main.cpp b/examples/xlsx/richtext/main.cpp index 1647e9b..9e23025 100644 --- a/examples/xlsx/richtext/main.cpp +++ b/examples/xlsx/richtext/main.cpp @@ -1,7 +1,9 @@ #include #include "xlsxdocument.h" #include "xlsxrichstring.h" +#include "xlsxworkbook.h" #include "xlsxformat.h" + int main() { //![0] @@ -22,6 +24,9 @@ int main() rich.addFragment("Qt ", red); rich.addFragment("Xlsx", bold); xlsx.write("B2", rich); + + xlsx.workbook()->setHtmlToRichStringEnabled(true); + xlsx.write("B4", "Hello Qt Xlsx"); //![1] //![2] diff --git a/src/xlsx/xlsxformat.cpp b/src/xlsx/xlsxformat.cpp index 0690723..abce847 100755 --- a/src/xlsx/xlsxformat.cpp +++ b/src/xlsx/xlsxformat.cpp @@ -331,7 +331,7 @@ int Format::fontSize() const */ void Format::setFontSize(int size) { - setProperty(FormatPrivate::P_Font_Size, size); + setProperty(FormatPrivate::P_Font_Size, size, 0); } /*! @@ -486,7 +486,8 @@ QFont Format::font() const void Format::setFont(const QFont &font) { setFontName(font.family()); - setFontSize(font.pointSize()); + if (font.pointSize() > 0) + setFontSize(font.pointSize()); setFontBold(font.bold()); setFontItalic(font.italic()); setFontUnderline(font.underline() ? FontUnderlineSingle : FontUnderlineNone); diff --git a/src/xlsx/xlsxrichstring.cpp b/src/xlsx/xlsxrichstring.cpp index f3e4b40..e90614e 100644 --- a/src/xlsx/xlsxrichstring.cpp +++ b/src/xlsx/xlsxrichstring.cpp @@ -26,6 +26,8 @@ #include "xlsxrichstring_p.h" #include "xlsxformat_p.h" #include +#include +#include QT_BEGIN_NAMESPACE_XLSX @@ -68,7 +70,10 @@ RichString::RichString() RichString::RichString(const QString text) :d(new RichStringPrivate) { - addFragment(text, Format()); + if (Qt::mightBeRichText(text)) + setHtml(text); + else + addFragment(text, Format()); } /*! @@ -149,6 +154,36 @@ QString RichString::toPlainString() const return d->fragmentTexts.join(QString()); } +/*! + Converts to html string +*/ +QString RichString::toHtml() const +{ + //: Todo + return QString(); +} + +/*! + Replaces the entire contents of the document + with the given HTML-formatted text in the \a text string +*/ +void RichString::setHtml(const QString &text) +{ + QTextDocument doc; + doc.setHtml(text); + QTextBlock block = doc.firstBlock(); + QTextBlock::iterator it; + for (it = block.begin(); !(it.atEnd()); ++it) { + QTextFragment textFragment = it.fragment(); + if (textFragment.isValid()) { + Format fmt; + fmt.setFont(textFragment.charFormat().font()); + fmt.setFontColor(textFragment.charFormat().foreground().color()); + addFragment(textFragment.text(), fmt); + } + } +} + /*! Returns fragment count. */ diff --git a/src/xlsx/xlsxrichstring.h b/src/xlsx/xlsxrichstring.h index a6f3856..01d1972 100644 --- a/src/xlsx/xlsxrichstring.h +++ b/src/xlsx/xlsxrichstring.h @@ -49,6 +49,8 @@ public: bool isNull() const; bool isEmtpy() const; QString toPlainString() const; + QString toHtml() const; + void setHtml(const QString &text); int fragmentCount() const; void addFragment(const QString &text, const Format &format); diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index c02f75a..216cf46 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -51,6 +51,7 @@ WorkbookPrivate::WorkbookPrivate(Workbook *q) : window_height = 9660; strings_to_numbers_enabled = false; + html_to_richstring_enabled = false; date1904 = false; defaultDateFormat = QStringLiteral("yyyy-mm-dd"); activesheetIndex = 0; @@ -113,6 +114,18 @@ bool Workbook::isStringsToNumbersEnabled() const return d->strings_to_numbers_enabled; } +void Workbook::setHtmlToRichStringEnabled(bool enable) +{ + Q_D(Workbook); + d->html_to_richstring_enabled = enable; +} + +bool Workbook::isHtmlToRichStringEnabled() const +{ + Q_D(const Workbook); + return d->html_to_richstring_enabled; +} + QString Workbook::defaultDateFormat() const { Q_D(const Workbook); diff --git a/src/xlsx/xlsxworkbook.h b/src/xlsx/xlsxworkbook.h index 0ab19b1..a23a6b9 100755 --- a/src/xlsx/xlsxworkbook.h +++ b/src/xlsx/xlsxworkbook.h @@ -70,6 +70,8 @@ public: void setDate1904(bool date1904); bool isStringsToNumbersEnabled() const; void setStringsToNumbersEnabled(bool enable=true); + bool isHtmlToRichStringEnabled() const; + void setHtmlToRichStringEnabled(bool enable=true); QString defaultDateFormat() const; void setDefaultDateFormat(const QString &format); diff --git a/src/xlsx/xlsxworkbook_p.h b/src/xlsx/xlsxworkbook_p.h index d858b69..e69e3b9 100644 --- a/src/xlsx/xlsxworkbook_p.h +++ b/src/xlsx/xlsxworkbook_p.h @@ -94,6 +94,7 @@ public: QList sheetItemInfoList;//Data from xml file bool strings_to_numbers_enabled; + bool html_to_richstring_enabled; bool date1904; QString defaultDateFormat; diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index c5a7c67..5087ac6 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -47,6 +47,7 @@ #include #include #include +#include #include @@ -621,7 +622,7 @@ int Worksheet::writeString(int row, int column, const RichString &value, const F d->sharedStrings()->addSharedString(value); Format fmt = format.isValid() ? format : d->cellFormat(row, column); d->workbook->styles()->addXfFormat(fmt); - QSharedPointer cell = QSharedPointer(new Cell(QString(), Cell::String, fmt, this)); + QSharedPointer cell = QSharedPointer(new Cell(value.toPlainString(), Cell::String, fmt, this)); cell->d_ptr->richString = value; d->cellTable[row][column] = cell; return error; @@ -641,26 +642,23 @@ int Worksheet::writeString(const QString &row_column, const QString &value, cons } /*! + \overload + Write string \a value to the cell (\a row, \a column) with the \a format */ int Worksheet::writeString(int row, int column, const QString &value, const Format &format) { Q_D(Worksheet); - int error = 0; - QString content = value; if (d->checkDimensions(row, column)) return -1; - if (value.size() > XLSX_STRING_MAX) { - content = value.left(XLSX_STRING_MAX); - error = -2; - } + RichString rs; + if (Qt::mightBeRichText(value) && d->workbook->isHtmlToRichStringEnabled()) + rs.setHtml(value); + else + rs.addFragment(value, Format()); - d->sharedStrings()->addSharedString(content); - Format fmt = format.isValid() ? format : d->cellFormat(row, column); - d->workbook->styles()->addXfFormat(fmt); - d->cellTable[row][column] = QSharedPointer(new Cell(content, Cell::String, fmt, this)); - return error; + return writeString(row, column, rs, format); } /*!