В общем, задача простая. Нужно прочитать данные из 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);
Для твоего конкретного случая.
Удалить