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

Qt та Excel. Робота з книгами і листами.

Тема Qt та Excel виявилася досить актуальною, тому спробую розвинути питання про доступ до даних .xls файлу використовуючи ActiveQt.

Оголошення змінних:
QAxObject *excel; //Excel
QAxObject *wbook; //Workbooks
QAxObject *book; // Активная книга
QAxObject *sheets; //Листы
QAxObject *activeSheet;//Активный лист

Запуск Excel:
excel = new QAxObject("Excel.Application",this);
excel->setProperty("Visible", 0);
excel->setProperty("DisplayAterts",0);
wbook = excel->querySubObject("Workbooks");
sheets = book->querySubObject("Sheets");
activeSheet = book->querySubObject("ActiveSheet");

Закриття Excel:
wbook->dynamicCall(“Close()”);
excel->dynamicCall(“Quit()”);
delete excel; // так напевно Excel не буде висіти в процесах.

Створення нової книги:
wbook->dynamicCall(Add());
Відкриття існуючої книги:
book = wbook->dynamicCall(“Open(const QString&)”, filename);
Збереження:
wbook->dynamicCall(“SaveAs(const QString&)”, filename);
wbook->dynamicCall(“Save()”);

Створення нових листів книги:
sheets->dynamicCall(Add());
Видаляємо лист:
int numList; // Номер аркуша, нумерація аркушів починається з 1.
sheets->querySubObject(“Item(int)”, numList)->dynamicCall(“Delete()”);

Визначаємо кількість листів:
int countSheets;
countSheets = sheets->dynamicCall(“Count()”).toInt();
Читаємо імена листів:
QStringList nameSheetsList;
for (int a = 1; a <= countSheets; a++){
    nameSheetsList << sheets->querySubObject(“Item(int)”, a)
->dynamicCall(“Name()”).toString();
}
Змінити або дати ім'я новому листу:
QString name(“Имя листа”);
activeSheet->dynamicCall("Name", name);

Встановлюємо на лист захист по паролю:
QString password; // власне сам пароль
activeSheet->dynamicCall(“Protect(QVariant)”,password);

Продовження...

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

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...

CSV в QTableWidget

Питання виникло в зв'язку з виниклою необхідністю прочитати .xls файл в Linux'і. Я так думаю у більшості користувачів Linux, є якийсь небудь офісний пакет, такий як OpenOffice або LibreOffice або щось там ще, за допомогою якого можна легко конвертувати .xls в .сsv. А .сsv - це текст, який можна читати в будь-якій системі. Пропоную читати файл у QTableWidget. Зберемо простеньку програму. Файл file_csv.csv виглядає так:   На форму покладемо QTableWidget, QListWidget, QPushButton. void MainWindow::readFile(){     QFile file("file_csv.csv"); //файл (треба буде зробити діалог)     QStringList listA; //лист в який запишемо данні     int row = 0; //кількість рядків у майбутній таблиці (ми ж не знаємо скільки їх там ;)     if (file.open(QIODevice::ReadOnly)){         while (!file.atEnd()){             QString line = file.r...

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 + +) {/ / вичитуємо заголовки        ...