Add basic QDateTime support

This commit is contained in:
Debao Zhang
2013-08-29 11:12:17 +08:00
parent d9b7feb912
commit 1e4f34942b
3 changed files with 30 additions and 3 deletions
+24 -3
View File
@@ -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
}
+2
View File
@@ -30,6 +30,7 @@
#include <QMap>
#include <QVariant>
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);