From 115d69aac52968598acf4b637e036cac05822b66 Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Tue, 18 Feb 2014 11:11:23 +0800 Subject: [PATCH] Fix issue #24: remove invalid characters in worksheet names --- src/xlsx/xlsxutility.cpp | 26 +++++++++++++++++++++++ src/xlsx/xlsxutility_p.h | 2 ++ src/xlsx/xlsxworkbook.cpp | 6 +++--- tests/auto/utility/tst_utilitytest.cpp | 29 ++++++++++++++++++++++++++ 4 files changed, 60 insertions(+), 3 deletions(-) diff --git a/src/xlsx/xlsxutility.cpp b/src/xlsx/xlsxutility.cpp index a0eba33..33923fc 100755 --- a/src/xlsx/xlsxutility.cpp +++ b/src/xlsx/xlsxutility.cpp @@ -177,4 +177,30 @@ QString xl_rowcol_to_cell_fast(int row, int col) return col_str + QString::number(row); } +/* + Creates a valid sheet name + minimum length is 1 + maximum length is 31 + doesn't contain special chars: / \ ? * ] [ : + Sheet names must not begin or end with ' (apostrophe) + + Invalid characters are replaced by one space character ' '. + */ +QString createSafeSheetName(const QString &nameProposal) +{ + if (nameProposal.isEmpty()) + return QString(); + + QString ret = nameProposal; + if (nameProposal.contains(QRegularExpression(QStringLiteral("[/\\\\?*\\][:]+")))) + ret.replace(QRegularExpression(QStringLiteral("[/\\\\?*\\][:]+")), QStringLiteral(" ")); + while(ret.contains(QRegularExpression(QStringLiteral("^\\s*'\\s*|\\s*'\\s*$")))) + ret.remove(QRegularExpression(QStringLiteral("^\\s*'\\s*|\\s*'\\s*$"))); + ret = ret.trimmed(); + if (ret.size() > 31) + ret = ret.left(31); + return ret; +} + + } //namespace QXlsx diff --git a/src/xlsx/xlsxutility_p.h b/src/xlsx/xlsxutility_p.h index 7d77e1c..5cb266f 100755 --- a/src/xlsx/xlsxutility_p.h +++ b/src/xlsx/xlsxutility_p.h @@ -60,5 +60,7 @@ XLSX_AUTOTEST_EXPORT int xl_col_name_to_value(const QString &col_str); XLSX_AUTOTEST_EXPORT QString xl_rowcol_to_cell(int row, int col, bool row_abs=false, bool col_abs=false); XLSX_AUTOTEST_EXPORT QString xl_rowcol_to_cell_fast(int row, int col); +XLSX_AUTOTEST_EXPORT QString createSafeSheetName(const QString &nameProposal); + } //QXlsx #endif // XLSXUTILITY_H diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index 81e3ce7..9f92f1f 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -205,10 +205,10 @@ Worksheet *Workbook::addWorksheet(const QString &name, int sheetId) Worksheet *Workbook::insertWorkSheet(int index, const QString &name) { Q_D(Workbook); - QString worksheetName = name; - if (!name.isEmpty()) { + QString worksheetName = createSafeSheetName(name); + if (!worksheetName.isEmpty()) { //If user given an already in-used name, we should not continue any more! - if (d->worksheetNames.contains(name)) + if (d->worksheetNames.contains(worksheetName)) return 0; } else { do { diff --git a/tests/auto/utility/tst_utilitytest.cpp b/tests/auto/utility/tst_utilitytest.cpp index 9df0884..52222eb 100644 --- a/tests/auto/utility/tst_utilitytest.cpp +++ b/tests/auto/utility/tst_utilitytest.cpp @@ -49,6 +49,9 @@ private Q_SLOTS: void test_datetimeFromNumber_data(); void test_datetimeFromNumber(); + + void test_createSafeSheetName_data(); + void test_createSafeSheetName(); }; UtilityTest::UtilityTest() @@ -181,6 +184,32 @@ void UtilityTest::test_datetimeFromNumber() QCOMPARE(QXlsx::datetimeFromNumber(num, is1904), dt); } +void UtilityTest::test_createSafeSheetName_data() +{ + QTest::addColumn("original"); + QTest::addColumn("result"); + + QTest::newRow("[Hello]") << QString("[Hello]")<