m
mihenze8 июля 2018 г. 14:40

ActiveQt. Вставка формул в word.

Добрый день. Возник вопрос по заполнению документа .doc из Qt. Хочу добавить в таблицу формулу (например "е" с верхним и нижним индексом), но совершенно не понимаю как это сделать. Привожу код ниже:

#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    workWord();
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::workWord()
{
    //интерфейс к MSWord
    QAxObject *wordApp = new QAxObject("Word.Application");
    //интерфейс к подобъекту - коллекция скрытых документов
    QAxObject *wordDoc = wordApp->querySubObject("Documents()");
    //создаем новый документ
    QAxObject *newDoc = wordDoc->querySubObject("Add()");

    ///Заголовок для входных данных
    QAxObject *rangeInputData = newDoc->querySubObject("Range()");
    rangeInputData->dynamicCall("SetRange(int, int)", 0, 100);
    rangeInputData->setProperty("Text", "Исходные данные.");

    //размер, шрифт, выравнивание
    QAxObject *font_rangeInputData = rangeInputData->querySubObject("Font");
    font_rangeInputData->setProperty("Size", 12);
    font_rangeInputData->setProperty("Name", "Arial");
    QAxObject *alignment_rangeInputData = rangeInputData->querySubObject("ParagraphFormat");
    alignment_rangeInputData->setProperty("Alignment", "wdAlignParagraphCenter");
    alignment_rangeInputData->setProperty("SpaceAfter", 0);

    //отступ
    rangeInputData->dynamicCall("InsertParagraphAfter()");
    rangeInputData->dynamicCall("InsertParagraphAfter()");

    ///Заголовок для 1 таблицы
    QAxObject *rangeNameT1 = newDoc->querySubObject("Range()");
    rangeNameT1->dynamicCall("SetRange(int, int)", 101, 200);
    rangeNameT1->setProperty("Text", "Таблица 1.");
    //выравнивание
    QAxObject *alignment_rangeNameT1 = rangeNameT1->querySubObject("ParagraphFormat");
    alignment_rangeNameT1->setProperty("Alignment", "wdAlignParagraphLeft");

    //таблица 1
    QAxObject *tables = newDoc->querySubObject("Tables()");
    QAxObject *rangeTable1 = newDoc->querySubObject("Range()");
    rangeTable1->dynamicCall("SetRange(int, int)", 201, 300);
    QAxObject* table1 = tables->querySubObject("Add(Range, NumRows, NumColumns, DefaultTableBehavior, AutoFitBehavior)", rangeTable1->asVariant(), 4, 3, 1, 1);
    //Заполняем таблицу
    //горизонтальные заголовки
    QAxObject *currentCell = table1->querySubObject("Cell(Row, Column)", 1, 1);
    QAxObject *rangeCurrentCell = currentCell->querySubObject("Range()");
    rangeCurrentCell->dynamicCall("InsertAfter(Text)", "Наименование");

    currentCell = table1->querySubObject("Cell(Row, Column)", 1, 2);
    rangeCurrentCell = currentCell->querySubObject("Range()");
    rangeCurrentCell->dynamicCall("InsertAfter(Text)", "Формула");

    currentCell = table1->querySubObject("Cell(Row, Column)", 1, 3);
    rangeCurrentCell = currentCell->querySubObject("Range()");
    rangeCurrentCell->dynamicCall("InsertAfter(Text)", "Значение");
    //вертикальные заголовки
    for (int i = 0; i < 3; i++)
    {
        currentCell = table1->querySubObject("Cell(Row, Column)", i+2, 1);
        rangeCurrentCell = currentCell->querySubObject("Range()");
        QString temp = "Переменная" + QString::number(i);
        rangeCurrentCell->dynamicCall("InsertAfter(Text)", temp);
    }
    //формулы


    //делаем ворд видимым
    wordApp->setProperty("Visible", true);

    delete rangeCurrentCell;
    delete currentCell;
    delete table1;
    delete rangeTable1;
    delete tables;
    delete alignment_rangeNameT1;
    delete rangeNameT1;
    delete alignment_rangeInputData;
    delete font_rangeInputData;
    delete rangeInputData;
    delete newDoc;
    delete wordDoc;
    delete wordApp;

}

Рекомендуем хостинг TIMEWEB
Рекомендуем хостинг TIMEWEB
Стабильный хостинг, на котором располагается социальная сеть EVILEG. Для проектов на Django рекомендуем VDS хостинг.

Вам это нравится? Поделитесь в социальных сетях!

9
Evgenii Legotckoi
  • 9 июля 2018 г. 1:45

После некоторого поиска информации об этом вопросе я наткнулся вот на такой кусок кода, который используется для установки верхнего индекса

ActiveDocument.Range(Start:=20, End:=22).Font.Superscript = True

Судя по всему.. это или бейсик, или паскаль.. не важно.
Возможно, можно выполнить установку верхнего индекса, если взять диапазон текста и изменить у него шрифт...
QAxObject *rangeInputData = newDoc->querySubObject("Range(Start:=20, End:=22)");
QAxObject *font_rangeInputData = rangeInputData->querySubObject("Font");
font_rangeInputData->setProperty("Superscript", True);

За полную актуальность этого решения не ручаюсь, это догадки, но путь примерно такой может быть
    ДА
    • 10 февраля 2020 г. 16:35

    Подскажите, пожалуйста, как сделать объединение ячеек в таблице?

      m
      • 10 февраля 2020 г. 17:59

      Если продолжить приведенный в вопросе мой код, то вот так можно объеденить две строки в первом столбце:

      QAxObject *cell_VerItem1 = table1->querySubObject("Cell(Row, Column)", 1, 1);
      QAxObject *cell_VerItem2 = table1->querySubObject("Cell(Row, Column)", 2, 1);
      cell_VerItem1->querySubObject("Merge(MergeTo)", cell_VerItem2->asVariant());
      
      
        ДА
        • 27 февраля 2020 г. 17:27

        В случае такого объединения в выводе приложения имеем такое сообщение: "QAxBase::querySubObject: Merge(MergeTo): Error calling function or property in (unknown)"

          m
          • 27 февраля 2020 г. 17:59

          Странно, у меня все работало, выложите ваш код может найдем в чем причина.

            ДА
            • 27 февраля 2020 г. 19:38

            Вот моя функция:
            void mergeCells(int nStartRow,int nStartCol,int nEndRow,int nEndCol)
            {
            QAxObject StartCell =_tableDoc->querySubObject("Cell(int, int)",nStartRow,nStartCol);
            QAxObject
            EndCell = _tableDoc->querySubObject("Cell(int, int)",nEndRow,nEndCol);
            StartCell->querySubObject("Merge(MergeTo)",EndCell->asVariant());

            }

              m
              • 28 февраля 2020 г. 1:12

              Попробовал у себя дома. Все работает. Вот прикладлываю проект. использовал QT5.14, MinGW5.3.0, но объединение работало и на более ранних версиях
              TestWowdTable.rar TestWowdTable.rar

                ДА
                • 2 марта 2020 г. 12:10

                Спасибо большое за проект. Само объединение у меня тоже работает. Но при выводе приложения получает следующее: QAxBase::querySubObject: Merge(MergeTo): Error calling function or property in (unknown). И поскольку объединение вызывается не один раз, хотелось от этого избавиться.
                Image_11.png Image_11.png

                  m
                  • 3 марта 2020 г. 23:05

                  Действительно, в выводе я тоже самое получаю. Раньше не обращал внимание. А теперь стало интересно из-за чего. Может кто из форумчан сможет подсказать

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    Ua

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:84баллов,
                    • Очки рейтинга4
                    Ua

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:42баллов,
                    • Очки рейтинга-8
                    ОК

                    Qt - Тест 001. Сигналы и слоты

                    • Результат:47баллов,
                    • Очки рейтинга-6
                    Последние комментарии
                    ИМ
                    Игорь Максимов22 ноября 2024 г. 21:51
                    Django - Урок 017. Кастомизированная страница авторизации на Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii Legotckoi31 октября 2024 г. 23:37
                    Django - Урок 064. Как написать расширение для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZE19 октября 2024 г. 17:19
                    Читалка fb3-файлов на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов5 октября 2024 г. 16:51
                    Django - Урок 064. Как написать расширение для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas55 июля 2024 г. 20:02
                    QML - Урок 016. База данных SQLite и работа с ней в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Сейчас обсуждают на форуме
                    f
                    firstlunoxod15 февраля 2025 г. 13:46
                    Рисование на QGraphicsScene при зажатой кнопке мыши Подскажите, пожалуйста! Как данный класс можно дополнить, чтобы созданные объекты можно было перемещать мышкой по сцене?
                    Дмитрий
                    Дмитрий3 февраля 2025 г. 16:24
                    Создание deb-пакета. Как создать ярлык на рабочем столе после установки собственного deb-пакета? Всем привет. Сделал свой deb-пакет с программой. Всё устанавливается и работает. Ставлю по пути /usr/bin/my_application. Как для пользователя при установке пакета сразу создать ярлык на раб…
                    NW
                    Nayo Wai30 января 2025 г. 19:22
                    не запускается компьютер!!! Не запускается компьютер (точнее работает блок , но сам монитор вообще жесть)В общем я ничего с интернета не скачивала в последнее время. На компе никаких левых пр…
                    n
                    nkly3 января 2025 г. 12:52
                    Нужно запретить перемещение только некоторых итемов, остальные перемещать можно. Вопрос решен. Узнать QModelIndex элемента на который мы перетаскиваем другой элемент, можно с помощью функции indexAt(event->position().toPoint()) представления QTreeViev вызываемой в переопр…
                    M
                    Marsel17 августа 2023 г. 0:26
                    OAuth2.0 через VK, получение email Спасибо большое за помощь и простите за то что отнял время своей невнимательностью.

                    Следите за нами в социальных сетях