Browse Source

Bugfix: properly parse fillpattern colors and implement optional boolean fields.

Conflicts:
	src/xlsx/xlsxutility.cpp
	src/xlsx/xlsxutility_p.h
master
eho 11 years ago
committed by Debao Zhang
parent
commit
b74e49d097
  1. 36
      src/xlsx/xlsxstyles.cpp
  2. 9
      src/xlsx/xlsxutility.cpp
  3. 2
      src/xlsx/xlsxutility_p.h

36
src/xlsx/xlsxstyles.cpp

@ -886,8 +886,12 @@ bool Styles::readFill(QXmlStreamReader &reader, Format &fill)
if (attributes.hasAttribute(QLatin1String("patternType"))) { if (attributes.hasAttribute(QLatin1String("patternType"))) {
QString pattern = attributes.value(QLatin1String("patternType")).toString(); QString pattern = attributes.value(QLatin1String("patternType")).toString();
fill.setFillPattern(patternValues.contains(pattern) ? patternValues[pattern] : Format::PatternNone); fill.setFillPattern(patternValues.contains(pattern) ? patternValues[pattern] : Format::PatternNone);
}
} else if (reader.name() == QLatin1String("fgColor")) { //parse foreground and background colors if they exist
while (!reader.atEnd() && !(reader.tokenType() == QXmlStreamReader::EndElement && reader.name() == QLatin1String("patternFill"))) {
reader.readNextStartElement();
if (reader.tokenType() == QXmlStreamReader::StartElement) {
if (reader.name() == QLatin1String("fgColor")) {
XlsxColor c; XlsxColor c;
c.loadFromXml(reader); c.loadFromXml(reader);
if (fill.fillPattern() == Format::PatternSolid) if (fill.fillPattern() == Format::PatternSolid)
@ -904,6 +908,10 @@ bool Styles::readFill(QXmlStreamReader &reader, Format &fill)
} }
} }
} }
}
}
}
}
return true; return true;
} }
@ -1054,19 +1062,24 @@ bool Styles::readCellXfs(QXmlStreamReader &reader)
// for (int i=0; i<xfAttrs.size(); ++i) // for (int i=0; i<xfAttrs.size(); ++i)
// qDebug()<<"... "<<i<<" "<<xfAttrs[i].name()<<xfAttrs[i].value(); // qDebug()<<"... "<<i<<" "<<xfAttrs[i].name()<<xfAttrs[i].value();
if (xfAttrs.hasAttribute(QLatin1String("applyNumberFormat"))) { if (xfAttrs.hasAttribute(QLatin1String("numFmtId"))) {
int numFmtIndex = xfAttrs.value(QLatin1String("numFmtId")).toString().toInt(); int numFmtIndex = xfAttrs.value(QLatin1String("numFmtId")).toString().toInt();
bool apply = parseXsdBoolean(xfAttrs.value(QLatin1String("applyNumberFormat")).toString());
if(apply) {
if (!m_customNumFmtIdMap.contains(numFmtIndex)) if (!m_customNumFmtIdMap.contains(numFmtIndex))
format.setNumberFormatIndex(numFmtIndex); format.setNumberFormatIndex(numFmtIndex);
else else
format.setNumberFormat(numFmtIndex, m_customNumFmtIdMap[numFmtIndex]->formatString); format.setNumberFormat(numFmtIndex, m_customNumFmtIdMap[numFmtIndex]->formatString);
} }
}
if (xfAttrs.hasAttribute(QLatin1String("applyFont"))) { if (xfAttrs.hasAttribute(QLatin1String("fontId"))) {
int fontIndex = xfAttrs.value(QLatin1String("fontId")).toString().toInt(); int fontIndex = xfAttrs.value(QLatin1String("fontId")).toString().toInt();
if (fontIndex >= m_fontsList.size()) { if (fontIndex >= m_fontsList.size()) {
qDebug("Error read styles.xml, cellXfs fontId"); qDebug("Error read styles.xml, cellXfs fontId");
} else { } else {
bool apply = parseXsdBoolean(xfAttrs.value(QLatin1String("applyFont")).toString());
if(apply) {
Format fontFormat = m_fontsList[fontIndex]; Format fontFormat = m_fontsList[fontIndex];
for (int i=FormatPrivate::P_Font_STARTID; i<FormatPrivate::P_Font_ENDID; ++i) { for (int i=FormatPrivate::P_Font_STARTID; i<FormatPrivate::P_Font_ENDID; ++i) {
if (fontFormat.hasProperty(i)) if (fontFormat.hasProperty(i))
@ -1074,12 +1087,15 @@ bool Styles::readCellXfs(QXmlStreamReader &reader)
} }
} }
} }
}
if (xfAttrs.hasAttribute(QLatin1String("applyFill"))) { if (xfAttrs.hasAttribute(QLatin1String("fillId"))) {
int id = xfAttrs.value(QLatin1String("fillId")).toString().toInt(); int id = xfAttrs.value(QLatin1String("fillId")).toString().toInt();
if (id >= m_fillsList.size()) { if (id >= m_fillsList.size()) {
qDebug("Error read styles.xml, cellXfs fillId"); qDebug("Error read styles.xml, cellXfs fillId");
} else { } else {
bool apply = parseXsdBoolean(xfAttrs.value(QLatin1String("applyFill")).toString());
if(apply) {
Format fillFormat = m_fillsList[id]; Format fillFormat = m_fillsList[id];
for (int i=FormatPrivate::P_Fill_STARTID; i<FormatPrivate::P_Fill_ENDID; ++i) { for (int i=FormatPrivate::P_Fill_STARTID; i<FormatPrivate::P_Fill_ENDID; ++i) {
if (fillFormat.hasProperty(i)) if (fillFormat.hasProperty(i))
@ -1087,12 +1103,15 @@ bool Styles::readCellXfs(QXmlStreamReader &reader)
} }
} }
} }
}
if (xfAttrs.hasAttribute(QLatin1String("applyBorder"))) { if (xfAttrs.hasAttribute(QLatin1String("borderId"))) {
int id = xfAttrs.value(QLatin1String("borderId")).toString().toInt(); int id = xfAttrs.value(QLatin1String("borderId")).toString().toInt();
if (id >= m_bordersList.size()) { if (id >= m_bordersList.size()) {
qDebug("Error read styles.xml, cellXfs borderId"); qDebug("Error read styles.xml, cellXfs borderId");
} else { } else {
bool apply = parseXsdBoolean(xfAttrs.value(QLatin1String("applyBorder")).toString());
if(apply) {
Format borderFormat = m_bordersList[id]; Format borderFormat = m_bordersList[id];
for (int i=FormatPrivate::P_Border_STARTID; i<FormatPrivate::P_Border_ENDID; ++i) { for (int i=FormatPrivate::P_Border_STARTID; i<FormatPrivate::P_Border_ENDID; ++i) {
if (borderFormat.hasProperty(i)) if (borderFormat.hasProperty(i))
@ -1100,8 +1119,10 @@ bool Styles::readCellXfs(QXmlStreamReader &reader)
} }
} }
} }
}
if (xfAttrs.hasAttribute(QLatin1String("applyAlignment"))) { bool apply = parseXsdBoolean(xfAttrs.value(QLatin1String("applyAlignment")).toString());
if(apply) {
reader.readNextStartElement(); reader.readNextStartElement();
if (reader.name() == QLatin1String("alignment")) { if (reader.name() == QLatin1String("alignment")) {
QXmlStreamAttributes alignAttrs = reader.attributes(); QXmlStreamAttributes alignAttrs = reader.attributes();
@ -1149,6 +1170,7 @@ bool Styles::readCellXfs(QXmlStreamReader &reader)
if (alignAttrs.hasAttribute(QLatin1String("shrinkToFit"))) if (alignAttrs.hasAttribute(QLatin1String("shrinkToFit")))
format.setShrinkToFit(true); format.setShrinkToFit(true);
} }
} }

9
src/xlsx/xlsxutility.cpp

@ -35,6 +35,15 @@
namespace QXlsx { namespace QXlsx {
bool parseXsdBoolean(const QString &value, bool defaultValue)
{
if (value == QLatin1String("1") || value == QLatin1String("true"))
return true;
if (value == QLatin1String("0") || value == QLatin1String("false"))
return false;
return defaultValue;
}
QStringList splitPath(const QString &path) QStringList splitPath(const QString &path)
{ {
int idx = path.lastIndexOf(QLatin1Char('/')); int idx = path.lastIndexOf(QLatin1Char('/'));

2
src/xlsx/xlsxutility_p.h

@ -46,6 +46,8 @@ class QTime;
namespace QXlsx { namespace QXlsx {
XLSX_AUTOTEST_EXPORT bool parseXsdBoolean(const QString &value, bool defaultValue=false);
XLSX_AUTOTEST_EXPORT QStringList splitPath(const QString &path); XLSX_AUTOTEST_EXPORT QStringList splitPath(const QString &path);
XLSX_AUTOTEST_EXPORT QString getRelFilePath(const QString &filePath); XLSX_AUTOTEST_EXPORT QString getRelFilePath(const QString &filePath);

Loading…
Cancel
Save