123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353 |
- // xlsxcell.cpp
- #include <cmath>
- #include <QtGlobal>
- #include <QDebug>
- #include <QDateTime>
- #include <QDate>
- #include <QTime>
- #include "xlsxcell.h"
- #include "xlsxcell_p.h"
- #include "xlsxformat.h"
- #include "xlsxformat_p.h"
- #include "xlsxutility_p.h"
- #include "xlsxworksheet.h"
- #include "xlsxworkbook.h"
- QT_BEGIN_NAMESPACE_XLSX
- CellPrivate::CellPrivate(Cell *p) :
- q_ptr(p)
- {
- }
- CellPrivate::CellPrivate(const CellPrivate * const cp)
- : parent(cp->parent)
- , cellType(cp->cellType)
- , value(cp->value)
- , formula(cp->formula)
- , format(cp->format)
- , richString(cp->richString)
- , styleNumber(cp->styleNumber)
- {
- }
- /*!
- \class Cell
- \inmodule QtXlsx
- \brief The Cell class provides a API that is used to handle the worksheet cell.
- */
- /*!
- \enum Cell::CellType
- \value BooleanType Boolean type
- \value NumberType Number type, can be blank or used with forumula
- \value ErrorType Error type
- \value SharedStringType Shared string type
- \value StringType String type, can be used with forumula
- \value InlineStringType Inline string type
- */
- /*!
- * \internal
- * Created by Worksheet only.
- */
- // qint32 styleIndex = (-1)
- Cell::Cell(const QVariant &data,
- CellType type,
- const Format &format,
- Worksheet *parent,
- qint32 styleIndex ) :
- d_ptr(new CellPrivate(this))
- {
- d_ptr->value = data;
- d_ptr->cellType = type;
- d_ptr->format = format;
- d_ptr->parent = parent;
- d_ptr->styleNumber = styleIndex;
- }
- /*!
- * \internal
- */
- Cell::Cell(const Cell * const cell):
- d_ptr(new CellPrivate(cell->d_ptr))
- {
- d_ptr->q_ptr = this;
- }
- /*!
- * Destroys the Cell and cleans up.
- */
- Cell::~Cell()
- {
- if ( NULL != d_ptr )
- delete d_ptr;
- }
- /*!
- * Return the dataType of this Cell
- */
- Cell::CellType Cell::cellType() const
- {
- Q_D(const Cell);
- return d->cellType;
- }
- /*!
- * Return the data content of this Cell
- */
- QVariant Cell::value() const
- {
- Q_D(const Cell);
- return d->value;
- }
- /*!
- * Return the data content of this Cell for reading
- */
- QVariant Cell::readValue() const
- {
- Q_D(const Cell);
- QVariant ret; // return value
- ret = d->value;
- Format fmt = this->format();
- if (isDateTime())
- {
- QVariant vDT = dateTime();
- if ( vDT.isNull() )
- {
- return QVariant();
- }
- // https://github.com/QtExcel/QXlsx/issues/171
- // https://www.qt.io/blog/whats-new-in-qmetatype-qvariant
- #if QT_VERSION >= 0x060000 // Qt 6.0 or over
- if ( vDT.metaType().id() == QMetaType::QDateTime )
- {
- ret = vDT;
- }
- else if ( vDT.metaType().id() == QMetaType::QDate )
- {
- ret = vDT;
- }
- else if ( vDT.metaType().id() == QMetaType::QTime )
- {
- ret = vDT;
- }
- else
- {
- return QVariant();
- }
- #else
- if ( vDT.type() == QVariant::DateTime )
- {
- ret = vDT;
- }
- else if ( vDT.type() == QVariant::Date )
- {
- ret = vDT;
- }
- else if ( vDT.type() == QVariant::Time )
- {
- ret = vDT;
- }
- else
- {
- return QVariant();
- }
- #endif
- // QDateTime dt = dateTime();
- // ret = dt;
-
- // QString strFormat = fmt.numberFormat();
- // if (!strFormat.isEmpty())
- // {
- // // TODO: use number format
- // }
- // qint32 styleNo = d->styleNumber;
- // if (styleNo == 10)
- // {
- // }
- // if (styleNo == 11)
- // {
- // QTime timeValue = dt.time(); // only time. (HH:mm:ss)
- // ret = timeValue;
- // return ret;
- // }
- // if (styleNo == 12)
- // {
- // }
- // if (styleNo == 13) // (HH:mm:ss)
- // {
- // double dValue = d->value.toDouble();
- // int day = int(dValue); // unit is day.
- // double deciamlPointValue1 = dValue - double(day);
- // double dHour = deciamlPointValue1 * (double(1.0) / double(24.0));
- // int hour = int(dHour);
- // double deciamlPointValue2 = deciamlPointValue1 - (double(hour) * (double(1.0) / double(24.0)));
- // double dMin = deciamlPointValue2 * (double(1.0) / double(60.0));
- // int min = int(dMin);
- // double deciamlPointValue3 = deciamlPointValue2 - (double(min) * (double(1.0) / double(60.0)));
- // double dSec = deciamlPointValue3 * (double(1.0) / double(60.0));
- // int sec = int(dSec);
-
- // int totalHour = hour + (day * 24);
- // QString strTime;
- // strTime = QString("%1:%2:%3").arg(totalHour).arg(min).arg(sec);
- // ret = strTime;
- // return ret;
- // }
- // return ret;
- // */
- }
- if (hasFormula())
- {
- QString formulaString = this->formula().formulaText();
- ret = formulaString;
- return ret; // return formula string
- }
- return ret;
- }
- /*!
- * Return the style used by this Cell. If no style used, 0 will be returned.
- */
- Format Cell::format() const
- {
- Q_D(const Cell);
- return d->format;
- }
- /*!
- * Returns true if the cell has one formula.
- */
- bool Cell::hasFormula() const
- {
- Q_D(const Cell);
- return d->formula.isValid();
- }
- /*!
- * Return the formula contents if the dataType is Formula
- */
- CellFormula Cell::formula() const
- {
- Q_D(const Cell);
- return d->formula;
- }
- /*!
- * Returns whether the value is probably a dateTime or not
- */
- bool Cell::isDateTime() const
- {
- Q_D(const Cell);
- Cell::CellType cellType = d->cellType;
- double dValue = d->value.toDouble(); // number
- // QString strValue = d->value.toString().toUtf8();
- bool isValidFormat = d->format.isValid();
- bool isDateTimeFormat = d->format.isDateTimeFormat(); // datetime format
- // dev67
- if ( cellType == NumberType ||
- cellType == DateType ||
- cellType == CustomType )
- {
- if ( dValue >= 0 &&
- isValidFormat &&
- isDateTimeFormat )
- {
- return true;
- }
- }
- return false;
- }
- /*!
- * Return the data time value.
- */
- /*
- QDateTime Cell::dateTime() const
- {
- Q_D(const Cell);
- if (!isDateTime())
- return QDateTime();
- return datetimeFromNumber(d->value.toDouble(), d->parent->workbook()->isDate1904());
- }
- */
- QVariant Cell::dateTime() const
- {
- Q_D(const Cell);
- if (!isDateTime())
- {
- return QVariant();
- }
- // dev57
- QVariant ret;
- double dValue = d->value.toDouble();
- bool isDate1904 = d->parent->workbook()->isDate1904();
- ret = datetimeFromNumber(dValue, isDate1904);
- return ret;
- }
- /*!
- * Returns whether the cell is probably a rich string or not
- */
- bool Cell::isRichString() const
- {
- Q_D(const Cell);
- if ( d->cellType != SharedStringType &&
- d->cellType != InlineStringType &&
- d->cellType != StringType )
- {
- return false;
- }
- return d->richString.isRichString();
- }
- qint32 Cell::styleNumber() const
- {
- Q_D(const Cell);
- qint32 ret = d->styleNumber;
- return ret;
- }
- QT_END_NAMESPACE_XLSX
|