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

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

                    Комментарии

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

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:50баллов,
                    • Очки рейтинга-4
                    m
                    • molni99
                    • 26 октября 2024 г. 1:37

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:80баллов,
                    • Очки рейтинга4
                    m
                    • molni99
                    • 26 октября 2024 г. 1:29

                    C++ - Тест 004. Указатели, Массивы и Циклы

                    • Результат:20баллов,
                    • Очки рейтинга-10
                    Последние комментарии
                    i
                    innorwall14 ноября 2024 г. 19:03
                    Qt/C++ - Урок 060. Настройка внешнего вида приложения в рантайме I didnt have an issue work colors priligy dapoxetine 60mg revia cost uk August 3, 2022 Reply
                    i
                    innorwall14 ноября 2024 г. 11:42
                    Как Копировать Файлы в Linux If only females relatives with DZ offspring were considered these percentages were 23 order priligy online uk
                    i
                    innorwall14 ноября 2024 г. 9:09
                    Qt/C++ - Урок 068. Hello World с использованием системы сборки CMAKE в CLion ditropan pristiq dosing With the Yankees leading, 4 3, Rivera jogged in from the bullpen to a standing ovation as he prepared for his final appearance in Chicago buy priligy pakistan
                    i
                    innorwall14 ноября 2024 г. 4:05
                    EVILEG-CORE. Использование Google reCAPTCHA 2001; 98 29 34 priligy buy
                    Сейчас обсуждают на форуме
                    i
                    innorwall14 ноября 2024 г. 3:39
                    добавить qlineseries в функции priligy amazon canada 93 GREB1 protein GREB1 AB011147 6
                    i
                    innorwall11 ноября 2024 г. 10:55
                    Всё ещё разбираюсь с кешем. priligy walgreens levitra dulcolax carbs The third ring was found to be made up of ultra relativistic electrons, which are also present in both the outer and inner rings
                    9
                    9Anonim25 октября 2024 г. 9:10
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…
                    ИМ
                    Игорь Максимов3 октября 2024 г. 4:05
                    Реализация навигации по разделам Спасибо Евгений!

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