From f83fb45740828110a1b84edc02982bdc649f7224 Mon Sep 17 00:00:00 2001 From: Debao Zhang Date: Tue, 31 Dec 2013 15:51:56 +0800 Subject: [PATCH] Improve the QDate support --- src/xlsx/xlsxutility.cpp | 2 +- src/xlsx/xlsxworkbook.cpp | 2 +- src/xlsx/xlsxworksheet.cpp | 11 ++-- tests/auto/document/tst_documenttest.cpp | 64 +++++++++++++++++++++--- tests/auto/utility/tst_utilitytest.cpp | 2 + 5 files changed, 69 insertions(+), 12 deletions(-) diff --git a/src/xlsx/xlsxutility.cpp b/src/xlsx/xlsxutility.cpp index 03f60ab..22b1c15 100755 --- a/src/xlsx/xlsxutility.cpp +++ b/src/xlsx/xlsxutility.cpp @@ -77,7 +77,7 @@ QDateTime datetimeFromNumber(double num, bool is1904) if (!is1904 && num > 60) num = num - 1; - qint64 msecs = static_cast(num * 1000*60*60*24.0); + qint64 msecs = static_cast(num * 1000*60*60*24.0 + 0.5); QDateTime epoch(is1904 ? QDate(1904, 1, 1): QDate(1899, 12, 31), QTime(0,0)); return epoch.addMSecs(msecs); diff --git a/src/xlsx/xlsxworkbook.cpp b/src/xlsx/xlsxworkbook.cpp index da9187d..dd86ce8 100755 --- a/src/xlsx/xlsxworkbook.cpp +++ b/src/xlsx/xlsxworkbook.cpp @@ -53,7 +53,7 @@ WorkbookPrivate::WorkbookPrivate(Workbook *q) : strings_to_numbers_enabled = false; date1904 = false; - defaultDateFormat = QStringLiteral("yyyy-mm-ddThh:mm:ss"); + defaultDateFormat = QStringLiteral("yyyy-mm-dd"); activesheet = 0; firstsheet = 0; table_count = 0; diff --git a/src/xlsx/xlsxworksheet.cpp b/src/xlsx/xlsxworksheet.cpp index ae87c2d..a02e2a3 100755 --- a/src/xlsx/xlsxworksheet.cpp +++ b/src/xlsx/xlsxworksheet.cpp @@ -49,6 +49,7 @@ #include #include +#include QT_BEGIN_NAMESPACE_XLSX @@ -516,6 +517,8 @@ QVariant Worksheet::read(int row, int column) const QDateTime dt = cell->dateTime(); if (val < 1) return dt.time(); + if (fmod(val, 1.0) < 1.0/(1000*60*60*24)) //integer + return dt.date(); return dt; } return cell->value(); @@ -848,8 +851,8 @@ int Worksheet::writeDateTime(int row, int column, const QDateTime &dt, const For if (d->checkDimensions(row, column)) return -1; - Format fmt = format; - if (!fmt.isValid()) + Format fmt = format.isValid() ? format : d->cellFormat(row, column); + if (!fmt.isValid() || !fmt.isDateTimeFormat()) fmt.setNumberFormat(d->workbook->defaultDateFormat()); d->workbook->styles()->addXfFormat(fmt); @@ -882,8 +885,8 @@ int Worksheet::writeTime(int row, int column, const QTime &t, const Format &form if (d->checkDimensions(row, column)) return -1; - Format fmt = format; - if (!fmt.isValid()) + Format fmt = format.isValid() ? format : d->cellFormat(row, column); + if (!fmt.isValid() || !fmt.isDateTimeFormat()) fmt.setNumberFormat(QStringLiteral("hh:mm:ss")); d->workbook->styles()->addXfFormat(fmt); diff --git a/tests/auto/document/tst_documenttest.cpp b/tests/auto/document/tst_documenttest.cpp index c8a0f4d..abd4bcf 100644 --- a/tests/auto/document/tst_documenttest.cpp +++ b/tests/auto/document/tst_documenttest.cpp @@ -21,6 +21,7 @@ private Q_SLOTS: void testReadWriteBlank(); void testReadWriteFormula(); void testReadWriteDateTime(); + void testReadWriteDate(); void testReadWriteTime(); }; @@ -193,7 +194,7 @@ void DocumentTest::testReadWriteDateTime() format3.setNumberFormat("dd/mm/yyyy"); xlsx1.write("A3", dt, format3); - xlsx1.write("A4", "2013-12-14"); //Auto convert to QDateTime, by QVariant + xlsx1.write("A4", "2013-12-14T12:30"); //Auto convert to QDateTime, by QVariant xlsx1.saveAs(&device); @@ -202,21 +203,72 @@ void DocumentTest::testReadWriteDateTime() QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::Numeric); QCOMPARE(xlsx2.cellAt("A1")->isDateTime(), true); QCOMPARE(xlsx2.cellAt("A1")->dateTime(), dt); + QVERIFY(xlsx2.read("A1").userType() == QMetaType::QDateTime); QCOMPARE(xlsx2.cellAt("A2")->dataType(), Cell::Numeric); -// QCOMPARE(xlsx2.cellAt("A2")->isDateTime(), true); -// QCOMPARE(xlsx2.cellAt("A2")->dateTime(), dt); + QCOMPARE(xlsx2.cellAt("A2")->isDateTime(), true); + QCOMPARE(xlsx2.cellAt("A2")->dateTime(), dt); + QVERIFY(xlsx2.read("A2").userType() == QMetaType::QDateTime); QCOMPARE(xlsx2.cellAt("A3")->dataType(), Cell::Numeric); QVERIFY(xlsx2.cellAt("A3")->format().isValid()); - qDebug()<format().numberFormat(); QCOMPARE(xlsx2.cellAt("A3")->isDateTime(), true); QCOMPARE(xlsx2.cellAt("A3")->dateTime(), dt); QCOMPARE(xlsx2.cellAt("A3")->format().numberFormat(), QString("dd/mm/yyyy")); + QCOMPARE(xlsx2.cellAt("A4")->dataType(), Cell::Numeric); + QCOMPARE(xlsx2.cellAt("A4")->isDateTime(), true); + QCOMPARE(xlsx2.cellAt("A4")->dateTime(), QDateTime(QDate(2013,12,14), QTime(12, 30))); + QVERIFY(xlsx2.read("A4").userType() == QMetaType::QDateTime); +} + +void DocumentTest::testReadWriteDate() +{ + QBuffer device; + device.open(QIODevice::WriteOnly); + + Document xlsx1; + QDate d(2012, 11, 12); + + xlsx1.write("A1", d); + + Format format; + format.setFontColor(Qt::blue); + format.setBorderStyle(Format::BorderDashDotDot); + format.setFillPattern(Format::PatternSolid); + xlsx1.write("A2", d, format); + + Format format3; + format3.setNumberFormat("dd/mm/yyyy"); + xlsx1.write("A3", d, format3); + + xlsx1.write("A4", "2013-12-14"); //Auto convert to QDateTime, by QVariant + + xlsx1.saveAs(&device); + + device.open(QIODevice::ReadOnly); + Document xlsx2(&device); + QCOMPARE(xlsx2.cellAt("A1")->dataType(), Cell::Numeric); + QCOMPARE(xlsx2.cellAt("A1")->isDateTime(), true); + QVERIFY(xlsx2.read("A1").userType() == QMetaType::QDate); + QCOMPARE(xlsx2.read("A1").toDate(), d); + + QCOMPARE(xlsx2.cellAt("A2")->dataType(), Cell::Numeric); + QCOMPARE(xlsx2.cellAt("A2")->isDateTime(), true); + QVERIFY(xlsx2.read("A2").userType() == QMetaType::QDate); + + QCOMPARE(xlsx2.cellAt("A3")->dataType(), Cell::Numeric); + QVERIFY(xlsx2.cellAt("A3")->format().isValid()); + QCOMPARE(xlsx2.cellAt("A3")->isDateTime(), true); + QCOMPARE(xlsx2.cellAt("A3")->format().numberFormat(), QString("dd/mm/yyyy")); + QVERIFY(xlsx2.read("A3").userType() == QMetaType::QDate); + QCOMPARE(xlsx2.read("A3").toDate(), d); + QCOMPARE(xlsx2.cellAt("A4")->dataType(), Cell::Numeric); QCOMPARE(xlsx2.cellAt("A4")->isDateTime(), true); QCOMPARE(xlsx2.cellAt("A4")->dateTime(), QDateTime(QDate(2013,12,14))); + QVERIFY(xlsx2.read("A4").userType() == QMetaType::QDate); + QCOMPARE(xlsx2.read("A4").toDate(), QDate(2013,12,14)); } void DocumentTest::testReadWriteTime() @@ -238,8 +290,8 @@ void DocumentTest::testReadWriteTime() QCOMPARE(xlsx2.cellAt("A2")->dataType(), Cell::Numeric); QCOMPARE(xlsx2.cellAt("A2")->isDateTime(), true); - qDebug()<value().toDouble(); - //QCOMPARE(xlsx2.read("A2").toTime(), QTime(1, 22)); //01:21:59.999 ??? + QVERIFY(xlsx2.read("A2").userType() == QMetaType::QTime); + QCOMPARE(xlsx2.read("A2").toTime(), QTime(1, 22)); } QTEST_APPLESS_MAIN(DocumentTest) diff --git a/tests/auto/utility/tst_utilitytest.cpp b/tests/auto/utility/tst_utilitytest.cpp index 19a59b1..71276b8 100644 --- a/tests/auto/utility/tst_utilitytest.cpp +++ b/tests/auto/utility/tst_utilitytest.cpp @@ -119,6 +119,7 @@ void UtilityTest::test_datetimeToNumber_data() //Note, for number 0, Excel2007 shown as 1900-1-0, which should be 1899-12-31 QTest::newRow("0") << QDateTime(QDate(1899, 12, 31), QTime(0,0)) << false << 0.0; + QTest::newRow("0.0625") << QDateTime(QDate(1899, 12, 31), QTime(1,30)) << false << 0.0625; QTest::newRow("1.25") << QDateTime(QDate(1900, 1, 1), QTime(6, 0)) << false << 1.25; QTest::newRow("59") << QDateTime(QDate(1900, 2, 28), QTime(0, 0)) << false << 59.0; QTest::newRow("61") << QDateTime(QDate(1900, 3, 1), QTime(0, 0)) << false << 61.0; @@ -162,6 +163,7 @@ void UtilityTest::test_datetimeFromNumber_data() QTest::addColumn("num"); QTest::newRow("0") << QDateTime(QDate(1899, 12, 31), QTime(0,0)) << false << 0.0; + QTest::newRow("0.0625") << QDateTime(QDate(1899, 12, 31), QTime(1,30)) << false << 0.0625; QTest::newRow("1.25") << QDateTime(QDate(1900, 1, 1), QTime(6, 0)) << false << 1.25; QTest::newRow("59") << QDateTime(QDate(1900, 2, 28), QTime(0,0)) << false << 59.0; QTest::newRow("61") << QDateTime(QDate(1900, 3, 1), QTime(0,0)) << false << 61.0;