Add custom number format support

This commit is contained in:
Debao Zhang
2013-10-15 17:27:20 +08:00
parent 9e1a510761
commit b4d9c5f2dd
10 changed files with 203 additions and 12 deletions
+33 -2
View File
@@ -68,19 +68,50 @@ Format::~Format()
delete d_ptr;
}
int Format::numberFormat() const
int Format::numberFormatIndex() const
{
Q_D(const Format);
return d->numberData.formatIndex;
}
void Format::setNumberFormat(int format)
void Format::setNumberFormatIndex(int format)
{
Q_D(Format);
d->dirty = true;
d->numberData.formatIndex = format;
}
QString Format::numberFormat() const
{
Q_D(const Format);
return d->numberData.formatString;
}
void Format::setNumberFormat(const QString &format)
{
Q_D(Format);
d->dirty = true;
d->numberData.formatString = format;
d->numberData._valid = false; //formatIndex must be re-generated
}
bool Format::numFmtIndexValid() const
{
Q_D(const Format);
return d->numberData._valid;
}
/*!
* \internal
*/
void Format::setNumFmt(int index, const QString &string)
{
Q_D(Format);
d->numberData.formatIndex = index;
d->numberData.formatString = string;
d->numberData._valid = true;
}
int Format::fontSize() const
{
Q_D(const Format);
+7 -2
View File
@@ -129,8 +129,10 @@ public:
~Format();
int numberFormat() const;
void setNumberFormat(int format);
int numberFormatIndex() const;
void setNumberFormatIndex(int format);
QString numberFormat() const;
void setNumberFormat(const QString &format);
int fontSize() const;
void setFontSize(int size);
@@ -210,6 +212,9 @@ private:
friend class WorksheetPrivate;
Format();
bool numFmtIndexValid() const;
void setNumFmt(int index, const QString &string);
bool fontIndexValid() const;
int fontIndex() const;
void setFontIndex(int index);
+4 -1
View File
@@ -30,9 +30,12 @@ namespace QXlsx {
struct NumberData
{
NumberData() : formatIndex(0) {}
NumberData() : formatIndex(0), _valid(true) {}
int formatIndex;
QString formatString;
bool _valid;
};
struct FontData
+69 -5
View File
@@ -65,6 +65,61 @@ void Styles::addFormat(Format *format)
if (!format)
return;
//numFmt
if (!format->numFmtIndexValid()) {
if (m_builtinNumFmtsHash.isEmpty()) {
m_builtinNumFmtsHash.insert(QStringLiteral("General"), 0);
m_builtinNumFmtsHash.insert(QStringLiteral("0"), 1);
m_builtinNumFmtsHash.insert(QStringLiteral("0.00"), 2);
m_builtinNumFmtsHash.insert(QStringLiteral("#,##0"), 3);
m_builtinNumFmtsHash.insert(QStringLiteral("#,##0.00"), 4);
m_builtinNumFmtsHash.insert(QStringLiteral("($#,##0_);($#,##0)"), 5);
m_builtinNumFmtsHash.insert(QStringLiteral("($#,##0_);[Red]($#,##0)"), 6);
m_builtinNumFmtsHash.insert(QStringLiteral("($#,##0.00_);($#,##0.00)"), 7);
m_builtinNumFmtsHash.insert(QStringLiteral("($#,##0.00_);[Red]($#,##0.00)"), 8);
m_builtinNumFmtsHash.insert(QStringLiteral("0%"), 9);
m_builtinNumFmtsHash.insert(QStringLiteral("0.00%"), 10);
m_builtinNumFmtsHash.insert(QStringLiteral("0.00E+00"), 11);
m_builtinNumFmtsHash.insert(QStringLiteral("# ?/?"), 12);
m_builtinNumFmtsHash.insert(QStringLiteral("# ??/??"), 13);
m_builtinNumFmtsHash.insert(QStringLiteral("m/d/yy"), 14);
m_builtinNumFmtsHash.insert(QStringLiteral("d-mmm-yy"), 15);
m_builtinNumFmtsHash.insert(QStringLiteral("d-mmm"), 16);
m_builtinNumFmtsHash.insert(QStringLiteral("mmm-yy"), 17);
m_builtinNumFmtsHash.insert(QStringLiteral("h:mm AM/PM"), 18);
m_builtinNumFmtsHash.insert(QStringLiteral("h:mm:ss AM/PM"), 19);
m_builtinNumFmtsHash.insert(QStringLiteral("h:mm"), 20);
m_builtinNumFmtsHash.insert(QStringLiteral("h:mm:ss"), 21);
m_builtinNumFmtsHash.insert(QStringLiteral("m/d/yy h:mm"), 22);
m_builtinNumFmtsHash.insert(QStringLiteral("(#,##0_);(#,##0)"), 37);
m_builtinNumFmtsHash.insert(QStringLiteral("(#,##0_);[Red](#,##0)"), 38);
m_builtinNumFmtsHash.insert(QStringLiteral("(#,##0.00_);(#,##0.00)"), 39);
m_builtinNumFmtsHash.insert(QStringLiteral("(#,##0.00_);[Red](#,##0.00)"), 40);
m_builtinNumFmtsHash.insert(QStringLiteral("_(* #,##0_);_(* (#,##0);_(* \"-\"_);_(_)"), 41);
m_builtinNumFmtsHash.insert(QStringLiteral("_($* #,##0_);_($* (#,##0);_($* \"-\"_);_(_)"), 42);
m_builtinNumFmtsHash.insert(QStringLiteral("_(* #,##0.00_);_(* (#,##0.00);_(* \"-\"??_);_(_)"), 43);
m_builtinNumFmtsHash.insert(QStringLiteral("_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(_)"), 44);
m_builtinNumFmtsHash.insert(QStringLiteral("mm:ss"), 45);
m_builtinNumFmtsHash.insert(QStringLiteral("[h]:mm:ss"), 46);
m_builtinNumFmtsHash.insert(QStringLiteral("mm:ss.0"), 47);
m_builtinNumFmtsHash.insert(QStringLiteral("##0.0E+0"), 48);
m_builtinNumFmtsHash.insert(QStringLiteral("@"), 49);
}
const QString str = format->numberFormat();
//Assign proper number format index
if (m_builtinNumFmtsHash.contains(str)) {
format->setNumFmt(m_builtinNumFmtsHash[str], str);
} else if (m_customNumFmtsHash.contains(str)) {
format->setNumFmt(m_customNumFmtsHash[str], str);
} else {
int idx = 164 + m_customNumFmts.size();
m_customNumFmts.append(str);
m_customNumFmtsHash.insert(str, idx);
format->setNumFmt(idx, str);
}
}
//Font
if (!format->fontIndexValid()) {
if (!m_fontsHash.contains(format->fontKey())) {
@@ -140,9 +195,7 @@ void Styles::saveToXmlFile(QIODevice *device)
writer.writeStartElement(QStringLiteral("styleSheet"));
writer.writeAttribute(QStringLiteral("xmlns"), QStringLiteral("http://schemas.openxmlformats.org/spreadsheetml/2006/main"));
// writer.writeStartElement(QStringLiteral("numFmts"));
// writer.writeEndElement();//numFmts
writeNumFmts(writer);
writeFonts(writer);
writeFills(writer);
writeBorders(writer);
@@ -180,6 +233,17 @@ void Styles::saveToXmlFile(QIODevice *device)
writer.writeEndDocument();
}
void Styles::writeNumFmts(XmlStreamWriter &writer)
{
writer.writeStartElement(QStringLiteral("numFmts"));
for (int i=0; i<m_customNumFmts.size(); ++i) {
writer.writeEmptyElement(QStringLiteral("numFmt"));
writer.writeAttribute(QStringLiteral("numFmtId"), QString::number(164 + i));
writer.writeAttribute(QStringLiteral("formatCode"), m_customNumFmts[i]);
}
writer.writeEndElement();//numFmts
}
/*
not consider dxf format.
*/
@@ -394,7 +458,7 @@ void Styles::writeCellXfs(XmlStreamWriter &writer)
writer.writeStartElement(QStringLiteral("cellXfs"));
writer.writeAttribute(QStringLiteral("count"), QString::number(m_xf_formatsList.size()));
foreach (Format *format, m_xf_formatsList) {
int num_fmt_id = format->numberFormat();
int num_fmt_id = format->numberFormatIndex();
int font_id = format->fontIndex();
int fill_id = format->fillIndex();
int border_id = format->borderIndex();
@@ -405,7 +469,7 @@ void Styles::writeCellXfs(XmlStreamWriter &writer)
writer.writeAttribute(QStringLiteral("fillId"), QString::number(fill_id));
writer.writeAttribute(QStringLiteral("borderId"), QString::number(border_id));
writer.writeAttribute(QStringLiteral("xfId"), QString::number(xf_id));
if (format->numberFormat() > 0)
if (format->numberFormatIndex() > 0)
writer.writeAttribute(QStringLiteral("applyNumberFormat"), QStringLiteral("1"));
if (format->fontIndex() > 0)
writer.writeAttribute(QStringLiteral("applyFont"), QStringLiteral("1"));
+5
View File
@@ -29,6 +29,7 @@
#include <QSharedPointer>
#include <QHash>
#include <QList>
#include <QStringList>
class QIODevice;
@@ -56,6 +57,7 @@ public:
private:
friend class Format;
void writeNumFmts(XmlStreamWriter &writer);
void writeFonts(XmlStreamWriter &writer);
void writeFills(XmlStreamWriter &writer);
void writeFill(XmlStreamWriter &writer, FillData *fill);
@@ -64,6 +66,9 @@ private:
void writeCellXfs(XmlStreamWriter &writer);
void writeDxfs(XmlStreamWriter &writer);
QHash<QString, int> m_builtinNumFmtsHash;
QStringList m_customNumFmts;
QHash<QString, int> m_customNumFmtsHash;
QList<QSharedPointer<FontData> > m_fontsList; //Keep a copy of unique fonts
QList<QSharedPointer<FillData> > m_fillsList; //Keep a copy of unique fills
QList<QSharedPointer<BorderData> > m_bordersList; //Keep a copy of unique borders