diff --git a/examples/style/main.cpp b/examples/style/main.cpp index 75bfccc..1d7e3fe 100644 --- a/examples/style/main.cpp +++ b/examples/style/main.cpp @@ -45,6 +45,10 @@ int main() sheet->write(row, col, row+col); sheet->setColumn(8, 15, 5.0, format4); + QXlsx::Format *format5 = workbook.addFormat(); + format5->setNumberFormat(22); + sheet->write("A5", QDate(2013, 8, 29), format5); + workbook.save(DATA_PATH"TestStyle.xlsx"); return 0; } diff --git a/src/xlsxworksheet.cpp b/src/xlsxworksheet.cpp index 5b69033..54d6bd0 100755 --- a/src/xlsxworksheet.cpp +++ b/src/xlsxworksheet.cpp @@ -47,7 +47,8 @@ struct XlsxCellData Number, Formula, ArrayFormula, - Boolean + Boolean, + DateTime }; XlsxCellData(const QVariant &data=QVariant(), CellDataType type=Blank, Format *format=0) : value(data), dataType(type), format(format) @@ -200,7 +201,7 @@ int Worksheet::write(int row, int column, const QVariant &value, Format *format) } else if (value.type() == QMetaType::Bool) { //Bool ret = writeBool(row,column, value.toBool(), format); } else if (value.toDateTime().isValid()) { //DateTime - + ret = writeDateTime(row, column, value.toDateTime(), format); } else if (value.toDouble(&ok), ok) { //Number if (!m_workbook->isStringsToNumbersEnabled() && value.type() == QMetaType::QString) { //Don't convert string to number if the flag not enabled. @@ -301,6 +302,15 @@ int Worksheet::writeBool(int row, int column, bool value, Format *format) return 0; } +int Worksheet::writeDateTime(int row, int column, const QDateTime &dt, Format *format) +{ + if (checkDimensions(row, column)) + return -1; + + m_cellTable[row][column] = new XlsxCellData(dt, XlsxCellData::DateTime, format); + return 0; +} + /* Check that row and col are valid and store the max and min values for use in other methods/elements. The ignore_row / @@ -499,7 +509,8 @@ void Worksheet::writeCellData(XmlStreamWriter &writer, int row, int col, XlsxCel writer.writeAttribute("t", "s"); writer.writeTextElement("v", cell->value.toString()); } else if (cell->dataType == XlsxCellData::Number){ - writer.writeTextElement("v", cell->value.toString()); + double value = cell->value.toDouble(); + writer.writeTextElement("v", QString::number(value, 'g', 15)); } else if (cell->dataType == XlsxCellData::Formula) { bool ok = true; cell->formula.toDouble(&ok); @@ -514,6 +525,16 @@ void Worksheet::writeCellData(XmlStreamWriter &writer, int row, int col, XlsxCel writer.writeTextElement("v", cell->value.toBool() ? "1" : "0"); } else if (cell->dataType == XlsxCellData::Blank) { //Ok, empty here. + } else if (cell->dataType == XlsxCellData::DateTime) { + QDateTime epoch(QDate(1899, 12, 31)); + if (m_workbook->isDate1904()) + epoch = QDateTime(QDate(1904, 1, 1)); + qint64 delta = epoch.msecsTo(cell->value.toDateTime()); + double excel_time = delta / (1000*60*60*24); + //Account for Excel erroneously treating 1900 as a leap year. + if (!m_workbook->isDate1904() && excel_time > 59) + excel_time += 1; + writer.writeTextElement("v", QString::number(excel_time, 'g', 15)); } writer.writeEndElement(); //c } diff --git a/src/xlsxworksheet.h b/src/xlsxworksheet.h index c43f935..0820651 100755 --- a/src/xlsxworksheet.h +++ b/src/xlsxworksheet.h @@ -30,6 +30,7 @@ #include #include class QIODevice; +class QDateTime; namespace QXlsx { class Package; @@ -52,6 +53,7 @@ public: int writeFormula(int row, int column, const QString &formula, Format *format=0, double result=0); int writeBlank(int row, int column, Format *format=0); int writeBool(int row, int column, bool value, Format *format=0); + int writeDateTime(int row, int column, const QDateTime& dt, Format *format=0); bool setRow(int row, double height, Format* format=0, bool hidden=false); bool setColumn(int colFirst, int colLast, double width, Format* format=0, bool hidden=false);