Qt ActiveX QAxObject 格式 Excel 单元格注释

Posted

技术标签:

【中文标题】Qt ActiveX QAxObject 格式 Excel 单元格注释【英文标题】:Qt ActiveX QAxObject format Excel cell comment 【发布时间】:2014-10-13 13:49:22 【问题描述】:

我想格式化 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 格式化单元格 cmets? 是否有不同QAxObjects 的属性/子对象的描述 QAxObject 可以访问吗?

以下代码没有任何作用:

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

【问题讨论】:

您是否尝试过 dumpObjectTree() 和 dumpObjectInfo() 以获取更多信息? 嗨 Siliconmancer,还没有,但我会试一试。 Lol4t0 对 Characters 问题的解决方案有效:我使用 querySubObject("Characters(int, int)", 1, commentString.size()) 【参考方案1】:

    问题可能是TextFrame 没有属性 Characters。相反,它有方法 Characters,但是it full signature is

    Characters(Start, Length)
    

    Qt docs says 你应该指定完整的签名,所以你应该用

    查询值
    shape->querySubObject("TextFrame")->querySubObject("Characters(Start,Length)")
    

    您不能将AutoShapeType 设置为5AutoShapeType 是 MsoAutoShapeType 类型,并且只允许指定值。

【讨论】:

根据msdn.microsoft.com/en-us/library/office/…, msoShapeRoundedRectangle 的值应该是 5(圆角矩形),因此我不明白为什么 shape->setProperty("AutoShapeType", 5);不应该工作。能否给出一个完整的代码示例,如何将形状设置为圆角矩形。 好吧,看起来很奇怪,但是你有没有尝试过shape->setProperty("AutoShapeType", "msoShapeSnipRoundRectangle");,就像docs 的例子一样。否则看起来shape->setProperty("AutoShapeType", "5");(带qoutes)也应该工作。如果是的话,我会写一个解释。 即使有引号,形状也不会改变。【参考方案2】:

浏览 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 Enumeration。这里 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);

【讨论】:

以上是关于Qt ActiveX QAxObject 格式 Excel 单元格注释的主要内容,如果未能解决你的问题,请参考以下文章

Qt QAxObject操作excel文件过程总结(转):

Qt QWebEngine - 使用 HTML <a> 锚点

Qt笔记-利用QAxObject将文件夹内的所有docx转pdf

Qt笔记-利用QAxObject将文件夹内的所有docx转pdf

Qt笔记-利用QAxObject将文件夹内的所有docx转pdf

QT操作Excel(通过QAxObject使用了OLE,前提是本地安装了Excel)