Ruslan PolupanAug. 9, 2019, 9:16 a.m.

Проект iMpos. Часть 011. Просмотр наименований топлива. Экспорт результатов в xlsx файл.

Content

Просмотр наименований топлива.

После обработки запросов на получение наименований, формируем таблицу для отображения информации пользователю.

Индикация процесс выполнения запросов к базам данных азс будет использоваться не только для просмотра, а также при экспорте в xlsx и при выполнении скриптов изменяющих наименования. Для для этого в конструктор класса диалога ViewFuelNameDialog добавим еще один параметр определяющий дальнейшие действия. Список действий определим в качестве перечисления.
tasklist.h

#ifndef TASKLIST_H
#define TASKLIST_H

enum taskList {                 //Список задач
    VIEW_NAME,                  //Просмотр наименований
    XLSX_EXPORT,                //Экспорт в xlsx
    UPDATE_FUEL_NAME            //Изменение наименований
};

#endif // TASKLIST_H

Изменим обработчик сигнала accepted() buttonBoxView:

void FuelNameDialog::on_buttonBoxView_accepted()
{
    //Определяем дальнейший алгоритм работы в зависимости от выбранного checkBox
    int currentTask = (ui->radioButtonReport->isChecked()) ? VIEW_NAME : XLSX_EXPORT;
    //Диалог для отображения результатов и прогресса получения данных с АЗС
    ViewFuelNameDialog *viewFnDlg = new ViewFuelNameDialog(&listTerminals,currentTask, this);
    viewFnDlg->exec();
}

В слоте slotGetStatusThread добавляем проверку на завершение операций получения наименований и в зависимости от типа задачи вызываем соответствующую функцию.

    ui->progressBarGetFuel->setFormat("Обработано %v из %m. Ошибок "+QString::number(colError));
    //Проверяем что произошло получение информации от всех АЗС указанных в списке
    //И в зависимости от типа задачи запускаем соответствующую функцию
    //Сортируем список азс определив статическую функцию compare
    std::sort(m_listFuelName.begin(), m_listFuelName.end(),compare);
    if(ui->progressBarGetFuel->value() == m_connectionsList.size()){
        switch (m_currentTask) {
        case VIEW_NAME:
            showFuelName();
            break;
        case XLSX_EXPORT:
            exportXlsx();
            break;
        default:
            break;
        }
    }

Функция реализации отображения наименований

//Отображение наименований
void ViewFuelNameDialog::showFuelName()
{
    QSqlQuery q;
    ui->groupBoxProgress->hide();
    ui->tableWidgetView->setColumnCount(4);
    ui->tableWidgetView->setHorizontalHeaderLabels(QStringList() <<"Резервуар"<<"Код"<<"Краткое"<<"Полное");
    ui->tableWidgetView->verticalHeader()->hide();
    int colAzs = m_listFuelName.size();
    for(int i = 0; i<colAzs; ++i ){
        //Добавляем строку с номером и адресом АЗС
        int row = ui->tableWidgetView->rowCount();
        ui->tableWidgetView->insertRow(row);
        QTableWidgetItem *itemAZS = new QTableWidgetItem(QString::number(m_listFuelName.at(i).terminalID())+" "+m_listFuelName.at(i).azsName());
        itemAZS->setTextAlignment(Qt::AlignHCenter);
        itemAZS->setBackground(QColor("#aaff7f"));
        //Объединяем ячейки
        ui->tableWidgetView->setSpan(row,0,1,4);
        ui->tableWidgetView->setItem(row,0,itemAZS);
        for(int j = 0; j<m_listFuelName.at(i).listFuels().size();++j){
            //Заполняем строки наименованиями
            int rowName = ui->tableWidgetView->rowCount();
            ui->tableWidgetView->insertRow(rowName);
            ui->tableWidgetView->setItem(rowName,0, new QTableWidgetItem(QString::number(m_listFuelName.at(i).listFuels().at(j).tankID())));
            ui->tableWidgetView->item(rowName,0)->setTextAlignment(Qt::AlignCenter);
            ui->tableWidgetView->setItem(rowName,1, new QTableWidgetItem(QString::number(m_listFuelName.at(i).listFuels().at(j).fuelID())));
            ui->tableWidgetView->item(rowName,1)->setTextAlignment(Qt::AlignCenter);
            ui->tableWidgetView->setItem(rowName,2, new QTableWidgetItem(m_listFuelName.at(i).listFuels().at(j).shortName()));
            ui->tableWidgetView->setItem(rowName,3, new QTableWidgetItem(m_listFuelName.at(i).listFuels().at(j).name()));
            ui->tableWidgetView->resizeColumnToContents(3);
        }
    }
    ui->tableWidgetView->verticalHeader()->setDefaultSectionSize(ui->tableWidgetView->verticalHeader()->minimumSectionSize());
    ui->groupBoxView->show();
}

Экспорт результатов в XSLX файл.

Для экспорта результатов в xlsx файл будем использовать библиотеку QXlsx https://qtexcel.github.io/QXlsx/ . я остановился на ней посмотрев примеры использования и доступную инструкцию для подключения к проекту. Скомпилировал примеры и достаточно быстро разобрался в простейшем использовании библиотеки.
Инструкция по подключению представлена здесь https://qtexcel.github.io/QXlsx/HowToSetProject.html .

Кратко она выглядит так:
Клонируем исходники с github

git clone https://github.com/j2doll/QXlsx.git

Копируем содержимое папки QXlsx (папка header, source и файлы QXlsx.pri, QXlsx.pro) в папку нашего проекта.

Добавляем в наш файл проекта (*.pro)

# QXlsx code for Application Qt project
QXLSX_PARENTPATH=./         # current QXlsx path is . (. means curret directory)
QXLSX_HEADERPATH=./header/  # current QXlsx header path is ./header/
QXLSX_SOURCEPATH=./source/  # current QXlsx source path is ./source/
include(./QXlsx.pri)

В файле в котором будем использовать библиотеку добавляем заголовочные файлы.

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

Библиотека готова к использованию.

void ViewFuelNameDialog::exportXlsx()
{
    Document xlsx;          // Будущий документ
    Format format;          // Формат обычных ячеек
    Format formatMerge;     // Формат объединенной ячейки
    Format formatTitle;     // Формат заголовка

    //Задаем параметры форматирования
    format.setHorizontalAlignment(Format::AlignHCenter);
    format.setVerticalAlignment(Format::AlignVCenter);
    format.setBorderStyle(Format::BorderThin);

    formatMerge.setPatternBackgroundColor(QColor("#aaff7f"));
    formatMerge.setHorizontalAlignment(Format::AlignHCenter);
    formatMerge.setVerticalAlignment(Format::AlignVCenter);
    formatMerge.setBorderStyle(Format::BorderThin);

    formatTitle.setHorizontalAlignment(Format::AlignHCenter);
    formatTitle.setVerticalAlignment(Format::AlignVCenter);
    formatTitle.setFontBold(true);
    formatTitle.setBorderStyle(Format::BorderThin);
    formatTitle.setPatternBackgroundColor(QColor("#A9BCF5"));

    //Необходимо отметить что нумерация строк и столбцов в xlsx документе начинается с 1
    //Устанавливаем ширину столбцов
    xlsx.setColumnWidth(1,10);
    xlsx.setColumnWidth(4,30);

    int columnCount = headers.size();
    int colAzs = m_listFuelName.size();
    //Заполняем заголовки
    for(int i =0; i<columnCount; ++i){
        xlsx.write(1,i+1, headers.at(i),formatTitle);
    }

    //Табличная часть
    int rowX=2;
    for(int i=0; i<colAzs; ++i){
        xlsx.write(rowX,1, QString::number(m_listFuelName.at(i).terminalID())+" "+m_listFuelName.at(i).azsName());
        CellRange cellRange = CellRange(rowX,1,rowX,columnCount);
        xlsx.mergeCells(cellRange, formatMerge);
        for(int j = 0; j<m_listFuelName.at(i).listFuels().size(); ++j) {
            rowX++;
            xlsx.write(rowX,1,m_listFuelName.at(i).listFuels().at(j).tankID(),format);
            xlsx.write(rowX,2,m_listFuelName.at(i).listFuels().at(j).fuelID(),format);
            xlsx.write(rowX,3,m_listFuelName.at(i).listFuels().at(j).shortName(),format);
            xlsx.write(rowX,4,m_listFuelName.at(i).listFuels().at(j).name(),format);
        }
    }
    QFile xlsxFile;
    //Создаем абсолютный путь к файлу
    xlsxFile.setFileName(QApplication::applicationDirPath()+"/"+"FuelName.xlsx");
    xlsx.saveAs(xlsxFile.fileName()); // Сохраняем документ
#ifdef Q_OS_WIN
    QDesktopServices::openUrl(QUrl("file:///"+xlsxFile.fileName(), QUrl::TolerantMode));
#else
    QDesktopServices::openUrl(QUrl("file://"+xlsxFile.fileName(), QUrl::TolerantMode));
#endif
    this->reject();
}

Получам файл FuelName.xlsx который открывается программой по умолчанию.

Архив проекта

iMposCh011.zip iMposCh011.zip

.

We recommend hosting TIMEWEB
We recommend hosting TIMEWEB
Stable hosting, on which the social network EVILEG is located. For projects on Django we recommend VDS hosting.

Comments

Only authorized users can post comments.
Please, Log in or Sign up
How to become an author?

Contribute to the evolution of the EVILEG community.

Learn how to become a site author.

Learn it
Donate

Good day, Dear Users!!!

I am Evgenii Legotckoi, developer of EVILEG. And it is my hobby project, which helps to learn programming another programmers and developers

If the site helped you, and you want also support the development of the site, than you can donate by following ways

PayPalYandex.Money
Timeweb

Let me recommend you the excellent hosting on which EVILEG is located.

For many years, Timeweb has been proving his stability.

For projects on Django I recommend VDS hosting

View Hosting
KA

C++ - Тест 003. Условия и циклы

  • Result:78points,
  • Rating points2
R

C++ - Test 002. Constants

  • Result:75points,
  • Rating points2
R

C++ - Test 001. The first program and data types

  • Result:73points,
  • Rating points1
Last comments
V

Django - Tutorial 027. Implementation Google reCAPTCHA

Спасибо. Только использую декоратор не в urls.py а перед views
R

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Вы меня не совсем правильно поняли, но все равно спасибо, принял все к сведению. Все сделал как вы сказали, все отлично работает, еще раз огромнейшее спасибо) Разве что только что были опять про…

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Стоило перед использованием что ли инструкцию прочитать https://www.cyberforum.ru/blogs/131347/blog2457.html "После сборки при запуске требовались dll," Ясное дело стоило задепло…
R
R

Qt WinAPI - Lesson 001. How to collect all DLL, which used in Qt project?

Да, собралось. После сборки при запуске требовались dll, перекинул всю папки bin, plugins(не знаю как можно было сделать более умно). Как я понял в первой строке путь к екзешнику вставляю, втор…
Now discuss on the forum

Как в Qt сохранить файл в папку загрузок в Android

Вызывайте эту функцию или в самом начале, или когда нужно сохранять файлы. Она дает права доступа для записи.

QML+QtGraphicalEffects

да, сборку делал без параметра поиска qml, хотя dll QtGraphicalEffects он подтягивает, когда я добавил всю папку QtGraphicalEffects в проект - то заработало, похоже что именно qml-файлов ему не …

Не работают слоты/сигналы

и посмотрите работу с потоками в Qt, там подробно описано как передавать данные с одного в потока в другой при помощи сигналов и слотов

Как в Qt в qmenu добавить scrollarea

Вот это наследованный класс меню. Но посути это обычное меню. #pragma once#include <QtWidgets>class TransMenu : public QMenu { Q_OBJECTpublic: TransMenu(QWidget* parent = …

Qt C++ и Python

Красиво/некрасиво - это скорее моё личное отношение. Если есть возможность ограничить количество интсрументов, то лучше ограничить. Но не зацикливайтесь на этом. Если у вас есть скрипты Py…
About
Services
© EVILEG 2015-2020
Recommend hosting TIMEWEB