m
mihenze08 липня 2018 р. 04: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
  • 08 липня 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 р. 05:35

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

      m
      • 10 лютого 2020 р. 06: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 р. 06:27

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

          m
          • 27 лютого 2020 р. 06:59

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

            ДА
            • 27 лютого 2020 р. 08: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

                ДА
                • 02 березня 2020 р. 01:10

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

                  m
                  • 03 березня 2020 р. 12:05

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

                    Коментарі

                    Only authorized users can post comments.
                    Please, Log in or Sign up
                    AD

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

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

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

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

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

                    • Результат:20бали,
                    • Рейтинг балів-10
                    Останні коментарі
                    ИМ
                    Игорь Максимов22 листопада 2024 р. 22:51
                    Django - Підручник 017. Налаштуйте сторінку входу до Django Добрый вечер Евгений! Я сделал себе авторизацию аналогичную вашей, все работает, кроме возврата к предидущей странице. Редеректит всегда на главную, хотя в логах сервера вижу запросы на правильн…
                    Evgenii Legotckoi
                    Evgenii Legotckoi01 листопада 2024 р. 00:37
                    Django - Урок 064. Як написати розширення для Python Markdown Добрый день. Да, можно. Либо через такие же плагины, либо с постобработкой через python библиотеку Beautiful Soup
                    A
                    ALO1ZE19 жовтня 2024 р. 18:19
                    Читалка файлів fb3 на Qt Creator Подскажите как это запустить? Я не шарю в программировании и кодинге. Скачал и установаил Qt, но куча ошибок выдается и не запустить. А очень надо fb3 переконвертировать в html
                    ИМ
                    Игорь Максимов05 жовтня 2024 р. 17:51
                    Django - Урок 064. Як написати розширення для Python Markdown Приветствую Евгений! У меня вопрос. Можно ли вставлять свои классы в разметку редактора markdown? Допустим имея стандартную разметку: <ul> <li></li> <li></l…
                    d
                    dblas505 липня 2024 р. 21:02
                    QML - Урок 016. База даних SQLite та робота з нею в QML Qt Здравствуйте, возникает такая проблема (я новичок): ApplicationWindow неизвестный элемент. (М300) для TextField и Button аналогично. Могу предположить, что из-за более новой верси…
                    Тепер обговоріть на форумі
                    Evgenii Legotckoi
                    Evgenii Legotckoi25 червня 2024 р. 01:11
                    добавить qlineseries в функции Я тут. Работы оень много. Отправил его в бан.
                    t
                    tonypeachey115 листопада 2024 р. 17:04
                    google domain [url=https://google.com/]domain[/url] domain [http://www.example.com link title]
                    NSProject
                    NSProject04 червня 2022 р. 13:49
                    Всё ещё разбираюсь с кешем. В следствии прочтения данной статьи. Я принял для себя решение сделать кеширование свойств менеджера модели LikeDislike. И так как установка evileg_core для меня не была возможна, ибо он писался…
                    9
                    9Anonim25 жовтня 2024 р. 19:10
                    Машина тьюринга // Начальное состояние 0 0, ,<,1 // Переход в состояние 1 при пустом символе 0,0,>,0 // Остаемся в состоянии 0, двигаясь вправо при встрече 0 0,1,>…

                    Слідкуйте за нами в соціальних мережах