Перейти до основного вмісту

Qt та Excel. Робота з ячейками.

Для доступу до всіх властивостей і вмісту ячійок у Excel використовуються два об'єкти Range і Cells. Між ними є тільки одна відмінність (крім назви) - перший об'єкт забезпечує доступ до області ячійок та його аргументом є строка.
QAxObject *myRange;
myRange = sheetAct->querySubObject("Range (QVariant)", "A1:D3");
myRange->dynamicCall("Select()"); / / виділяємо діапазон ячійок
Cells забезпечує доступ тільки до однієї ячійки і аргументом є номер рядка і стовпця. Таким чином запис виду:
QAxObject *myRange;
myRange = sheetAct->querySubObject("Range(QVariant)", "A2");
і
QAxObject *myCells;
myCells = sheetAct->querySubObject("Cells (Int, Int)", 1, 2);
є рівнозначною.

Щоб визначити реальну адресу ячійки або діапазону ячійок можна скористатися властивістю Address, яке має наступні параметри: RowAbsolute, ColumnAbsolute, ReferenceStyle, External, RelativeTo.
myRange = sheetAct->querySubObject("Range (QVariant)", "A3:H8");
ui.listEdit->setText(myRange->dynamicCall("Address()"). toString()); // отримаємо $A$3:$H$8
ui.listEdit2->setText(myRange->dynamicCall("Address (QVariant, QVariant, int)", true, true, -4150). toString()); // отримаємо R3C1:R8C8
ui.listEdit3->setText myRange->dynamicCall("Address (QVariant, QVariant, int)", false, false, -4150). toString()); // отримаємо R[2]C:R[7]C[7]

Визначаємо кількість ячійок в діапазоні.
myRange = sheetAct->querySubObject("Range(QVariant)", "A3:H8");
ui.spinBox->setValue(myRange-> dynamicCall("Count()").toInt()); // отримаємо 48

Я не буду зупинятися на доступі до даних, так як це вже було описано в попередніх статтях. Зупинюся на очищенні та видаленні даних. З очищенням все просто:
myRange = sheetAct->querySubObject("Range(QVariant)","A1:D3");// вибираємо діапазон
myRange->dynamicCall("Clear()"); // очищаємо
На місці вибраного діапазону будуть чисті ячійки. У разі якщо нам потрібно не просто очистити, а видалити разом з ячійками, то користуємося функцією Delete. У функції Delete є такий параметр Shift який визначає зсув ячійок після видалення. Shift може приймати такі значення:
xlShiftToLeft = -4159 // Видалення із зсувом вліво;
xlShiftUp = -4162 // Видалення із зсувом вгору.
myRange = sheetAct->querySubObject("Range(QVariant)","A1:D8");// вибираємо діапазон
myRange->dynamicCall("Delete(Int)", -4162); // видаляємо із зсувом вгору

Вставка ячійок.
Такий же як у властивості Delete параметр Shift є у властивості Insert, і він може приймати такі значення:
xlShiftToRight = -4161 // вставка із зсувом вправо;
xlShiftDown = -4121 // вставка із зсувом вниз.
myRange->dynamicCall("Insert(Int)", -4121); // вставляємо із зсувом вниз

Формат відображення даних.
За формат відображення даних відповідає властивість NumberFormat, ми може як читати його значення, так і привласнювати.
myCells = sheetAct->querySubObject("Cells(Int, Int)", 2, 5) ;// вибираємо ячійку
ui.lineEdit_format->setText(myCells-> dynamicCall("NumberFormat").toString()) ; / читаємо в QLineEdit;
Привласнювати зручно групі ячійок коли потрібно показати дату або число в потрібному форматі:
myRange = sheetAct->querySubObject("Range (QVariant)", "A1:А80") ;// вибираємо діапазон
myRange->dynamicCall("NubmerFormat", "ДД.ММ.РРРР"); // дати в форматі "01.01.2012"
Повний список можливих форматів дат, чисел, рядків подивіться в довідці по VisualBasic встановленого у Вас Excel.

Коментарі

Популярні дописи з цього блогу

QString в HEX и обратно

Спочатку з QString робимо QByteArray. Зауважимо, якщо у вас по тексту тільки латинські букви цілком підійде варіант з .toUtf8(). Якщо ж присутня і кирилиця - обов'язково використовуємо .toLocal8Bit(). QString strA = "Some text"; QByteArray bA = strA.toLocal8Bit().toHex(); Перетворення QByteArray в початковий текст має такий вигляд: QString strB = QString::fromLocal8Bit(QByteArray::fromHex(bA))); Цікаво, що якщо ми для зберігання записали отриманий Нех куди-небудь, наприклад, в файл або базу даних у вигляді текстового рядка, то для зворотного перетворення цей рядок потрібно додатково перетворити в QByteArray. QString strA2 = QString::fromUtf8(bA); QByteArray bB = strA2.toUtf8(); QString strB = QString::fromLocal8Bit(QByteArray::fromHex(bB)));

Qt та Excel. QTableWidget туди і назад.

У цій статті мова піде про те, як прийняти дані з 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 + +) {/ / вичитуємо заголовки        ...

Qt Округлення до певного розряду

Округлення - тривіальна задача в математиці, але в Qt немає функції округлення до певного розряду. Проте в QtMath є такі функції як qFloor (qreal) і QCeil (qreal), в результаті яких int. А також можна використовуючи round (double), отримати double. Дуже швидко я знайшов ось цей ресурс звідки взяв вихідну формулу. Вона без сумніву працює, але дає результати, які не відповідаю моїм очікуванням: toRound(187.156, 2); //187.15 toRound(187.156, 1); //187.1 toRound(187.156, 0); //187 toRound(187.156, -1); //180 toRound(187.156, -2); //100 Після невеликої корекції самої функції, її підсумковий варіант виглядає так: double wcsv::toRound(double val, int r) {   double outpValue;   double tempVal;   tempVal=val*pow(10,r);   if (double(int(tempVal))+0.5==tempVal){     int(tempVal)%2 == 0       ? outpValue=double(qFloor(tempVal))/pow(10,r)       :outpValue=d...