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

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 Округлення до певного розряду

Округлення - тривіальна задача в математиці, але в 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...