ZBLOG

要读取doc文件内容,包括文字、图片和表格并且显示在qt上

,可以使用Qt的QAxObject类来实现。具体步骤如下:

  1. 在Qt项目中添加Microsoft Word类型库。在Qt Creator菜单栏中选择“Tools”->“Options”->“Build & Run”,在左侧列表中选择“Kits”,然后在右侧的“Desktop Qt XX MSVC20XX 64bit”或者其他编译器选项卡上点击“Add…”按钮,在弹出的对话框中选择“Microsoft Word XX.X Object Library”并点击确定。

  2. 使用QAxObject类创建一个Word应用程序对象,并打开需要读取内容的doc文件。

QAxObject *word = new QAxObject("Word.Application");
word->setProperty("Visible", false);
QAxObject *documents = word->querySubObject("Documents");
QAxObject *document = documents->querySubObject("Open(const QString&)", "path/to/document.doc");
  1. 遍历文档内容,读取文字和图片。使用QTextCursor类读取文本内容,并使用QPicture类读取图片内容。
//遍历文档段落
QAxObject *paragraphs = document->querySubObject("Paragraphs");
int count_paragraphs = paragraphs->property("Count").toInt();
for (int i = 1; i <= count_paragraphs; ++i) {
    QAxObject *paragraph = paragraphs->querySubObject("Item(int)", i);

    //读取段落文本
    QTextCursor cursor(ui->textEdit->document());
    cursor.movePosition(QTextCursor::End);
    cursor.insertText(paragraph->dynamicCall("Range.Text").toString());

    //遍历段落中的图片
    QAxObject *inlineShapes = paragraph->querySubObject("InlineShapes");
    int count_shapes = inlineShapes->property("Count").toInt();
    for (int j = 1; j <= count_shapes; ++j) {
        QAxObject *inlineShape = inlineShapes->querySubObject("Item(int)", j);
        QString shapeType = inlineShape->dynamicCall("Type").toString();

        //读取图片
        if (shapeType == "wdInlineShapePicture") {
            QPicture picture;
            picture.setData(inlineShape->dynamicCall("Range.EnhMetaFileBits").toByteArray());
            ui->graphicsView->scene()->addPixmap(QPixmap::fromPicture(picture));
        }
    }
}
  1. 遍历文档表格,读取表格内容。使用QTableWidget类创建一个表格,并读取表格单元格内容。
//遍历文档表格
QAxObject *tables = document->querySubObject("Tables");
int count_tables = tables->property("Count").toInt();
for (int i = 1; i <= count_tables; ++i) {
    QAxObject *table = tables->querySubObject("Item(int)", i);

    //创建Qt表格
    int row_count = table->querySubObject("Rows")->property("Count").toInt();
    int column_count = table->querySubObject("Columns")->property("Count").toInt();
    ui->tableWidget->setRowCount(row_count);
    ui->tableWidget->setColumnCount(column_count);

    //读取表格单元格内容
    for (int r = 1; r <= row_count; ++r) {
        for (int c = 1; c <= column_count; ++c) {
            QAxObject *cell = table->querySubObject("Cell(int,int)", r, c);
            QString cell_text = cell->dynamicCall("Range.Text").toString();
            ui->tableWidget->setItem(r-1, c-1, new QTableWidgetItem(cell_text));
        }
    }
}
  1. 关闭Word应用程序对象。
word->dynamicCall("Quit()");
delete word;

完整代码示例:https://github.com/QTwebsocket/Qt-Examples/blob/master/OfficeAutomation/ReadWordDocument/mainwindow.cpp

本站部分文章来源于网络,版权归原作者所有,如有侵权请联系站长删除。
转载请注明出处:https://golang.0voice.com/?id=6705

分享:
扫描分享到社交APP
上一篇
下一篇
发表列表
游客 游客
此处应有掌声~
评论列表

还没有评论,快来说点什么吧~

联系我们

在线咨询: 点击这里给我发消息

微信号:3007537140

上班时间: 10:30-22:30

关注我们
x

注册

已经有帐号?