crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

8 страниц V  < 1 2 3 4 5 > »   
Ответить в данную темуНачать новую тему
> Cells в QT при работе с MS Office
ViGOur
  опции профиля:
сообщение 29.5.2009, 21:12
Сообщение #21


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Цитата(Rocky @ 29.5.2009, 21:07) *
4. Как изменить параметры страницы? (например, сделать лист альбомной ориентации, чтобы после вывода данных в excel пользователю в случае печати не нужно было ничего настраивать).
На VBA это будет так:
   ' альбомная ориентация 
   ActiveSheet.PageSetup.Orientation = xlLandscape
   ' книжная ориентация
   ActiveSheet.PageSetup.Orientation = xlPortrait
следовательно, делаем примерно так:
QAxObject *mExcel = new QAxObject( "Excel.Application",this); 
QAxObject *workbooks = mExcel->querySubObject( "Workbooks" );
QAxObject *workbook = workbooks->querySubObject( "Open(const QString&)", "C:\\q\\1\\otchet.xls" );
QAxObject *mSheets = workbook->querySubObject( "Sheets" );
QAxObject *StatSheet = mSheets->querySubObject( "Item(const QVariant&)", QVariant("topic") );

QAxObject *pageSetup  = StatSheet ->querySubObject( "PageSetup");
// устанавливаем альбомную ориентацию
pageSetup->setProperty( "Orientation ", "xlLandscape");
код не проверял, но думаю должен работать. :)

Если работает, то можно будет данный код добавить в вики, как и твой.

p.s. будет время приведу пример, как сделать остальные пункты. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 29.5.2009, 21:54
Сообщение #22


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Хе-хе )) работает ))
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 2.6.2009, 21:59
Сообщение #23


Старейший участник
****

Группа: Участник
Сообщений: 530
Регистрация: 22.12.2008
Из: Санкт-Петербург
Пользователь №: 463

Спасибо сказали: 22 раз(а)




Репутация:   7  


Вспомнил что когда-то давно что-то писал на VBA. Вобщем, общая идея работы с ActiveQT - эта библиотека позволяет работать с любыми библиотеками/приложениями, поддерживающими COM. Список методов и свойств объектов можно посмотреть в tlb-хе соответствующего приложения (например, через OLEView). Если етсь *.tlh или idl-ник - можно и там напрямую через текстовые редакторы. В случае с Excel идеально помогает VBA. Запускаем Excel, жмем Alt+F11, пишем процедуру открытия книги например и там эксперементируем. По "F2" можно посмотреть список классов их методов и свойств. Выбираем метод - давим "F1", читаем как им пользоваться. Далее читаем документацию по функциям ActiveQt - querySubObject/dynamicCall/setProperty/property.

1. Как вставить картинку в ячейку?
На VBA будет так:
Worksheets(1).Shapes.AddPicture "filename.bmp", True, True, 100, 100, 70, 70

Пробовал переписать так:
QAxObject *pShape = pNewSheet->querySubObject("Shapes");
if (pShape)
{
           QAxObject *pShape2 = pShape->querySubObject("AddPicture(const QString&, bool, bool, int, int, int, int)", "filename.bmp", true, true, 100, 100, 70, 70);
           int z = 0;
}

не фурычит. pShape2 == NULL и картинка не грузица. В querySubObject если нужно вызывать функцию, нужно описать сигнатуру этой функции.. А сигнатура такая:
Function AddPicture(Filename As String, LinkToFile As MsoTriState, SaveWithDocument As MsoTriState, Left As Single, Top As Single, Width As Single, Height As Single) As Shape

Я много как пробовал: не хотит пока. Че писать пока не понял (особенно насчет MsoTriState)....

2. Как создать новый workbook и в нем sheet с заданным именем?

Создаем новую книгу (при этом совершенно необязательно что-то там открывать с диска)
QAxObject *pWorkbooks = m_pExcel->querySubObject("Workbooks");
if (!pWorkbooks)
{
         return NULL;
}

QAxObject *pWorkbook = pWorkbooks->querySubObject("Add");
if (!pWorkbook)
{
         return NULL;
}

QAxObject *pSheets = pWorkbook->querySubObject("Sheets");
if (!pSheets)
{
         return NULL;
}


Удалить листы можно так:
QAxObject *pSheet1 = pSheets->querySubObject("Item(const QString&)", qApp->tr("Лист1")); 
if (pSheet1) pSheet1->querySubObject("Delete");
QAxObject *pSheet2 = pSheets->querySubObject("Item(const QString&)", qApp->tr("Лист2"));
if (pSheet2) pSheet2->querySubObject("Delete");
QAxObject *pSheet3 = pSheets->querySubObject("Item(const QString&)", qApp->tr("Лист3"));
if (pSheet3) pSheet3->querySubObject("Delete");

Новый лист создать можно так:
//добавляем новый лист и обзываем его sSheetName
QAxObject *pNewSheet = pSheets->querySubObject("Add");
if (!pNewSheet)
{
          return NULL;
}
pNewSheet->setProperty("Name", sSheetName);



3. Как изменить формат представления данных в ячейке? (например, я ввожу число "5.2" - а отображается "5 февраля")
На VBA так:
Worksheets("Лист1").Range("A1").NumberFormat = "General"


На ActiveQT чет не особо работает. Поэтому решил проблему так:
//проверяем цифра ли sText или текст (чтобы заменить "." на ",")
bool bOK;
sText.toDouble(&bOK);

QString sText2 = sText;
if (bOK) sText2 = sText2.replace('.', ",");

//выводим в ячейку текст
pRange->dynamicCall("setValue(const QVariant&)", sText2);

//вот так пробовал, но формат особо не меняется
//pRange->setProperty("NumberFormat", "General");


4. Как изменить параметры страницы? (например, сделать лист альбомной ориентации, чтобы после вывода данных в excel пользователю в случае печати не нужно было ничего настраивать).

Вот так можно задать границы области печати (и задать ориентацию (собсно ка ViGOur писал выше)):
QAxObject *pPageSetup = pNewSheet->querySubObject("PageSetup");
if (pPageSetup)
{
          pPageSetup->setProperty("LeftMargin", 5);
          pPageSetup->setProperty("RightMargin", 5);
          pPageSetup->setProperty("TopMargin", 5);
          pPageSetup->setProperty("BottomMargin", 5);
          pPageSetup->setProperty("HeaderMargin", 5);
          pPageSetup->setProperty("FooterMargin", 5);
          pPageSetup->setProperty("Orientation", "xlLandscape");
}


Сообщение отредактировал Rocky - 2.6.2009, 22:54
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 2.6.2009, 22:21
Сообщение #24


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9656
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(Rocky @ 3.6.2009, 1:59) *
"I:\1\2\4.bmp"
заэкранируй слэши.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
croc
  опции профиля:
сообщение 10.9.2009, 9:22
Сообщение #25


Новичок


Группа: Новичок
Сообщений: 3
Регистрация: 15.7.2009
Пользователь №: 911

Спасибо сказали: 1 раз(а)




Репутация:   0  


А как получать массив значений определенного range?

Иногда ячейке назначено свойство контроля вводимых значений, иногда бывает полезно получить список допустимых значений, искомый обьект называется Validation и является членом класса Range, обратиться к нему можно так:

QAxObject *or = range->querySubObject("Validation"); 
//ссылка на обьект реализующий контроль вводимых значений

QString s = or->dynamicCall("formula1").toString();
//в формула этого обьекта и содержит знание о том какие значения в ячейке будут являться допустимыми, там правда еще formula2 есть, но она в моем случае была пуста.


Не удивительно что там окажется ссылка именнованного массива "Name" (=имя_именнованного_массива) член класса WorkBook или WorkSheet, по этому вот пример обращния к нему:

name = workbook->querySubObject("Names(const QVariant&)", QVariant(s));
//получаем ссылку на именованный массив

s = name->dynamicCall("RefersTo").toString();
//получаем ссылку на искомый массив
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 10.9.2009, 14:23
Сообщение #26


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Добавил в вики.
croc, в случае чего, каждый участник форума может залогинится в вики, под тем же именем пользователя и паролем, что и на форуме.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_admsasha_*
сообщение 5.10.2009, 6:07
Сообщение #27





Гости








    


А как в открытом документе сделать "поиск и замена"

открыл, например test.doc, а дальше ?
    QAxObject word("Word.Application");
    word.setProperty("Visible", true);
    word.dynamicCall("Activate()");
    word.querySubObject("Documents")->querySubObject("Open(QVariant)", "c:\\test.doc");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
arial
  опции профиля:
сообщение 16.10.2009, 7:46
Сообщение #28


Студент
*

Группа: Участник
Сообщений: 39
Регистрация: 27.9.2009
Пользователь №: 1121

Спасибо сказали: 9 раз(а)




Репутация:   0  


Цитата(abra @ 1.4.2009, 0:17) *
Вот еще накодил)))) Устанавливает положение текста.
...
Я здесь напишу основные.
Выравнивание по левому краю: -4131
Выравнивание по центру: -4108
Выравнивание по правому краю: -4152

Это для вертикального выравнивания:
...
Выравнивание по верхнему краю: -4160
Выравнивание по центру: -4108
Выравнивание по нижнему краю: -4107

Полный список констант можно найти здесь.
Конкретно по выравниванию:
Цитата
xlHAlignCenter -4108
xlHAlignCenterAcrossSelection 7
xlHAlignDistributed -4117
xlHAlignFill 5
xlHAlignGeneral 1
xlHAlignJustify -4130
xlHAlignLeft -4131
xlHAlignRight -4152
xlVAlignBottom -4107
xlVAlignCenter -4108
xlVAlignDistributed -4117
xlVAlignJustify -4130
xlVAlignTop -4160

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
admsasha
  опции профиля:
сообщение 24.10.2009, 16:35
Сообщение #29


Новичок


Группа: Новичок
Сообщений: 4
Регистрация: 5.10.2009
Пользователь №: 1140

Спасибо сказали: 1 раз(а)




Репутация:   0  


Открытие и печать документа

    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()");

Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 24.10.2009, 18:23
Сообщение #30


Мастер
******

Группа: Модератор
Сообщений: 3291
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 4

Спасибо сказали: 231 раз(а)




Репутация:   40  


Добавил в вики
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

8 страниц V  < 1 2 3 4 5 > » 
Быстрый ответОтветить в данную темуНачать новую тему
Теги


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 14.11.2019, 1:31