Текущая версия |
Ваш текст |
Строка 2: |
Строка 2: |
| | | |
| Чтобы подключить библиотеку,вам необходимо в .pro файле (в каталоге с вашим проектом),дописать LIBS += -lqaxcontainer | | Чтобы подключить библиотеку,вам необходимо в .pro файле (в каталоге с вашим проектом),дописать LIBS += -lqaxcontainer |
- |
| |
- | '''Совет''': внимательно следите за создаваемыми объектами и указателями, возвращаемыми методом querySubObject(). Они не удаляются автоматически, нужно вызывать delete вручную. В противном случае будет эффективно расходоваться память, и после нескольких тысяч вызовов метода querySubObject() ваша программа и эксель в сумме займут всю память, но это полбеды - обращение к одной ячейке будет занимать секунду. Это всего лишь предостережение...
| |
- |
| |
| Ну теперь собственно приступаем к кодингу. | | Ну теперь собственно приступаем к кодингу. |
| | | |
Строка 24: |
Строка 21: |
| | | |
| Здесь идёт работа с макросами MS Office. | | Здесь идёт работа с макросами MS Office. |
- |
| |
- | == Операции с листами ==
| |
- | <source lang="cpp">
| |
- | // копирование листа "Старый лист" в "Новый лист"
| |
- | // получение указателя
| |
- | QAxObject* sheetToCopy = workbook->querySubObject("Worksheets(const QVariant&)", "Старый лист");
| |
- | // создание копии листа в место перед копируемым (слева). имя по умолчанию - "Старый лист (2)"
| |
- | sheetToCopy->dynamicCall("Copy(const QVariant&)", sheetToCopy->asVariant());
| |
- | // очистка памяти
| |
- | delete sheetToCopy;
| |
- | // получение ссылки на новый лист
| |
- | QAxObject* newSheet = workbook->querySubObject("Worksheets(const QVariant&)", "Старый лист (2)");
| |
- | // переименование нового листа
| |
- | newSheet->setProperty("Name", "Новый лист");
| |
- | // очистка памяти
| |
- | delete newSheet;
| |
- | </source>
| |
- |
| |
- | == Вставка значения в отдельную ячейку ==
| |
- | <source lang="cpp">
| |
- | // получение указателя на ячейку [row][col] ((!)нумерация с единицы)
| |
- | QAxObject* cell = StatSheet->querySubObject("Cells(QVariant,QVariant)", row, col);
| |
- | // вставка значения переменной data (любой тип, приводимый к QVariant) в полученную ячейку
| |
- | cell->setProperty("Value", QVariant(data));
| |
- | // освобождение памяти
| |
- | delete cell;
| |
- | </source>
| |
- |
| |
- | == Извлечение значения из отдельной ячейки ==
| |
- | <source lang="cpp">
| |
- | // получение указателя на ячейку [row][col] ((!)нумерация с единицы)
| |
- | QAxObject* cell = StatSheet->querySubObject("Cells(QVariant,QVariant)", row, col);
| |
- | // получение содержимого
| |
- | QVariant result = cell->property("Value");
| |
- | // освобождение памяти
| |
- | delete cell;
| |
- | </source>
| |
- |
| |
- | == Вставка данных в прямоугольную область ==
| |
- | Значительно увеличивает скорость вывода в сравнении с поячеечным способом.
| |
- | <source lang="cpp">
| |
- | // получение указателя на левую верхнюю ячейку [row][col] ((!)нумерация с единицы)
| |
- | QAxObject* Cell1 = StatSheet->querySubObject("Cells(QVariant&,QVariant&)", row, col);
| |
- | // получение указателя на правую нижнюю ячейку [row + numRows - 1][col + numCols - 1] ((!) numRows>=1,numCols>=1)
| |
- | QAxObject* Cell2 = StatSheet->querySubObject("Cells(QVariant&,QVariant&)", row + numRows - 1, col + numCols - 1);
| |
- | // получение указателя на целевую область
| |
- | QAxObject* range = StatSheet->querySubObject("Range(const QVariant&,const QVariant&)", Cell1->asVariant(), Cell2->asVariant() );
| |
- | // список ячеек строки
| |
- | QList<QVariant> cellsList;
| |
- | // список строк
| |
- | QList<QVariant> rowsList;
| |
- | for (int i = 0; i < numRows; i++)
| |
- | {
| |
- | cellsList.clear();
| |
- | for (int j = 0; j < numCols; j++)
| |
- | cellsList << i*j;
| |
- | // в список строк добавляется QVariant каждой строки
| |
- | rowsList << QVariant(cellsList);
| |
- | }
| |
- | // собственно вывод
| |
- | range->setProperty("Value", QVariant(rowsList) );
| |
- | // освобождение памяти
| |
- | delete range;
| |
- | delete Cell1;
| |
- | delete Cell2;
| |
- | </source>
| |
- |
| |
- | == Изменение цвета фона и шрифта ячейки ==
| |
- | === Цвет фона ===
| |
- | <source lang="cpp">
| |
- | // получаем указатель на ячейку [row][col] ((!)нумерация с единицы)
| |
- | QAxObject* cell = StatSheet->querySubObject("Cells(QVariant,QVariant)", row, col);
| |
- | // получаем указатель на её фон
| |
- | QAxObject* interior=cell->querySubObject("Interior");
| |
- | // устанавливаем цвет
| |
- | interior->setProperty("Color",QColor("green"));
| |
- | // освобождение памяти
| |
- | delete interior;
| |
- | delete cell;
| |
- | </source>
| |
- | === Цвет шрифта ===
| |
- | <source lang="cpp">
| |
- | // получаем указатель на ячейку [row][col] ((!)нумерация с единицы)
| |
- | QAxObject* cell=sheet->querySubObject("Cells(QVariant,QVariant)", row, col);
| |
- | // получаем указатель на её шрифт
| |
- | QAxObject* font=cell->querySubObject("Font");
| |
- | // устанавливаем цвет
| |
- | font->setProperty("Color",QColor("blue"));
| |
- | // освобождение памяти
| |
- | delete font;
| |
- | delete cell;
| |
- | </source>
| |
| | | |
| == Копирование данных из 1 ячейки в другую == | | == Копирование данных из 1 ячейки в другую == |
Строка 172: |
Строка 77: |
| rangec->dynamicCall("MergeCells",TRUE); | | rangec->dynamicCall("MergeCells",TRUE); |
| </source> | | </source> |
| + | |
| | | |
| == Разрешает перенос == | | == Разрешает перенос == |
Строка 209: |
Строка 115: |
| rangep->dynamicCall("Select()"); | | rangep->dynamicCall("Select()"); |
| // По вертикальной оси | | // По вертикальной оси |
- | rangep->dynamicCall("VerticalAlignment",-4160); | + | rangep->dynamicCall("VerticalAlignment",-4160) |
| </source> | | </source> |
| | | |
Строка 254: |
Строка 160: |
| </source> | | </source> |
| | | |
- | == Печать документа ==
| |
- | <source lang="cpp">
| |
- | // Открываем документ
| |
- | QAxObject * word = new QAxObject("Word.Application");
| |
- | word->setProperty("DisplayAlerts", "0");
| |
- | word->querySubObject("Documents")->querySubObject("Open(QVariant)", "c:\\test.xml");
| |
- | // Печатаем
| |
- | word->querySubObject("ActiveDocument")->dynamicCall("PrintOut()");
| |
- | // Закрываем
| |
- | word->querySubObject("ActiveDocument")->dynamicCall("Close()");
| |
- | word->dynamicCall("Quit()");
| |
- | </source>
| |
- |
| |
- |
| |
- | == Как получить допустимые значения определенного range с контролируемым вводом ==
| |
- | Пример: [http://dc132.file.qip.ru/img/100193079/1bfc9792/_online.JPG?sizeM=7 Example.jpg]
| |
- | Иногда ячейке назначено свойство контроля вводимых значений, иногда бывает полезно получить список допустимых значений, искомый обьект называется Validation и является членом класса Range, обратиться к нему можно так:
| |
- | <source lang="cpp-qt">
| |
- | //ссылка на обьект реализующий контроль вводимых значений
| |
- | QAxObject *or = range->querySubObject("Validation");
| |
- | // в формула этого обьекта и содержит знание о том какие значения
| |
- | // в ячейке будут являться допустимыми, там правда еще formula2 есть, но она в моем случае была пуста.
| |
- | QString s = or->dynamicCall("formula1").toString();
| |
- | </source>
| |
- | Не удивительно что там окажется ссылка именнованного массива "Name" (=имя_именнованного_массива) член класса WorkBook или WorkSheet, по этому вот пример обращния к нему:
| |
- | <source lang="cpp-qt">
| |
- | //получаем ссылку на именованный массив
| |
- | name = workbook->querySubObject("Names(const QVariant&)", QVariant(s));
| |
- | //получаем ссылку на искомый массив
| |
- | s = name->dynamicCall("RefersTo").toString();
| |
- | </source>
| |
| | | |
| Ну вот собственно на этом я наверно и завершу написание статьи по работе библиотеки QT c MS Office Excel. Далее задавайте вопросы,будем уже на конкретных примерах разбираться. | | Ну вот собственно на этом я наверно и завершу написание статьи по работе библиотеки QT c MS Office Excel. Далее задавайте вопросы,будем уже на конкретных примерах разбираться. |