qt对excel的基本操作

这篇具有很好参考价值的文章主要介绍了qt对excel的基本操作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

qt对excel的基本操作

1.环境

1.1 配置方面

​ ① 确保Excel软件在本地服务器注册成功,没注册成功的可以通过 在运行中"E:\program Files\Microsoft Office\Office12\EXCEL.EXE" /regserver 手动注册,注意路径要用自己的excel路径。

​ ② 确保组件配制正确,运行命令:dcomcnfg,查看DCOM配置下是否有Microsoft Excel Application,有的话万事大吉,开始设置(1)常规,身份验证:无(2)安全、配制权限自定义,控制权限,完全控制选中,保存

2.指令

2.1 常用操作指令

连接Excel控件

QAxWidget excel(“Excel.Application”);

显示当前窗口:
excel.setProperty(“Visible”, true);

更改 Excel 标题栏:
excel.setProperty(“Caption”, “Invoke Microsoft Excel”);

不显示任何警告信息

setProperty(“DisplayAlerts”,0)

添加新工作簿:
QAxObject * workbooks = excel.querySubObject(“WorkBooks”);
workbooks->dynamicCall(“Add”);

打开已存在的工作簿:
workbooks->dynamicCall(“Open (const QString&)”, QString(“c:/test.xls”));

获取活动工作簿:
QAxObject * workbook = excel.querySubObject(“ActiveWorkBook”);

获取所有的工作表:
QAxObject * worksheets = workbook->querySubObject(“WorkSheets”);

获取工作表数量:
int intCount = worksheets->property(“Count”).toInt();

获取第一个工作表:
QAxObject * worksheet = workbook->querySubObject(“Worksheets(int)”, 1);

获取cell的值:
QAxObject * range = worksheet->querySubObject(“Cells(int,int)”, 1, 1 );

获取已使用区域

m_pworksheet->querySubObject(“UsedRange”)

获取行数

QAxObject *rows = usedrange->querySubObject(“Rows”);

int nRows = rows->property(“Count”).toInt();

获取列数

QAxObject *columns = usedrange->querySubObject(“Columns”);

int nCols = columns->property(“Count”).toInt();

2.2 设置单元格属性

QAxObject *pCell = work_sheet->querySubObject("Range(const QString&)", "A1:C1");
if (pCell)
{	    	        	
    //字体对齐(居中)
    pCell ->setProperty("HorizontalAlignment", -4108);//左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152
    pCell ->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107

    //设置字体
    QAxObject *font = pCell->querySubObject("Font");  //获取单元格字体
    font->setProperty("Bold", true);  //字体加粗
    font->setProperty("Name", QStringLiteral("华文彩云"));  //设置单元格字体
    font->setProperty("Bold", true);  //设置单元格字体加粗
    font->setProperty("Size", 20);  //设置单元格字体大小
    font->setProperty("Italic", true);  //设置单元格字体斜体
    font->setProperty("Underline", 2);  //设置单元格下划线
    font->setProperty("Color", QColor(255, 0, 0));  //设置单元格字体颜色(红色)

    //设置单元格背景色(灰色)
    QColor bkColor(125, 125, 125);
    QAxObject* interior = pCell->querySubObject("Interior");
    interior->setProperty("Color", bkColor);

    //绘制单元格边框(黑色)
    QAxObject* border = pCell->querySubObject("Borders");
    border->setProperty("Color", QColor(0, 0, 0)); 

    //创建组
    QAxObject* rows = pCell->querySubObject("Rows");
    rows->querySubObject("Group");
}

//宽度自适应
auto range = work_sheet->querySubObject("UsedRange");
QAxObject * cells = range->querySubObject("Columns");
if (cells)
{
    cells->dynamicCall("AutoFit");
}	


//设置单元格格式(文本)
QAxObject *oRange = work_sheet->querySubObject("Range(QString)", "A1:A99");
if (oRange)
{
    oRange->setProperty("NumberFormatLocal", "@");
}

oRange = work_sheet->querySBubObject("Range(QString)", "A1:B1");
if (oRange)
{
    pCell ->setProperty("WrapText", true); //内容过多,自动换行
    pCell ->setProperty("MergeCells", true); //合并单元格
    //pCell ->setProperty("MergeCells", false);  //拆分单元格
    //pcell->dynamicCall("ClearContents()");  //清空单元格内容
}


3.问题

3.1 Open失败

querySubObject(“Open(QString&)”,“path”)命令执行是出现如下异常信息

qt对excel的基本操作

报错:800706BE 远程过程调用失败

描述:改报错在dynamicCall(“SetVisible(bool)”, true)时不会报错

去掉下面pdf的勾选
qt对excel的基本操作

4.excel操作

4.1 初始化excel环境

连接COM组件,设置基本属性文章来源地址https://www.toymoban.com/news/detail-442566.html

int InitExcel()
{
#ifdef Q_OS_WIN

    CoInitialize(nullptr);
    m_pExcel = new QAxObject();

    bool b_ret = m_pExcel->setControl("Excel.Application");
    if (!b_ret)
    {
        b_ret = m_pExcel->setControl("ket.Application");
        if (!b_ret)
        {
            return -1;
        }
    }

    m_pExcel->dynamicCall("SetVisible(bool)", false);
    m_pExcel->setProperty("DisplayAlerts", false);
    m_pWorkBooks = m_pExcel->querySubObject("WorkBooks");
    if (!m_pWorkBooks)
    {
        CloseExcel();
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.2 打开Excel

int OpenExcel(const QString& path)
{
    int i_ret = 0;
#ifdef Q_OS_WIN
    i_ret = InitExcel();
    if (0 != i_ret)
    {
        return -1;
    }

    CloseWorkBook();

    QFile file(path);
    if (!file.exists())
    {
        CreateExcel(path);
    }
    else
    {
        m_pWorkBook = m_pWorkBooks->querySubObject("Open(QString&)", QDir::toNativeSeparators(path));
        if (!m_pWorkBook)
        {
            return -2;
        }
    }
    file.close();

    m_pWorkSheets = m_pWorkBook->querySubObject("Sheets");
    if (!m_pWorkSheets)
    {
        return -3;
    }

    m_pWorkSheet = m_pWorkSheets->querySubObject("Item(int)", 1);
    if (!m_pWorkSheet)
    {
        return -4;
    }

    m_sFileName = path;
    return 0;
#else
    return -1;
#endif
}

//关闭workbook
void CloseWorkBook()
{
#ifdef Q_OS_WIN
    if (m_pWorkBook)
    {
        QVariant ret = m_pWorkBook->dynamicCall("Close()");
    }
#endif
}

void CreateExcel(const QString &path)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkBooks);

    if (m_pWorkBooks)
    {
        m_pWorkBooks->dynamicCall("Add");
        m_pWorkBook = m_pExcel->querySubObject("ActiveWorkBook");
        SaveAsExcel(path);
    }
#endif
}

4.3 另存为

int SaveAsExcel(const QString& path)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkBook);
    try
    {
        if (m_pWorkBook)
        {
            QVariant ret = m_pWorkBook->dynamicCall("SaveAs(const QString &)", QDir::toNativeSeparators(path));
            if (ret.toBool())
            {
                return 0;
            }
        }
    }
    catch (...)
    {
        return -2;
    }
    return -1;
#else
    return -1;
#endif
}

4.4 关闭Excel

void CloseExcel()
{
    m_sFileName = "";

#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkBooks);
    Q_ASSERT(!m_pWorkBooks->isNull());

    if (m_pWorkBooks && !m_pWorkBooks->isNull())
    {
        QVariant ret = m_pWorkBooks->dynamicCall("Close()");
    }

    if (m_pExcel)
    {
        QVariant ret = m_pExcel->dynamicCall("Quit()");
    }
    
    RELEASE_POINTER(m_pWorkSheet);
    RELEASE_POINTER(m_pWorkSheets);
    RELEASE_POINTER(m_pWorkBook);
    RELEASE_POINTER(m_pWorkBooks);
    RELEASE_POINTER(m_pExcel);

    CoUninitialize();
#endif
}

4.5 宽度自适应

int ColumnAutoFit()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        try
        {
            QAxObject *rang = m_pWorkSheet->querySubObject("UsedRange");
            QAxObject *columns = rang->querySubObject("Columns");
            if (columns)
            {
                QVariant var = columns->dynamicCall("AutoFit");
                RELEASE_POINTER(columns);
            }
            RELEASE_POINTER(rang);
        }
        catch (...)
        {
            return -2;
        }

        return 0;
    }
    return -1;
#else
    return -1;
#endif
}

4.6 获取工作表数量

int GetWorkSheetCount()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheets);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (m_pWorkSheets && !m_pWorkSheet->isNull())
    {
        return m_pWorkSheets->property("Count").toInt();
    }
    return -1;
#else
    return -1;
#endif
}

4.7 读取所有数据

int ReadAll(QList<QList<QVariant>> &list)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheets);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (!m_pWorkSheet && m_pWorkSheet->isNull())
    {
        return -1;
    }

    list.clear();
    QAxObject* usedRange = m_pWorkSheet->querySubObject("UsedRange");
    //auto var = usedRange->dynamicCall("Value()");
    auto var = usedRange->property("Value2");
    auto rowList = var.toList();
    for (auto rowData : rowList)
    {
        auto subData = rowData.toList();
        QList<QVariant> subList;
        for (auto data : subData)
        {
            subList.push_back(data);
        }
        list.push_back(subList);
    }

    RELEASE_POINTER(usedRange);
    return 0;
#else
    return -1;
#endif
}

4.8 将List数据写入表格

int Write(const QList<QList<QVariant>> &data, bool overwrite)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheets);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (data.size() <= 0)
    {
        return -1;
    }

    if (!m_pWorkSheet && m_pWorkSheet->isNull())
    {
        return -2;
    }

    QVariantList variantList;
    for (size_t i = 0; i < data.size(); i++)
    {
        variantList.push_back(data.at(i));
    }

    QVariant variant = (QVariant)variantList;

    int i_row = data.size();
    int i_col = data.at(0).size();
    int i_row_start = 1;
    int i_row_count = 0;
    if (!overwrite)
    {
        i_row_count = GetRowCount();
        i_row_start = i_row_count + 1;
    }

    QString strRang;
    ConvertToColName(i_col, strRang);
    strRang += QString::number(i_row + i_row_count);
    strRang = QString("A%1:").arg(i_row_start) + strRang;

    try
    {
        QAxObject *range = m_pWorkSheet->querySubObject("Range(const QString&)", strRang);
        range->setProperty("Value2", variant);
        range->setProperty("WrapText", true); //内容过多自动换行
        range->setProperty("NumberFormatLocal", "@"); //设置单元格格式(文本)
        range->setProperty("HorizontalAlignment", -4108);//左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152
        range->setProperty("VerticalAlignment", -4108); //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107

        QAxObject *border = range->querySubObject("Borders");
        border->setProperty("Color", QColor(0, 0, 0)); //设置边框颜色

        RELEASE_POINTER(border);
        RELEASE_POINTER(range);
    }
    catch (...)
    {
        return -3;
    }
    return 0;
#else
    return -1;
#endif
}

//
QString ConvertToLetters(int data)
{
    QChar ch = data + 0x40; //A对应0x41
    return QString(ch);
}

void ConvertToColName(int data, QString &res)
{
#ifdef Q_OS_WIN
    Q_ASSERT(data > 0 && data < 65535);
    int tempData = data / 26;
    if (tempData > 0)
    {
        int mode = data % 26;
        ConvertToColName(mode, res);
        ConvertToColName(tempData, res);
    }
    else
    {
        res = ConvertToLetters(data) + res;
    }
#endif
}

4.9 获取某个单元格的数据

int GetCellValue(const int row, const int column, QVariant &value)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (!m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        return -1;
    }

    try
    {
        QAxObject *range = m_pWorkSheet->querySubObject("Cells(int,int)", row, column);
        auto var = range->property("Value2");
        value = var;
        RELEASE_POINTER(range);
    }
    catch (...)
    {
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.10 设置某个单元格的数据

int SetCellValue(const int row, const int column, const QVariant &value)
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);
    Q_ASSERT(!m_pWorkSheet->isNull());

    if (!m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        return -1;
    }

    try
    {
        QAxObject *range = m_pWorkSheet->querySubObject("Cells(int,int)", row, column);
        bool ret = range->setProperty("Value2", value);
        RELEASE_POINTER(range);
    }
    catch (...)
    {
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.11 设置当前操作worksheet序号


int SetWorkSheetNum(const int num)
{
#ifdef Q_OS_WIN

    Q_ASSERT(m_pWorkBook);
    Q_ASSERT(!m_pWorkBook->isNull());

    if (!m_pWorkBook && !m_pWorkBook->isNull())
    {
        return -1;
    }

    if (m_pWorkSheet)
    {    
        RELEASE_POINTER(m_pWorkSheet);
    }

    try
    {
        m_pWorkSheet = m_pWorkBook->querySubObject("Worksheets(int)", num);
    }
    catch (...)
    {
        return -2;
    }
    return 0;
#else
    return -1;
#endif
}

4.12 获取总列数

int GetColumnCount()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);

    if (m_pWorkSheet && !m_pWorkSheet->isNull())
    {
        int nCols = 0;
        try
        {
            QAxObject *usedRange = m_pWorkSheet->querySubObject("UsedRange");
            QAxObject *columns = usedRange->querySubObject("Columns");

            nCols = columns->property("Count").toInt();
            RELEASE_POINTER(columns);
            RELEASE_POINTER(usedRange);
        }
        catch (...)
        {
            return -2;
        }
        return nCols;
    }
    return -1;
#else
    return -1;
#endif
}

4.13 获取总行数

int GetRowCount()
{
#ifdef Q_OS_WIN
    Q_ASSERT(m_pWorkSheet);

    if (m_pWorkSheet)
    {
        int nRows = 0;
        try
        {
            QAxObject *usedRange = m_pWorkSheet->querySubObject("UsedRange");
            if (usedRange)
            {
                QAxObject *rows = usedRange->querySubObject("Rows");
                if (rows)
                {
                    nRows = rows->property("Count").toInt();
                    RELEASE_POINTER(rows);
                }      
                RELEASE_POINTER(usedRange);
            }

        }
        catch (...)
        {
            return -2;
        }
        return nRows;
    }
    return -1;
#else
    return -1;
#endif
}

到了这里,关于qt对excel的基本操作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • POI:对Excel的基本写操作 整理1

    POI:对Excel的基本写操作 整理1

    首先导入相关依赖  (1)当向03版本的Excel中写入数据 (2)当向07版本的Excel中写入数据 (1)当向03版本的Excel中写入 大量数据 缺点: 最多只能处理65536行,否则会抛出异常; 优点:过程中写入缓存,不操作磁盘,最后一次性写入磁盘,速度快。 1.129s  还是非常快的 只能写

    2024年02月01日
    浏览(7)
  • Qt-OpenCV学习笔记--基本函数操作--cv::convertTo(图像类型转换)

    Qt-OpenCV学习笔记--基本函数操作--cv::convertTo(图像类型转换)

    不是所有格式的Mat型数据都能被使用。 目前OpenCV主要只支持单通道和3通道的图像,并且此时要求其深度为8bit和16bit无符号(即CV_16U),所以其他一些数据类型是不支持的,比如说float型等。 如果Mat类型数据的深度和通道数不满足上面的要求,则需要使用convertTo()函数和cvtColor(

    2024年02月04日
    浏览(45)
  • Linux:环境搭建、基本指令操作、Vim 编辑器的使用

    Linux:环境搭建、基本指令操作、Vim 编辑器的使用

    Linux 是一套 免费使用 和 自由传播 的类 Unix 操作系统,是一个基于 POSIX(可移植操作系统接口)和 UNIX 的 多用户 、 多任务 、 支持多线程 和 多 CPU 的操作系统; Linux 是一个操作系统, 操作系统本身也是一个软件 ; Linux 能运行主要的 UNIX 工具软件、应用程序和网络协议,

    2024年01月25日
    浏览(15)
  • Jenkins的下载、配置、安装和基本操作

    Jenkins的下载、配置、安装和基本操作

    下载路径(镜像):http://mirrors.jenkins-ci.org/ 下载路径(官方):https://jenkins.io/download/ 可选择下载.msi文件(下载后点击进行安装)或者.war压缩包(直接放在对应文件夹下) 安装前,首先得下载安装JDK,配置Java环境(另外下载安装配置,见其他文章Java(JDK)下载安装及配置

    2024年02月09日
    浏览(14)
  • 【详细】Jmeter的安装配置与基本操作

    【详细】Jmeter的安装配置与基本操作

    1、Jmeter环境搭建 安装JDK:https://www.oracle.com/cn/java/technologies/downloads/ 安装Jmeter:https://jmeter.apache.org/download_jmeter.cgi 注意:下载JDK,注意电脑操作系统及位数;Jmeter版本要与JDK版本匹配;Jmeter安装路径不能有中文或空格 2、Jmeter基本配置 (1)Jmeter界面汉化 永久性:修改bin目录下

    2024年02月03日
    浏览(14)
  • IDEA配置Git以及对Git的基本操作

    学生作者:吃饱饱坏蜀黍 日期:2023.6.19 IDEA版本:IntelliJ IDEA 2023.1.2 (Ultimate Edition) GIt版本:2.41.0 IDEA中使用了新UI以及中文插件:Chinese(Simplified) Language Pack/ 中文语言包 Git基本使用篇:https://blog.csdn.net/a1978341673/article/details/131318911 ​ 在IDEA中使用Git,本质上还是使用的本地安装

    2024年02月13日
    浏览(14)
  • Android Studio 安装配置详细步骤,以及使用的基本操作

    Android Studio 安装配置详细步骤,以及使用的基本操作

    一.Android SDK下载和安装     如果本地已有合适版本Android SDK,则无需再下载,或者可以使用SDK Manager更新SDK;      如果没有SKD,则需要下载了,其实在安装Android Studio过程中会选择下载最新SDK安装,但是速度极慢,我习惯先把SDK下载下来,在安装完Android Studio后再配置(当

    2023年04月18日
    浏览(13)
  • 【SpringCloud篇】Eureka服务的基本配置和操作

    【SpringCloud篇】Eureka服务的基本配置和操作

    Eureka是Netflix开源的一个基于REST的服务治理框架,主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成, 其中Eureka服务器负责维护整个系统的服务实例信息,而Eureka客户端则负责向Eureka服务器注册自身信息,并从Eureka服务器获取其他服务实例的信

    2024年02月05日
    浏览(11)
  • ZooKeeper 分布式协调服务: 概述及原理, 安装配置, 基本操作

    作者:禅与计算机程序设计艺术 Apache Zookeeper 是 Apache Hadoop 的子项目之一,是一个开源的分布式协调服务。它负责存储和维护关于网络中各个节点的数据。Zookeeper 提供了以下功能:配置维护、域名服务、同步和共享、软/硬件负载均衡、集群管理、Master 选举等。它的架构使得

    2024年02月08日
    浏览(10)
  • anaconda 安装、配置、开机启动和基本操作 (windows+linux 详细)

    anaconda 安装、配置、开机启动和基本操作 (windows+linux 详细)

    包括notebook的开机启动,启动脚本、配置等,2023年12月4日更新教程 anaconda是conda中的一种,也可以选用其它的conda anaconda会把python、pip等直接安装上,不用额外装配了,省心 conda对于需要多个python环境的开发者非常方便 演示版本2023.09 安装方法对于其它版本基本一致 官网: an

    2024年02月02日
    浏览(11)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包