В общем, задача простая. Нужно прочитать данные из 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()");
Удачи!
Не работает.
ОтветитьУдалитьСкорее всего для старенького Qt
УдалитьСпасибо. Все работает.
ОтветитьУдалитьВ строке:
QAxObject* cell = sheet->querySubObject("Cells(int,int)", column + 1, row + 1);
должно быть
QAxObject* cell = sheet->querySubObject("Cells(int,int)", rows + 1, column + 1);
Для твоего конкретного случая.
Удалить