crossplatform.ru

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

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


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

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

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




Репутация:   40  


В microsoft Excel и Word есть замечательная вешь как макросы, с помощью них и можно это все делать.
А ActiveQt дает механизм работы с ними, а следовательно и манипулирования данными документами.

Смотришь как работает макрос, ставишь запись макроса и делаешь руками необходимые тебе действия, смотришь, что там записалось и затем переводишь в Qt. В принципе ничего сложно нет, если разобраться как работаю макросы. :)

Сообщение отредактировал ViGOur - 23.11.2009, 21:52
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rosster
  опции профиля:
сообщение 24.11.2009, 21:57
Сообщение #42


Студент
*

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

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




Репутация:   0  


Цитата(ViGOur @ 23.11.2009, 21:02) *
В microsoft Excel и Word есть замечательная вешь как макросы, с помощью них и можно это все делать.
А ActiveQt дает механизм работы с ними, а следовательно и манипулирования данными документами.

Смотришь как работает макрос, ставишь запись макроса и делаешь руками необходимые тебе действия, смотришь, что там записалось и затем переводишь в Qt. В принципе ничего сложно нет, если разобраться как работаю макросы.

ну вот я и не понял как получить список листов, уже все перепробовал с этими макросами, все время пишется типа "Лист 1", "Лист 2", но сами названия то я не могу знать,мне как-то названия и надо получить в QT :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
ViGOur
  опции профиля:
сообщение 24.11.2009, 23:19
Сообщение #43


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

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

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




Репутация:   40  


Цитата
Узнать количество листов в книге можно в цикле по коллекции Workbook.Sheets.
Количество листов — свойство Sheets.Count.
Имя листа — свойство Worksheet.Name.


Попробуй руководствуясь данной цитатой набросать макрос в Excel, а потом перевести в Qt.
Была бы у меня винда сам набросал бы, но чего нет того нет. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Гость_Гость_dim_san_*_*
сообщение 26.11.2009, 13:17
Сообщение #44





Гости








    


Цитата(Rosster @ 23.11.2009, 20:51) *
Всем привет. А откуда вы берете все эти команды?


по командам можно документацию сгенерировать:
http://www.doc.crossplatform.ru/qt/4.3.2/q...teDocumentation
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 4.10.2010, 13:08
Сообщение #45


Студент
*

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

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




Репутация:   0  


   
    QString fileName = QFileDialog::getOpenFileName(this, "Open");

    QAxObject *mExcel = new QAxObject( "Excel.Application",this);

    QAxObject *workbooks = mExcel->querySubObject( "Workbooks" );

    QAxObject *workbook = workbooks->querySubObject( "Open(const QString&)", fileName );

    QAxObject *mSheets = workbook->querySubObject( "Sheets" );

    QAxObject *StatSheet = mSheets->querySubObject( "Item(const QVariant&)", QVariant("1") );

    QAxObject* cell = StatSheet->querySubObject("Cells(QVariant,QVariant)", 1, 1);

    QVariant result = cell->property("Value");
    if (result.toString() != NULL)
        qDebug() << result.toString();
  
    delete cell;
    delete StatSheet;
    delete mSheets;
    delete workbook;
    delete workbooks;
    delete mExcel;

все бы ок тока вот у меня в системе висит процесс Excel.ехе и файл который я прочел пишет доступен тока для чтения и так с любой копией моего файла
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MJIbIu
  опции профиля:
сообщение 5.10.2010, 8:59
Сообщение #46


Студент
*

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

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




Репутация:   0  


Цитата(MJIbIu @ 4.10.2010, 14:08) *
все бы ок тока вот у меня в системе висит процесс Excel.ехе и файл который я прочел пишет доступен тока для чтения и так с любой копией моего файла

workbook->dynamicCall("Close()");
mExcel->dynamicCall("Quit()");
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 16.2.2011, 20:04
Сообщение #47


Участник
**

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

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




Репутация:   1  


Может кто подсказать, а если у меня в документе Word есть таблица(правда там есть еще пару строк текста до и после нее), тока как с ней работать. Мне бы, хотя бы узнать как получить данные из 1-ой ячейки этой таблицы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 20.2.2011, 13:13
Сообщение #48


Участник
**

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

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




Репутация:   1  


Разобрался как доставать текст из таблицы. Но только из 1 элемента, пытаюсь вытащить из всей таблицы. У меня в таблице 3 колонки первые две он считывает должным образом. А вот переходя к 3-ей, он сразу же выдает ошибку.
code1
    mWord = new QAxObject(/*"Word.Application", this*/);
    mWord->setControl("Word.Application");
    mDocs = mWord->querySubObject( "Documents");
    mMyDoc = mDocs->querySubObject("Open(const QString&)", "C:\\timeTable.doc");

    mTimeTable = mMyDoc->querySubObject("Tables(1)");
    int rows = mTimeTable->querySubObject("Rows")->property("Count").toInt();
    int cols = mTimeTable->querySubObject("Columns")->property("Count").toInt();
    qDebug() << rows << cols;
    QStringList list[cols];
    const int b = 1;

    for(int j = 1; j < cols+1; j++)
    {
        for(int i = 1; i < rows+1; i++)
        {
           qDebug() << "i: " << i << "j: " << j;

           QAxObject *cell = mTimeTable->querySubObject("Cell(int, int)", i, j);
           qDebug() << 1;
           if(!cell)
           {
               if(i == rows || j == cols)
               {
                   qDebug() << "break";
                   break;
               }
               else
               {
                   qDebug() << "Continue";
                   continue;
               }
           }
           qDebug() << 2;
           QString str = cell->querySubObject("Range")->property("Text").toString();
           qDebug() << 3;
           if(str.isEmpty())
               list[j].append("Empty");
           else
               list[j].append(str);
           qDebug() <<3<<str;
           delete cell;
        }
    }

Вот вывод:
25 3
i: 1 j: 3
1
2
3
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
.. завершился с кодом 3

Еще появляеться MsgBox следующего содержания:
Microsoft Visual C++ Runtime Library
This application has requested th Runtime to terminate it in an unusual way.
Please contact the application's support team for more information.

У меня в таблице 3 колонки первые две он считывает должным образом. А вот переходя к 3-ей, он сразу же выдает ошибку.
Суть даже в том что если я делаю не в цикле а просто вытаскиваю определенный элемент из 3-го столбца то все в порядке.
code2
/    QAxObject *cell = mTimeTable->querySubObject("Cell(int, int)", QVariant(1), QVariant(3));
    qDebug() << cell->querySubObject("Range")->property("Text").toString();




Не могу понять в чем ошибка. И какой такой параметр передается в функцию не правильно.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Rocky
  опции профиля:
сообщение 20.2.2011, 14:57
Сообщение #49


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

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

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




Репутация:   7  


    for(int j = 1; j < cols+1; j++)
    {
        for(int i = 1; i < rows+1; i++)
        {


А если попробовать так:
    for(int j = 0; j < cols; j++)
    {
        for(int i = 0; i < rows; i++)
        {

?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
breeve
  опции профиля:
сообщение 20.2.2011, 19:21
Сообщение #50


Участник
**

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

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




Репутация:   1  


Цитата(Rocky @ 20.2.2011, 14:57) *
А если попробовать так?

То в функции QAxObject *cell = mTimeTable->querySubObject("Cell(int, int)", i, j);
придется прибавлять единицу, поскольку отсчет элементов идет с единицы.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 26.11.2024, 14:42