diff --git a/src/xlsx/xlsxutility.cpp b/src/xlsx/xlsxutility.cpp index ea8395e..92d7fde 100755 --- a/src/xlsx/xlsxutility.cpp +++ b/src/xlsx/xlsxutility.cpp @@ -159,62 +159,76 @@ bool isSpaceReserveNeeded(const QString &s) */ QString convertSharedFormula(const QString &rootFormula, const CellReference &rootCell, const CellReference &cell) { - //Find all the "[A-Z]+[0-9]+" patterns in the rootFormula. - QList > segments; + //Find all the "$?[A-Z]+$?[0-9]+" patterns in the rootFormula. + QList > segments; QString segment; bool inQuote = false; - int cellFlag = 0; //-1, 0, 1, 2 ==> Invalid, Empty, A-Z ready, A1 ready + enum RefState{INVALID, PRE_AZ, AZ, PRE_09, _09}; + RefState refState = INVALID; + int refFlag = 0; // 0x00, 0x01, 0x02, 0x03 ==> A1, $A1, A$1, $A$1 foreach (QChar ch, rootFormula) { if (inQuote) { segment.append(ch); - if (ch == QLatin1Char('"')) { - segments.append(qMakePair(segment, false)); - segment = QString(); + if (ch == QLatin1Char('"')) inQuote = false; - cellFlag = 0; - } } else { if (ch == QLatin1Char('"')) { - segments.append(qMakePair(segment, false)); - segment = QString(ch); inQuote = true; + refState = INVALID; + segment.append(ch); + } else if (ch == QLatin1Char('$')) { + if (refState == AZ) { + segment.append(ch); + refState = PRE_09; + refFlag |= 0x02; + } else { + segments.append(qMakePair(segment, refState==_09 ? refFlag : -1)); + segment = QString(ch); //Start new segment. + refState = PRE_AZ; + refFlag = 0x01; + } } else if (ch >= QLatin1Char('A') && ch <=QLatin1Char('Z')) { - if (cellFlag == 0 || cellFlag == 1) { + if (refState == PRE_AZ || refState == AZ) { segment.append(ch); } else { - segments.append(qMakePair(segment, (cellFlag == 2))); - segment = QString(ch); //start new "A1" segment + segments.append(qMakePair(segment, refState==_09 ? refFlag : -1)); + segment = QString(ch); //Start new segment. + refFlag = 0x00; } - cellFlag = 1; + refState = AZ; } else if (ch >= QLatin1Char('0') && ch <=QLatin1Char('9')) { segment.append(ch); - if (cellFlag == 1) - cellFlag = 2; + + if (refState == AZ || refState == PRE_09 || refState == _09) + refState = _09; + else + refState = INVALID; } else { - if (cellFlag == 2) { - segments.append(qMakePair(segment, true)); //find one "A1" segment - segment = QString(ch); + if (refState == _09) { + segments.append(qMakePair(segment, refFlag)); + segment = QString(ch); //Start new segment. } else { segment.append(ch); } - cellFlag = -1; + refState = INVALID; } } } if (!segment.isEmpty()) - segments.append(qMakePair(segment, (cellFlag == 2))); + segments.append(qMakePair(segment, refState==_09 ? refFlag : -1)); - //Replace "A1" segment with proper one. + //Replace "A1", "$A1", "A$1" segment with proper one. QStringList result; - typedef QPair PairType; + typedef QPair PairType; foreach (PairType p, segments) { - if (p.second) { + //qDebug()<123"), "numeric"); QVERIFY2(xmldata.contains("0"), "string"); QVERIFY2(xmldata.contains("Hello inline"), "inline string"); QVERIFY2(xmldata.contains("1"), "boolean"); - QVERIFY2(xmldata.contains("44+330"), "formula"); - QVERIFY2(xmldata.contains("44+3377"), "formula"); + QVERIFY2(xmldata.contains("44+330"), "formula"); + QVERIFY2(xmldata.contains("44+3377"), "formula"); QCOMPARE(sheet.d_func()->sharedStrings()->getSharedString(0).toPlainString(), QStringLiteral("Hello")); }