Qt ActiveX QAxObject форматировать комментарий к ячейке Excel

Я хотел бы отформатировать комментарий к ячейке Microsoft Excel 2010 (например, изменить шрифт, жирный шрифт,..), используя Qt 5.

Я могу добавить комментарий к ячейке, используя следующий код:

QAxObject* cellRange = m_activeWorksheet->querySubObject("Cells(int, int)", row, col);
cellRange->dynamicCall("AddComment(const QVariant&)", comment);

Я также могу установить свойство AutoSize для комментария к ячейке:

QAxObject* axComment = cellRange->querySubObject("Comment");
QAxObject* shape = axComment->querySubObject("Shape");
shape->querySubObject("TextFrame")->setProperty("AutoSize", autosize);

Но я не могу изменить "более глубокие" свойства комментариев, например TextFrame.Characters.Font.Bold.

После установки комментария к ячейке команда

shape->querySubObject("TextFrame") 

возвращает ненулевой указатель, но

shape->querySubObject("TextFrame")->querySubObject("Characters")

возвращает NULL.

Как мне отформатировать комментарии к ячейкам, используя QAxObject? Есть ли описание свойств / подобъектов для разных QAxObjectдоступны QAxObject?

Следующий код не имеет никакого эффекта:

shape->setProperty("AutoShapeType", 5);

2 ответа

Решение
  1. Вероятно, проблема в том, что TextFrame не имеет свойства Characters, Вместо этого есть метод Characters, но это полная подпись

    Characters(Start, Length)
    

    Qt docs говорит, что вы должны указать полную подпись, поэтому вам, вероятно, следует запросить значение с

    shape->querySubObject("TextFrame")->querySubObject("Characters(Start,Length)")
    
  2. Вы не можете установить AutoShapeType в 5, AutoShapeType имеет тип MsoAutoShapeType, допускаются только указанные значения.

После просмотра документов Qt раздел QAxBase dynamicCAll показал, как установить форму комментария к ячейке Excel с помощью динамического вызова:

QString comment("My comment");
QAxObject* cellRange = m_activeWorksheet->querySubObject("Cells(int, int)", cellRow, cellColumn);
cellRange->dynamicCall("AddComment(const QVariant&)", comment);
QAxObject* axComment = cellRange->querySubObject("Comment");
QAxObject* shape = axComment->querySubObject("Shape");
shape->dynamicCall("AutoShapeType", 5);

Значение можно найти по ссылке Lol4t0: перечисление MsoAutoShapeType. Здесь 5 используется для получения прямоугольника с закругленными углами (msoShapeRoundedRectangle). Вот оставшийся код для изменения формата текстового комментария:

QAxObject* textFrame = shape->querySubObject("TextFrame");
QAxObject* chars = textFrame->querySubObject("Characters(int, int)", 1, comment.size());
QAxObject* font = chars->querySubObject("Font");
font->setProperty("Bold", false);
shape->querySubObject("TextFrame")->querySubObject("Characters(2, 3)")->querySubObject("Font")->setProperty("Size", 24);
Другие вопросы по тегам