Issue #64: Add workaround for duplicated shared string items.
This commit is contained in:
@@ -36,6 +36,14 @@
|
||||
|
||||
namespace QXlsx {
|
||||
|
||||
/*
|
||||
* Note that, when we open an existing .xlsx file (broken file?),
|
||||
* duplicated string items may exist in the shared string table.
|
||||
*
|
||||
* In such case, the size of stringList will larger than stringTable.
|
||||
* Duplicated items can be removed once we loaded all the worksheets.
|
||||
*/
|
||||
|
||||
SharedStrings::SharedStrings(CreateFlag flag)
|
||||
:AbstractOOXmlFile(flag)
|
||||
{
|
||||
@@ -67,7 +75,7 @@ int SharedStrings::addSharedString(const RichString &string)
|
||||
return item.index;
|
||||
}
|
||||
|
||||
int index = m_stringTable.size();
|
||||
int index = m_stringList.size();
|
||||
m_stringTable[string] = XlsxSharedStringInfo(index);
|
||||
m_stringList.append(string);
|
||||
return index;
|
||||
@@ -83,11 +91,17 @@ void SharedStrings::incRefByStringIndex(int idx)
|
||||
addSharedString(m_stringList[idx]);
|
||||
}
|
||||
|
||||
/*
|
||||
* Broken, don't use.
|
||||
*/
|
||||
void SharedStrings::removeSharedString(const QString &string)
|
||||
{
|
||||
removeSharedString(RichString(string));
|
||||
}
|
||||
|
||||
/*
|
||||
* Broken, don't use.
|
||||
*/
|
||||
void SharedStrings::removeSharedString(const RichString &string)
|
||||
{
|
||||
if (!m_stringTable.contains(string))
|
||||
@@ -198,11 +212,17 @@ void SharedStrings::saveToXmlFile(QIODevice *device) const
|
||||
{
|
||||
QXmlStreamWriter writer(device);
|
||||
|
||||
if (m_stringList.size() != m_stringTable.size()) {
|
||||
//Duplicated string items exist in m_stringList
|
||||
//Clean up can not be done here, as the indices
|
||||
//have been used when we save the worksheets part.
|
||||
}
|
||||
|
||||
writer.writeStartDocument(QStringLiteral("1.0"), true);
|
||||
writer.writeStartElement(QStringLiteral("sst"));
|
||||
writer.writeAttribute(QStringLiteral("xmlns"), QStringLiteral("http://schemas.openxmlformats.org/spreadsheetml/2006/main"));
|
||||
writer.writeAttribute(QStringLiteral("count"), QString::number(m_stringCount));
|
||||
writer.writeAttribute(QStringLiteral("uniqueCount"), QString::number(m_stringTable.size()));
|
||||
writer.writeAttribute(QStringLiteral("uniqueCount"), QString::number(m_stringList.size()));
|
||||
|
||||
foreach (RichString string, m_stringList) {
|
||||
writer.writeStartElement(QStringLiteral("si"));
|
||||
@@ -362,11 +382,16 @@ bool SharedStrings::loadFromXmlFile(QIODevice *device)
|
||||
}
|
||||
}
|
||||
|
||||
if (m_stringTable.size() != count) {
|
||||
if (m_stringList.size() != count) {
|
||||
qDebug("Error: Shared string count");
|
||||
return false;
|
||||
}
|
||||
|
||||
if (m_stringList.size() != m_stringTable.size()) {
|
||||
//qDebug("Warning: Duplicated items exist in shared string table.");
|
||||
//Nothing we can do here, as indices of the strings will be used when loading sheets.
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user