m
mihenze8 июля 2018 г. 4: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
  • 8 июля 2018 г. 15: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 г. 5:35

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

      m
      • 10 февраля 2020 г. 6: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 г. 6:27

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

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

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

            ДА
            • 27 февраля 2020 г. 8: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
              • 27 февраля 2020 г. 14:12

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

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

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

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

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

                    Комментарии

                    Только авторизованные пользователи могут публиковать комментарии.
                    Пожалуйста, авторизуйтесь или зарегистрируйтесь
                    e
                    • ehot
                    • 1 апреля 2024 г. 0:29

                    C++ - Тест 003. Условия и циклы

                    • Результат:78баллов,
                    • Очки рейтинга2
                    B

                    C++ - Тест 002. Константы

                    • Результат:16баллов,
                    • Очки рейтинга-10
                    B

                    C++ - Тест 001. Первая программа и типы данных

                    • Результат:46баллов,
                    • Очки рейтинга-6
                    Последние комментарии
                    k
                    kmssr9 февраля 2024 г. 5:43
                    Qt Linux - Урок 001. Автозапуск Qt приложения под Linux как сделать автозапуск для флэтпака, который не даёт создавать файлы в ~/.config - вот это вопрос ))
                    АК
                    Анатолий Кононенко5 февраля 2024 г. 12:50
                    Qt WinAPI - Урок 007. Работаем с ICMP Ping в Qt Без строки #include <QRegularExpressionValidator> в заголовочном файле не работает валидатор.
                    EVA
                    EVA25 декабря 2023 г. 21:30
                    Boost - статическая линковка в CMake проекте под Windows Ошибка LNK1104 часто возникает, когда компоновщик не может найти или открыть файл библиотеки. В вашем случае, это файл libboost_locale-vc142-mt-gd-x64-1_74.lib из библиотеки Boost для C+…
                    J
                    JonnyJo25 декабря 2023 г. 19:38
                    Boost - статическая линковка в CMake проекте под Windows Сделал всё по-как у вас, но выдаёт ошибку [build] LINK : fatal error LNK1104: не удается открыть файл "libboost_locale-vc142-mt-gd-x64-1_74.lib" Хоть убей, не могу понять в чём дел…
                    G
                    Gvozdik19 декабря 2023 г. 8:01
                    Qt/C++ - Урок 056. Подключение библиотеки Boost в Qt для компиляторов MinGW и MSVC Для решения твой проблемы добавь в файл .pro строчку "LIBS += -lws2_32" она решит проблему , лично мне помогло.
                    Сейчас обсуждают на форуме
                    DA
                    Dr Gangil Academics20 апреля 2024 г. 17:45
                    Unlock Your Aesthetic Potential: Explore MSC in Facial Aesthetics and Cosmetology in India Embark on a transformative journey with an msc in facial aesthetics and cosmetology in india . Delve into the intricate world of beauty and rejuvenation, guided by expert faculty and …
                    a
                    a_vlasov14 апреля 2024 г. 16:41
                    Мобильное приложение на C++Qt и бэкенд к нему на Django Rest Framework Евгений, добрый день! Такой вопрос. Верно ли следующее утверждение: Любое Android-приложение, написанное на Java/Kotlin чисто теоретически (пусть и с большими трудностями) можно написать и на C+…
                    Павел Дорофеев
                    Павел Дорофеев14 апреля 2024 г. 12:35
                    QTableWidget с 2 заголовками Вот тут есть кастомный QTableView с многорядностью проект поддерживается, обращайтесь
                    f
                    fastrex4 апреля 2024 г. 14:47
                    Вернуть старое поведение QComboBox, не менять индекс при resetModel Добрый день! У нас много проектов в которых используется QComboBox, в версии 5.5.1, когда модель испускает сигнал resetModel, currentIndex не менялся. В версии 5.15 при resetModel происходит try…
                    P
                    Pisych27 февраля 2023 г. 15:04
                    Как получить в массив значения из связанной модели? Спасибо, разобрался:))

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