среда, 2 июля 2014 г.

Qt: Прочитать данные из Excel документа

В общем, задача простая. Нужно прочитать данные из Excel документа в таблицу QTableWidget.

Настройка проекта

В файле проекта нужно подключить модуль QAxContainer:

#-------------------------------------------------
#
# Project created by QtCreator 2014-07-01T09:03:50
#
#-------------------------------------------------

QT      += core gui sql

CONFIG  += qaxcontainer

#...

Открытие Excel документа

Открыть документ можно с помощью такого кода:

#include <QAxObject>
#include <QtGui>

//...

QAxObject* excel = new QAxObject("Excel.Application", 0);
QAxObject* workbooks = excel->querySubObject("Workbooks");
QAxObject* workbook = workbooks->querySubObject("Open(const QString&)", "D:\\doc.xlsx");
QAxObject* sheets = workbook->querySubObject("Worksheets");
QAxObject* sheet = sheets->querySubObject("Item(int)", 1);

Получить количество листов можно так:

sheets->property("Count").toInt();

Получения количества столбцов и строк

Количество используемых в документе строк можно получить с помощью такого кода

QAxObject* usedRange = sheet->querySubObject("UsedRange");
QAxObject* rows = usedRange->querySubObject("Rows");
int countRows = rows->property("Count").toInt();

Соответственно, столбцов:

QAxObject* usedRange = sheet->querySubObject("UsedRange");
QAxObject* columns = usedRange->querySubObject("Columns");
int countCols = columns->property("Count").toInt();

Чтение данных

Имея количество строк и столбцов можно заполнить таблицу значениями из документа. Делается это так:

ui->tableWidget->setRowCount(countRows);
ui->tableWidget->setColumnCount(countCols);
for ( int row = 0; row < countRows; row++ ){
    for ( int column = 0; column < countCols; column++ ){
        QAxObject* cell = sheet->querySubObject("Cells(int,int)", column + 1, row + 1);
        QVariant value = cell->property("Value");
        QTableWidgetItem* item = new QTableWidgetItem(value.toString());
        ui->tableWidget->setItem(row, column, item);
    }
}

Закрытие документа

Для того чтобы закрыть процесс нужно использовать код:

workbook->dynamicCall("Close()");
excel->dynamicCall("Quit()");

Удачи!

4 комментария:

  1. Не работает.

    ОтветитьУдалить
  2. Спасибо. Все работает.
    В строке:
    QAxObject* cell = sheet->querySubObject("Cells(int,int)", column + 1, row + 1);
    должно быть
    QAxObject* cell = sheet->querySubObject("Cells(int,int)", rows + 1, column + 1);

    ОтветитьУдалить