Редактирование: Работа с MS Office с помощью ActiveQt

Материал из Wiki.crossplatform.ru

Перейти к: навигация, поиск
Внимание: Вы не представились системе. Ваш IP-адрес будет записан в историю изменений этой страницы.
Правка может быть отменена. Пожалуйста, просмотрите сравнение версий, чтобы убедиться, что это именно те изменения, которые вас интересуют, и нажмите «Записать страницу», чтобы изменения вступили в силу.
Текущая версия Ваш текст
Строка 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. Далее задавайте вопросы,будем уже на конкретных примерах разбираться.

Пожалуйста, обратите внимание, что все ваши добавления могут быть отредактированы или удалены другими участниками. Если вы не хотите, чтобы кто-либо изменял ваши тексты, не помещайте их сюда.
Вы также подтверждаете, что являетесь автором вносимых дополнений, или скопировали их из источника, допускающего свободное распространение и изменение своего содержимого (см. Wiki.crossplatform.ru:Авторское право). НЕ РАЗМЕЩАЙТЕ БЕЗ РАЗРЕШЕНИЯ ОХРАНЯЕМЫЕ АВТОРСКИМ ПРАВОМ МАТЕРИАЛЫ!