File indexing completed on 2025-01-19 13:27:37

0001 /*
0002  * This file is part of Office 2007 Filters for Calligra
0003  *
0004  * Copyright (C) 2010 Sebastian Sauer <sebsauer@kdab.com>
0005  * Copyright (C) 2009-2010 Nokia Corporation and/or its subsidiary(-ies).
0006  *
0007  * Contact: Suresh Chande suresh.chande@nokia.com
0008  *
0009  * This library is free software; you can redistribute it and/or
0010  * modify it under the terms of the GNU Lesser General Public License
0011  * version 2.1 as published by the Free Software Foundation.
0012  *
0013  * This library is distributed in the hope that it will be useful, but
0014  * WITHOUT ANY WARRANTY; without even the implied warranty of
0015  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
0016  * Lesser General Public License for more details.
0017  *
0018  * You should have received a copy of the GNU Lesser General Public
0019  * License along with this library; if not, write to the Free Software
0020  * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
0021  * 02110-1301 USA
0022  *
0023  */
0024 
0025 #ifndef XLSXXMLWORKSHEETREADER_H
0026 #define XLSXXMLWORKSHEETREADER_H
0027 
0028 #include <KoBorder.h>   // needed by DrawingMLMethods
0029 
0030 //#include <MsooXmlThemesReader.h>
0031 #include <MsooXmlTheme.h>
0032 #include <MsooXmlCommonReader.h>
0033 
0034 #include <KoGenStyle.h>
0035 #include <styles/KoCharacterStyle.h>
0036 
0037 #include "XlsxXmlDocumentReader.h"
0038 
0039 class XlsxXmlWorksheetReaderContext;
0040 class XlsxComments;
0041 class XlsxStyles;
0042 class XlsxImport;
0043 class Sheet;
0044 
0045 //! A class reading MSOOXML XLSX markup - xl/worksheets/sheet*.xml part.
0046 class XlsxXmlWorksheetReader : public MSOOXML::MsooXmlCommonReader
0047 {
0048 public:
0049     explicit XlsxXmlWorksheetReader(KoOdfWriters *writers);
0050 
0051     ~XlsxXmlWorksheetReader() override;
0052 
0053     //! Reads/parses the XML.
0054     KoFilter::ConversionStatus read(MSOOXML::MsooXmlReaderContext* context = 0) override;
0055 
0056 protected:
0057     KoFilter::ConversionStatus readInternal();
0058     KoFilter::ConversionStatus read_chartsheet();
0059     KoFilter::ConversionStatus read_worksheet();
0060     KoFilter::ConversionStatus read_dialogsheet();
0061     KoFilter::ConversionStatus read_sheetHelper(const QString& type);
0062     KoFilter::ConversionStatus read_sheetFormatPr();
0063     KoFilter::ConversionStatus read_cols();
0064     KoFilter::ConversionStatus read_col();
0065     KoFilter::ConversionStatus read_sheetData();
0066     KoFilter::ConversionStatus read_conditionalFormatting();
0067     KoFilter::ConversionStatus read_cfRule();
0068     KoFilter::ConversionStatus read_formula();
0069     KoFilter::ConversionStatus read_row();
0070     KoFilter::ConversionStatus read_c();
0071     KoFilter::ConversionStatus read_f();
0072     KoFilter::ConversionStatus read_v();
0073     KoFilter::ConversionStatus read_mergeCell();
0074     KoFilter::ConversionStatus read_mergeCells();
0075     KoFilter::ConversionStatus read_drawing();
0076     KoFilter::ConversionStatus read_legacyDrawing();
0077     KoFilter::ConversionStatus read_hyperlink();
0078     KoFilter::ConversionStatus read_hyperlinks();
0079     KoFilter::ConversionStatus read_picture();
0080     KoFilter::ConversionStatus read_autoFilter();
0081     KoFilter::ConversionStatus read_filterColumn();
0082     KoFilter::ConversionStatus read_filters();
0083     KoFilter::ConversionStatus read_filter();
0084     KoFilter::ConversionStatus read_customFilters();
0085     KoFilter::ConversionStatus read_customFilter();
0086     KoFilter::ConversionStatus read_oleObjects();
0087     KoFilter::ConversionStatus read_oleObject();
0088     KoFilter::ConversionStatus read_controls();
0089     KoFilter::ConversionStatus read_control();
0090     KoFilter::ConversionStatus read_tableParts();
0091     KoFilter::ConversionStatus read_tablePart();
0092 
0093     XlsxXmlWorksheetReaderContext* m_context;
0094 
0095     KoGenStyle m_tableStyle;
0096     //! for table:table-column
0097     int m_columnCount;
0098     //! for table:table-row
0099     int m_currentRow;
0100     //! for table:table-cell
0101     int m_currentColumn;
0102     //! Used in read_f() and read_v()
0103     QString m_value;
0104 
0105     // for optimization
0106     static const char officeValue[];
0107     static const char officeDateValue[];
0108     static const char officeTimeValue[];
0109     static const char officeStringValue[];
0110     static const char officeBooleanValue[];
0111 
0112 private:
0113     void init();
0114     ///Column width measured as the number of characters of the maximum digit width of the
0115     ///numbers 0, 1, 2,..., 9 as rendered in the normal style's font...
0116     /// @return column width in cm
0117     QString computeColumnWidth(qreal widthNumber) const;
0118 
0119     QString processRowStyle(qreal height = -1.0);
0120 
0121     void showWarningAboutWorksheetSize();
0122     void saveColumnStyle(const QString& widthString);
0123     void appendTableColumns(int columns, const QString& width = QString());
0124     void appendTableCells(int cells);
0125     //! Saves annotation element (comments) for cell specified by @a col and @a row it there is any annotation defined.
0126     void saveAnnotation(int col, int row);
0127 
0128     typedef QPair<int, QMap<QString, QString> > Condition;
0129     QList<Condition> m_conditionalIndices;
0130     QMap<QString, QList<Condition> > m_conditionalStyles;
0131 
0132     QString m_formula;
0133 
0134 #include <MsooXmlCommonReaderMethods.h>
0135 #include <MsooXmlCommonReaderDrawingMLMethods.h>
0136 
0137     class Private;
0138     Private* const d;
0139 };
0140 
0141 class XlsxXmlWorksheetReaderContext : public MSOOXML::MsooXmlReaderContext
0142 {
0143 public:
0144     //! Creates the context object.
0145     XlsxXmlWorksheetReaderContext(
0146         uint _worksheetNumber,
0147         uint _numberOfWorkSheets,
0148         const QString& _worksheetName,
0149         const QString& _state,
0150         const QString _path, const QString _file,
0151         MSOOXML::DrawingMLTheme*& _themes,
0152         const QVector<QString>& _sharedStrings,
0153         const XlsxComments& _comments,
0154         const XlsxStyles& _styles,
0155         MSOOXML::MsooXmlRelationships& _relationships,
0156         XlsxImport* _import,
0157         QMap<QString, QString> _oleReplacements,
0158         QMap<QString, QString> _oleBeginFrames,
0159         QVector<XlsxXmlDocumentReaderContext::AutoFilter>& autoFilters);
0160 
0161     ~XlsxXmlWorksheetReaderContext() override;
0162 
0163     Sheet* sheet;
0164     const uint worksheetNumber;
0165     const uint numberOfWorkSheets;
0166     const QString worksheetName;
0167     QString state;
0168     MSOOXML::DrawingMLTheme* themes;
0169     const QVector<QString> *sharedStrings;
0170     const XlsxComments* comments;
0171     const XlsxStyles* styles;
0172 
0173     XlsxImport* import;
0174     const QString path;
0175     const QString file;
0176 
0177     QMap<QString, QString> oleReplacements;
0178     QMap<QString, QString> oleFrameBegins;
0179 
0180     XlsxXmlDocumentReaderContext::AutoFilterCondition currentFilterCondition;
0181     QVector<XlsxXmlDocumentReaderContext::AutoFilter>& autoFilters;
0182 
0183     bool firstRoundOfReading;
0184 
0185     QList<QMap<QString, QString> > conditionalStyleForPosition(const QString& positionLetter, int positionNumber);
0186 
0187     QList<QPair<QString, QMap<QString, QString> > >conditionalStyles;
0188 };
0189 
0190 #endif