У
цій статті мова піде про те, як прийняти дані з Excel в QTableWidget і
відправити назад в Excel. Візьмемо
книгу Excel у якої є 2 листа, на першому розташована невелика таблиця (її ми і
буде читати в QTableWidget), а в другій лист порожній, сюди ми віддамо таблицю
з QTableWidget.
Ось
так, як на малюнку праворуч, виглядає цільова таблиця.
На формі розташуємо QTableWidget. Заздалегідь знаючи, якого розміру таблиця, можна відразу виставити кількість стовпців, рядків, прописати назви стовпців, але ми не будемо цього робити.
Почнемо з читання таблиці.
QAxObject * list;
list = sheets-> querySubObject ("Item (int)", 1); / / оголошуємо лист, на якому таблиця
int colEx = 6; / / оголошуємо кількість стовпців
QStringList headers; / / сюди запишемо заголовки стовпців
for (int a = 1; a <= colEx; a + +) {/ / вичитуємо заголовки
headers << list-> querySubObject ("Cells (int, int)", 2, a) -> dynamicCall ("Value"). toString ();
}
ui-> tableWidget-> setColumnCount (colEx); / / встановлюємо кількість стовпців
ui-> tableWidget-> setHorizontalHeaderLabels (headers); / / передаємо заголовки
for (int row = 3; row <= 7; row + +) {/ / вичитуємо таблицю даних
ui-> tableWidget-> insertRow (row - 3);
for (int col = 1; col <= colEx; col + +) {
QTableWidgetItem * item = new QTableWidgetItem (list-> querySubObject ("Cells (int, int)", row, col) -> dynamicCall ("Value"). ToString ());
ui-> tableWidget-> setItem (row-3, col-1, item);
}
}

На формі розташуємо QTableWidget. Заздалегідь знаючи, якого розміру таблиця, можна відразу виставити кількість стовпців, рядків, прописати назви стовпців, але ми не будемо цього робити.
Почнемо з читання таблиці.
QAxObject * list;
list = sheets-> querySubObject ("Item (int)", 1); / / оголошуємо лист, на якому таблиця
int colEx = 6; / / оголошуємо кількість стовпців
QStringList headers; / / сюди запишемо заголовки стовпців
for (int a = 1; a <= colEx; a + +) {/ / вичитуємо заголовки
headers << list-> querySubObject ("Cells (int, int)", 2, a) -> dynamicCall ("Value"). toString ();
}
ui-> tableWidget-> setColumnCount (colEx); / / встановлюємо кількість стовпців
ui-> tableWidget-> setHorizontalHeaderLabels (headers); / / передаємо заголовки
for (int row = 3; row <= 7; row + +) {/ / вичитуємо таблицю даних
ui-> tableWidget-> insertRow (row - 3);
for (int col = 1; col <= colEx; col + +) {
QTableWidgetItem * item = new QTableWidgetItem (list-> querySubObject ("Cells (int, int)", row, col) -> dynamicCall ("Value"). ToString ());
ui-> tableWidget-> setItem (row-3, col-1, item);
}
}
У
результаті повинно вийти щось на зразок цього.
Тепер
передамо таблицю з QTableWidget у другій лист, в те ж саме місце, де таблиця
знаходиться на першому аркуші.
QAxObject * listB;
listB = sheets-> querySubObject ("Item (int)", 2);
QAxObject * cell = listB-> querySubObject ("Cells (int, int)", 1, 1);
cell-> dynamicCall ("Value", "this table from QTableWidget"); / / ... дамо таблиці хоч якийсь заголовок
for (int a = 0; a <ui-> tableWidget-> columnCount (); a + +) {/ / відправляємо спочатку заголовки
QAxObject * cell = listB-> querySubObject ("Cells (int, int)", 2, a +1);
cell-> dynamicCall ("Value", ui-> tableWidget-> horizontalHeaderItem (a) -> data (Qt :: DisplayRole). toString ());
}
for (int row = 0; row <ui-> tableWidget-> rowCount (); row + +) {/ / тепер таблицю
for (int col = 0; col <ui-> tableWidget-> columnCount (); col + +) {
QAxObject * cell = listB-> querySubObject ("Cells (int, int)", row + 3, col +1); / / коригування змінних рядків і стовпців потрібно зробити обов'язково, так як в Excel немає нульового рядка і нульового стовпця
cell-> dynamicCall ("Value", ui-> tableWidget-> item (row, col) -> data (Qt :: DisplayRole). toString ());
}
}
QAxObject * listB;
listB = sheets-> querySubObject ("Item (int)", 2);
QAxObject * cell = listB-> querySubObject ("Cells (int, int)", 1, 1);
cell-> dynamicCall ("Value", "this table from QTableWidget"); / / ... дамо таблиці хоч якийсь заголовок
for (int a = 0; a <ui-> tableWidget-> columnCount (); a + +) {/ / відправляємо спочатку заголовки
QAxObject * cell = listB-> querySubObject ("Cells (int, int)", 2, a +1);
cell-> dynamicCall ("Value", ui-> tableWidget-> horizontalHeaderItem (a) -> data (Qt :: DisplayRole). toString ());
}
for (int row = 0; row <ui-> tableWidget-> rowCount (); row + +) {/ / тепер таблицю
for (int col = 0; col <ui-> tableWidget-> columnCount (); col + +) {
QAxObject * cell = listB-> querySubObject ("Cells (int, int)", row + 3, col +1); / / коригування змінних рядків і стовпців потрібно зробити обов'язково, так як в Excel немає нульового рядка і нульового стовпця
cell-> dynamicCall ("Value", ui-> tableWidget-> item (row, col) -> data (Qt :: DisplayRole). toString ());
}
}
Залишається побажати успіху тим, хто попав на мій блог щоб чогось дізнатися.
Коментарі
Дописати коментар