From f1632ee596ca64bcf7c0428ff9c66273702fe994 Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Tue, 27 Aug 2013 17:14:16 +0800 Subject: [PATCH] Add cell alignment control --- examples/style/main.cpp | 1 + src/xlsxformat.cpp | 157 ++++++++++++++++++++++++++++++++++++++++ src/xlsxformat.h | 51 ++++++++++++- src/xlsxstyles.cpp | 21 ++++++ src/xlsxworksheet.cpp | 1 + 5 files changed, 229 insertions(+), 2 deletions(-) diff --git a/examples/style/main.cpp b/examples/style/main.cpp index 57dd580..b8e331a 100644 --- a/examples/style/main.cpp +++ b/examples/style/main.cpp @@ -17,6 +17,7 @@ int main() QXlsx::Format *format1 = workbook.addFormat(); format1->setFontColor(QColor(Qt::red)); format1->setFontSize(15); + format1->setHorizontalAlignment(QXlsx::Format::AlignHCenter); sheet->write("A1", "Hello Qt!", format1); sheet->write("B3", 12345, format1); diff --git a/src/xlsxformat.cpp b/src/xlsxformat.cpp index cd047e4..5ae89bd 100755 --- a/src/xlsxformat.cpp +++ b/src/xlsxformat.cpp @@ -46,6 +46,13 @@ Format::Format() m_font.redundant = false; m_font.index = 0; + m_alignment.alignH = AlignHGeneral; + m_alignment.alignV = AlignBottom; + m_alignment.wrap = false; + m_alignment.rotation = 0; + m_alignment.indent = 0; + m_alignment.shinkToFit = false; + m_is_dxf_fomat = false; m_xf_index = 0; @@ -152,6 +159,156 @@ void Format::setFontName(const QString &name) m_font.name = name; } +Format::HorizontalAlignment Format::horizontalAlignment() const +{ + return m_alignment.alignH; +} + +void Format::setHorizontalAlignment(HorizontalAlignment align) +{ + if (m_alignment.indent &&(align != AlignHGeneral && align != AlignLeft && + align != AlignRight && align != AlignHDistributed)) { + m_alignment.indent = 0; + } + + if (m_alignment.shinkToFit && (align == AlignHFill || align == AlignHJustify + || align == AlignHDistributed)) { + m_alignment.shinkToFit = false; + } + + m_alignment.alignH = align; +} + +Format::VerticalAlignment Format::verticalAlignment() const +{ + return m_alignment.alignV; +} + +void Format::setVerticalAlignment(VerticalAlignment align) +{ + m_alignment.alignV = align; +} + +bool Format::textWrap() const +{ + return m_alignment.wrap; +} + +void Format::setTextWarp(bool wrap) +{ + if (wrap && m_alignment.shinkToFit) + m_alignment.shinkToFit = false; + + m_alignment.wrap = wrap; +} + +int Format::rotation() const +{ + return m_alignment.rotation; +} + +void Format::setRotation(int rotation) +{ + m_alignment.rotation = rotation; +} + +int Format::indent() const +{ + return m_alignment.indent; +} + +void Format::setIndent(int indent) +{ + if (indent && (m_alignment.alignH != AlignHGeneral + && m_alignment.alignH != AlignLeft + && m_alignment.alignH != AlignRight + && m_alignment.alignH != AlignHJustify)) { + m_alignment.alignH = AlignLeft; + } + m_alignment.indent = indent; +} + +bool Format::shrinkToFit() const +{ + return m_alignment.shinkToFit; +} + +void Format::setShrinkToFit(bool shink) +{ + if (shink && m_alignment.wrap) + m_alignment.wrap = false; + if (shink && (m_alignment.alignH == AlignHFill + || m_alignment.alignH == AlignHJustify + || m_alignment.alignH == AlignHDistributed)) { + m_alignment.alignH = AlignLeft; + } + + m_alignment.shinkToFit = shink; +} + +bool Format::alignmentChanged() const +{ + return m_alignment.alignH != AlignHGeneral + || m_alignment.alignV != AlignBottom + || m_alignment.indent != 0 + || m_alignment.wrap + || m_alignment.rotation != 0 + || m_alignment.shinkToFit; +} + +QString Format::horizontalAlignmentString() const +{ + QString alignH; + switch (m_alignment.alignH) { + case Format::AlignLeft: + alignH = "left"; + break; + case Format::AlignHCenter: + alignH = "center"; + break; + case Format::AlignRight: + alignH = "right"; + break; + case Format::AlignHFill: + alignH = "fill"; + break; + case Format::AlignHJustify: + alignH = "justify"; + break; + case Format::AlignHMerge: + alignH = "centerContinuous"; + break; + case Format::AlignHDistributed: + alignH = "distributed"; + break; + default: + break; + } + return alignH; +} + +QString Format::verticalAlignmentString() const +{ + QString align; + switch (m_alignment.alignV) { + case AlignTop: + align = "top"; + break; + case AlignVCenter: + align = "center"; + break; + case AlignVJustify: + align = "justify"; + break; + case AlignVDistributed: + align = "distributed"; + break; + default: + break; + } + return align; +} + bool Format::isDxfFormat() const { return m_is_dxf_fomat; diff --git a/src/xlsxformat.h b/src/xlsxformat.h index 2597e7e..db1e0ee 100755 --- a/src/xlsxformat.h +++ b/src/xlsxformat.h @@ -52,6 +52,27 @@ public: FontUnderlineDoubleAccounting }; + enum HorizontalAlignment + { + AlignHGeneral, + AlignLeft, + AlignHCenter, + AlignRight, + AlignHFill, + AlignHJustify, + AlignHMerge, + AlignHDistributed + }; + + enum VerticalAlignment + { + AlignTop, + AlignVCenter, + AlignBottom, + AlignVJustify, + AlignVDistributed + }; + int fontSize() const; void setFontSize(int size); bool fontItalic() const; @@ -71,15 +92,28 @@ public: QString fontName() const; void setFontName(const QString &); + HorizontalAlignment horizontalAlignment() const; + void setHorizontalAlignment(HorizontalAlignment align); + VerticalAlignment verticalAlignment() const; + void setVerticalAlignment(VerticalAlignment align); + bool textWrap() const; + void setTextWarp(bool textWrap); + int rotation() const; + void setRotation(int rotation); + int indent() const; + void setIndent(int indent); + bool shrinkToFit() const; + void setShrinkToFit(bool shink); + void setForegroundColor(const QColor &color); void setBackgroundColor(const QColor &color); private: friend class Styles; friend class Worksheet; - explicit Format(); + Format(); - struct Font + struct FontData { int size; bool italic; @@ -109,6 +143,19 @@ private: bool fontShadow() const {return m_font.shadow;} QString fontScheme() const {return m_font.scheme;} + struct AlignmentData + { + HorizontalAlignment alignH; + VerticalAlignment alignV; + bool wrap; + int rotation; + int indent; + bool shinkToFit; + } m_alignment; + + bool alignmentChanged() const; + QString horizontalAlignmentString() const; + QString verticalAlignmentString() const; bool isDxfFormat() const; int xfIndex() const {return m_xf_index;} diff --git a/src/xlsxstyles.cpp b/src/xlsxstyles.cpp index 69d753d..5e27d7e 100755 --- a/src/xlsxstyles.cpp +++ b/src/xlsxstyles.cpp @@ -238,6 +238,27 @@ void Styles::writeCellXfs(XmlStreamWriter &writer) writer.writeAttribute("applyFont", "1"); if (format->fillIndex() > 0) writer.writeAttribute("applyBorder", "1"); + if (format->alignmentChanged()) + writer.writeAttribute("applyAlignment", "1"); + + if (format->alignmentChanged()) { + writer.writeEmptyElement("alignment"); + QString alignH = format->horizontalAlignmentString(); + if (!alignH.isEmpty()) + writer.writeAttribute("horizontal", alignH); + QString alignV = format->verticalAlignmentString(); + if (!alignV.isEmpty()) + writer.writeAttribute("vertical", alignV); + if (format->indent()) + writer.writeAttribute("indent", QString::number(format->indent())); + if (format->textWrap()) + writer.writeAttribute("wrapText", "1"); + if (format->shrinkToFit()) + writer.writeAttribute("shrinkToFit", "1"); + if (format->shrinkToFit()) + writer.writeAttribute("shrinkToFit", "1"); + } + writer.writeEndElement();//xf } writer.writeEndElement();//cellXfs diff --git a/src/xlsxworksheet.cpp b/src/xlsxworksheet.cpp index bb4f8f5..5719e66 100755 --- a/src/xlsxworksheet.cpp +++ b/src/xlsxworksheet.cpp @@ -33,6 +33,7 @@ #include #include #include +#include #include