File: main.cpp

package info (click to toggle)
libqt5qxlsx 1.4.4-1.1
  • links: PTS
  • area: main
  • in suites: forky, sid, trixie
  • size: 15,304 kB
  • sloc: cpp: 17,870; ansic: 4,644; python: 15; makefile: 4
file content (159 lines) | stat: -rw-r--r-- 3,976 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
// QXlsx
// MIT License
// https://github.com/j2doll/QXlsx

// main.cpp

#include <QtGlobal>
#include <QObject>
#include <QString>
#include <QUrl>
#include <QList>
#include <QVariant>

#include <QDebug>

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQmlContext>

#include <cstdio>
#include <iostream>

#include "xlsxdocument.h"
#include "xlsxchartsheet.h"
#include "xlsxcellrange.h"
#include "xlsxchart.h"
#include "xlsxrichstring.h"
#include "xlsxworkbook.h"
using namespace QXlsx;

#include "XlsxTableModel.h"
#include "DynArray2D.h"

std::string convertFromNumberToExcelColumn(int n);

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute( Qt::AA_EnableHighDpiScaling );

    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;
    QQmlContext* ctxt = engine.rootContext();

    QXlsx::Document xlsx( ":/test.xlsx" ); // load xlsx
    if (!xlsx.load())
    {
        qDebug() << "[ERROR] Failed to load xlsx";
        return (-1);
    }

    QList<QString> colTitle; // list of column title
    QVector<CellLocation> vcl; // vector of cell(s) location
    Worksheet* wsheet = (Worksheet*) xlsx.workbook()->activeSheet();
    if ( NULL == wsheet )
    {
        qDebug() << "[ERROR] Failed to get active sheet";
        return (-2);
    }

    int rowMax = -1;
    int colMax = -1;
    vcl = wsheet->getFullCells( &rowMax, &colMax );

    Q_ASSERT( (-1) != rowMax ); // To CHECK
    Q_ASSERT( (-1) != colMax );

    for (int ic = 0 ; ic < colMax ; ic++)
    {
        std::string strCol = convertFromNumberToExcelColumn(ic + 1);
        QString colName = QString::fromStdString( strCol );
        colTitle.append( colName );
    }

    // make cell matrix that has (colMax x rowMax) size.

    DynArray2D< std::string > dynIntArray(colMax, rowMax);

    for ( int icl = 0; icl < vcl.size(); ++icl )
    {
          CellLocation cl = vcl.at(icl); // cell location

          // NOTICE: First cell of tableWidget is 0.
          // But first cell of Qxlsx document is 1.
          int row = cl.row - 1;
          int col = cl.col - 1;

          QSharedPointer<Cell> ptrCell = cl.cell; // cell pointer

          // value of cell
          QVariant var = cl.cell.data()->value();
          QString str = var.toString();

          // set string value to (col, row)
          dynIntArray.setValue( col, row, str.toStdString() );
    }

    QList<VLIST> xlsxData;
    for (int ir = 0; ir < rowMax; ir++ )
    {
        VLIST vl;
        for (int ic = 0; ic < colMax; ic++)
        {
            std::string value = dynIntArray.getValue( ic, ir );
            vl.append( QString::fromStdString(value) );
        }
        xlsxData.append(vl);
    }

    // set model for tableview
    XlsxTableModel xlsxTableModel(colTitle, xlsxData);
    ctxt->setContextProperty( "xlsxModel", &xlsxTableModel );

    engine.load( QUrl(QStringLiteral("qrc:/main.qml")) ); // load QML
    if ( engine.rootObjects().isEmpty() )
    {
        qDebug() << "Failed to load qml";
        return (-1);
    }

    int ret = app.exec();
    return ret;
}

std::string convertFromNumberToExcelColumn(int n)
{
    // main code from https://www.geeksforgeeks.org/find-excel-column-name-given-number/
    // Function to print Excel column name for a given column number

    std::string stdString;

    char str[1000]; // To store result (Excel column name)
    int i = 0; // To store current index in str which is result

    while ( n > 0 )
    {
        // Find remainder
        int rem = n % 26;

        // If remainder is 0, then a 'Z' must be there in output
        if ( rem == 0 )
        {
            str[i++] = 'Z';
            n = (n/26) - 1;
        }
        else // If remainder is non-zero
        {
            str[i++] = (rem-1) + 'A';
            n = n / 26;
        }
    }
    str[i] = '\0';

    // Reverse the string and print result
    std::reverse( str, str + strlen(str) );

    stdString = str;
    return stdString;
}