Add QDateTime support for QXlsx::Cell

This commit is contained in:
Debao Zhang
2013-10-25 15:23:03 +08:00
parent 1b5d22e3ee
commit 8faebaaa91
12 changed files with 215 additions and 16 deletions
+26 -1
View File
@@ -24,6 +24,11 @@
****************************************************************************/
#include "xlsxcell.h"
#include "xlsxcell_p.h"
#include "xlsxformat.h"
#include "xlsxutility_p.h"
#include "xlsxworksheet.h"
#include "xlsxworkbook.h"
#include <QDateTime>
QT_BEGIN_NAMESPACE_XLSX
@@ -44,12 +49,13 @@ CellPrivate::CellPrivate(Cell *p) :
* \internal
* Created by Worksheet only.
*/
Cell::Cell(const QVariant &data, DataType type, Format *format) :
Cell::Cell(const QVariant &data, DataType type, Format *format, Worksheet *parent) :
d_ptr(new CellPrivate(this))
{
d_ptr->value = data;
d_ptr->dataType = type;
d_ptr->format = format;
d_ptr->parent = parent;
}
/*!
@@ -88,4 +94,23 @@ QString Cell::formula() const
return d->formula;
}
/*!
* Returns whether the value is probably a dateTime or not
*/
bool Cell::isDateTime() const
{
Q_D(const Cell);
if (d->dataType == Numeric && d->format && d->format->isDateTimeFormat())
return true;
return false;
}
QDateTime Cell::dateTime() const
{
Q_D(const Cell);
if (!isDateTime())
return QDateTime();
return datetimeFromNumber(d->value.toDouble(), d->parent->workbook()->isDate1904());
}
QT_END_NAMESPACE_XLSX
+4 -1
View File
@@ -54,11 +54,14 @@ public:
Format * format() const;
QString formula() const;
bool isDateTime() const;
QDateTime dateTime() const;
private:
friend class Worksheet;
friend class WorksheetPrivate;
Cell(const QVariant &data=QVariant(), DataType type=Blank, Format *format=0);
Cell(const QVariant &data=QVariant(), DataType type=Blank, Format *format=0, Worksheet *parent=0);
CellPrivate * const d_ptr;
};
+1
View File
@@ -39,6 +39,7 @@ public:
Cell::DataType dataType;
Format *format;
Worksheet *parent;
Cell *q_ptr;
};
+26
View File
@@ -25,6 +25,7 @@
#include "xlsxformat.h"
#include "xlsxformat_p.h"
#include <QDataStream>
#include <QRegularExpression>
#include <QDebug>
QT_BEGIN_NAMESPACE_XLSX
@@ -87,6 +88,7 @@ void Format::setNumberFormatIndex(int format)
Q_D(Format);
d->dirty = true;
d->numberData.formatIndex = format;
d->numberData._valid = true;
}
/*!
@@ -102,15 +104,39 @@ QString Format::numberFormat() const
/*!
* Set number \a format.
* http://office.microsoft.com/en-001/excel-help/create-a-custom-number-format-HP010342372.aspx
*/
void Format::setNumberFormat(const QString &format)
{
Q_D(Format);
if (format.isEmpty())
return;
d->dirty = true;
d->numberData.formatString = format;
d->numberData._valid = false; //formatIndex must be re-generated
}
/*!
* Returns whether the number format is probably a dateTime or not
*/
bool Format::isDateTimeFormat() const
{
Q_D(const Format);
if (d->numberData._valid && d->numberData.formatString.isEmpty()) {
int idx = d->numberData.formatIndex;
//Built in date time number index
if ((idx >= 15 && idx <= 22) || (idx >= 45 && idx <= 47))
return true;
} else {
//Gauss from the number string
QString formatCode = d->numberData.formatString;
formatCode.remove(QRegularExpression(QStringLiteral("\\[(Green|White|Blue|Magenta|Yellow|Cyan|Red)\\]")));
if (formatCode.contains(QRegularExpression(QStringLiteral("[dmhys]"))))
return true;
}
return false;
}
/*!
* \internal
*/
+5
View File
@@ -31,6 +31,8 @@
#include <QByteArray>
#include <QList>
class FormatTest;
QT_BEGIN_NAMESPACE_XLSX
class Styles;
@@ -133,6 +135,7 @@ public:
void setNumberFormatIndex(int format);
QString numberFormat() const;
void setNumberFormat(const QString &format);
bool isDateTimeFormat() const;
int fontSize() const;
void setFontSize(int size);
@@ -210,6 +213,8 @@ private:
friend class Styles;
friend class Worksheet;
friend class WorksheetPrivate;
friend class ::FormatTest;
Format();
bool numFmtIndexValid() const;
+29 -13
View File
@@ -378,7 +378,7 @@ int Worksheet::writeString(int row, int column, const QString &value, Format *fo
d->sharedStrings()->addSharedString(content);
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(content, Cell::String, format));
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(content, Cell::String, format, this));
d->workbook->styles()->addFormat(format);
return error;
}
@@ -396,7 +396,7 @@ int Worksheet::writeInlineString(int row, int column, const QString &value, Form
error = -2;
}
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::InlineString, format));
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::InlineString, format, this));
d->workbook->styles()->addFormat(format);
return error;
}
@@ -407,7 +407,7 @@ int Worksheet::writeNumeric(int row, int column, double value, Format *format)
if (d->checkDimensions(row, column))
return -1;
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::Numeric, format));
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::Numeric, format, this));
d->workbook->styles()->addFormat(format);
return 0;
}
@@ -424,7 +424,7 @@ int Worksheet::writeFormula(int row, int column, const QString &content, Format
if (formula.startsWith(QLatin1String("=")))
formula.remove(0,1);
Cell *data = new Cell(result, Cell::Formula, format);
Cell *data = new Cell(result, Cell::Formula, format, this);
data->d_ptr->formula = formula;
d->cellTable[row][column] = QSharedPointer<Cell>(data);
d->workbook->styles()->addFormat(format);
@@ -438,7 +438,7 @@ int Worksheet::writeBlank(int row, int column, Format *format)
if (d->checkDimensions(row, column))
return -1;
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(QVariant(), Cell::Blank, format));
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(QVariant(), Cell::Blank, format, this));
d->workbook->styles()->addFormat(format);
return 0;
@@ -450,7 +450,7 @@ int Worksheet::writeBool(int row, int column, bool value, Format *format)
if (d->checkDimensions(row, column))
return -1;
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::Boolean, format));
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::Boolean, format, this));
d->workbook->styles()->addFormat(format);
return 0;
@@ -469,7 +469,7 @@ int Worksheet::writeDateTime(int row, int column, const QDateTime &dt, Format *f
double value = datetimeToNumber(dt, d->workbook->isDate1904());
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::Numeric, format));
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(value, Cell::Numeric, format, this));
d->workbook->styles()->addFormat(format);
return 0;
@@ -517,7 +517,7 @@ int Worksheet::writeHyperlink(int row, int column, const QUrl &url, Format *form
//Write the hyperlink string as normal string.
d->sharedStrings()->addSharedString(displayString);
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(displayString, Cell::String, format));
d->cellTable[row][column] = QSharedPointer<Cell>(new Cell(displayString, Cell::String, format, this));
d->workbook->styles()->addFormat(format);
//Store the hyperlink data in a separate table
@@ -1124,6 +1124,7 @@ QSharedPointer<Cell> WorksheetPrivate::readNumericCellData(XmlStreamReader &read
void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
{
Q_Q(Worksheet);
Q_ASSERT(reader.name() == QLatin1String("sheetData"));
while(!(reader.name() == QLatin1String("sheetData") && reader.tokenType() == QXmlStreamReader::EndElement)) {
@@ -1162,6 +1163,8 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
if (attributes.hasAttribute(QLatin1String("s"))) {
int idx = attributes.value(QLatin1String("s")).toInt();
format = workbook->styles()->xfFormat(idx);
if (!format)
qDebug()<<"Invalid style index: "<<idx;
}
if (attributes.hasAttribute(QLatin1String("t"))) {
@@ -1174,7 +1177,7 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
int sst_idx = reader.readElementText().toInt();
sharedStrings()->incRefByStringIndex(sst_idx);
QString value = sharedStrings()->getSharedString(sst_idx);
QSharedPointer<Cell> data(new Cell(value ,Cell::String, format));
QSharedPointer<Cell> data(new Cell(value ,Cell::String, format, q));
cellTable[pos.x()][pos.y()] = QSharedPointer<Cell>(data);
}
}
@@ -1185,7 +1188,7 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
if (reader.tokenType() == QXmlStreamReader::StartElement) {
if (reader.name() == QLatin1String("t")) {
QString value = reader.readElementText();
QSharedPointer<Cell> data(new Cell(value, Cell::InlineString, format));
QSharedPointer<Cell> data(new Cell(value, Cell::InlineString, format, q));
cellTable[pos.x()][pos.y()] = data;
}
}
@@ -1195,13 +1198,14 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
reader.readNextStartElement();
if (reader.name() == QLatin1String("v")) {
QString value = reader.readElementText();
QSharedPointer<Cell> data(new Cell(value.toInt() ? true : false, Cell::Boolean, format));
QSharedPointer<Cell> data(new Cell(value.toInt() ? true : false, Cell::Boolean, format, q));
cellTable[pos.x()][pos.y()] = data;
}
} else if (type == QLatin1String("str")) {
//formula type
QSharedPointer<Cell> data = readNumericCellData(reader);
data->d_ptr->format = format;
data->d_ptr->parent = q;
cellTable[pos.x()][pos.y()] = data;
} else if (type == QLatin1String("e")) {
//error type, such as #DIV/0! #NULL! #REF! etc
@@ -1215,20 +1219,23 @@ void WorksheetPrivate::readSheetData(XmlStreamReader &reader)
f_str = reader.readElementText();
}
}
QSharedPointer<Cell> data(new Cell(v_str, Cell::Error, format));
QSharedPointer<Cell> data(new Cell(v_str, Cell::Error, format, q));
if (!f_str.isEmpty())
data->d_ptr->formula = f_str;
cellTable[pos.x()][pos.y()] = data;
} else if (type == QLatin1String("n")) {
QSharedPointer<Cell> data = readNumericCellData(reader);
data->d_ptr->format = format;
data->d_ptr->parent = q;
cellTable[pos.x()][pos.y()] = data;
}
} else {
//default is "n"
QSharedPointer<Cell> data = readNumericCellData(reader);
data->d_ptr->format = format;
cellTable[pos.x()][pos.y()] = data; }
data->d_ptr->parent = q;
cellTable[pos.x()][pos.y()] = data;
}
}
}
}
@@ -1364,4 +1371,13 @@ SharedStrings *WorksheetPrivate::sharedStrings() const
return workbook->sharedStrings();
}
/*!
* Return the workbook
*/
Workbook *Worksheet::workbook() const
{
Q_D(const Worksheet);
return d->workbook;
}
QT_END_NAMESPACE_XLSX
+1
View File
@@ -80,6 +80,7 @@ public:
QString sheetName() const;
void setSheetName(const QString &sheetName);
Workbook *workbook() const;
~Worksheet();
private:
friend class Package;