zoukankan      html  css  js  c++  java
  • 在vs2015上面用qt对excel进行操作

    1、首先给Qt添加axcontainer模块,添加步骤如下:

     

    2、添加头文件

    #include<QAxObject>

    3、对EXCEL的操作,下面代码来源于

    https://blog.csdn.net/A18373279153/article/details/78557209

    bool adminFinancial::exportToExcel()
    {
        QString filepath=QFileDialog::getSaveFileName(this,tr("Save orbit"),".",tr("Microsoft Office 2007 (*.xlsx)"));//获取保存路径
            if(!filepath.isEmpty()){
                QAxObject *excel = new QAxObject(this);
                excel->setControl("Excel.Application");//连接Excel控件
                excel->dynamicCall("SetVisible (bool Visible)","false");//不显示窗体
                excel->setProperty("DisplayAlerts", false);//不显示任何警告信息。如果为true那么在关闭是会出现类似“文件已修改,是否保存”的提示
     
                QAxObject *workbooks = excel->querySubObject("WorkBooks");//获取工作簿集合
                workbooks->dynamicCall("Add");//新建一个工作簿
                QAxObject *workbook = excel->querySubObject("ActiveWorkBook");//获取当前工作簿
                QAxObject *worksheets = workbook->querySubObject("Sheets");//获取工作表集合
                QAxObject *worksheet = worksheets->querySubObject("Item(int)",1);//获取工作表集合的工作表1,即sheet1
     
                QAxObject *cellA,*cellB,*cellC,*cellD;
     
                //设置标题
                int cellrow=1;
                QString A="A"+QString::number(cellrow);//设置要操作的单元格,如A1
                QString B="B"+QString::number(cellrow);
                QString C="C"+QString::number(cellrow);
                QString D="D"+QString::number(cellrow);
                cellA = worksheet->querySubObject("Range(QVariant, QVariant)",A);//获取单元格
                cellB = worksheet->querySubObject("Range(QVariant, QVariant)",B);
                cellC=worksheet->querySubObject("Range(QVariant, QVariant)",C);
                cellD=worksheet->querySubObject("Range(QVariant, QVariant)",D);
                cellA->dynamicCall("SetValue(const QVariant&)",QVariant("流水号"));//设置单元格的值
                cellB->dynamicCall("SetValue(const QVariant&)",QVariant("用户名"));
                cellC->dynamicCall("SetValue(const QVariant&)",QVariant("金额"));
                cellD->dynamicCall("SetValue(const QVariant&)",QVariant("日期"));
                cellrow++;
     
                int rows=this->model->rowCount();
                for(int i=0;i<rows;i++){
                    QString A="A"+QString::number(cellrow);//设置要操作的单元格,如A1
                    QString B="B"+QString::number(cellrow);
                    QString C="C"+QString::number(cellrow);
                    QString D="D"+QString::number(cellrow);
                    cellA = worksheet->querySubObject("Range(QVariant, QVariant)",A);//获取单元格
                    cellB = worksheet->querySubObject("Range(QVariant, QVariant)",B);
                    cellC=worksheet->querySubObject("Range(QVariant, QVariant)",C);
                    cellD=worksheet->querySubObject("Range(QVariant, QVariant)",D);
                    cellA->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,0)->data(Qt::DisplayRole).toString()));//设置单元格的值
                    cellB->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,1)->data(Qt::DisplayRole).toString()));
                    cellC->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,2)->data(Qt::DisplayRole).toString()));
                    cellD->dynamicCall("SetValue(const QVariant&)",QVariant(this->model->item(i,3)->data(Qt::DisplayRole).toString
                    cellrow++;
                }
     
                workbook->dynamicCall("SaveAs(const QString&)",QDir::toNativeSeparators(filepath));//保存至filepath,注意一定要用QDir::toNativeSeparators将路径中的"/"转换为"",不然一定保存不了。
                workbook->dynamicCall("Close()");//关闭工作簿
                excel->dynamicCall("Quit()");//关闭excel
                delete excel;
                excel=NULL;
            }
            return true;
    }

    4、QAxObject的一些常用函数,函数整理来源于:

    https://blog.csdn.net/houxiaoliwang/article/details/104559919

    <1>读取内容:

    • 标题
    • 工作表数目
    • 工作表名称
    • 起始行
    • 起始列
    • 行数
    • 列数
    • 单元格内容
    QAxObject excel("Excel.Application");
    excel.setProperty("Visible", true);
    QAxObject *work_books = excel.querySubObject("WorkBooks");
    work_books->dynamicCall("Open (const QString&)", QString("E:/test.xlsx"));
    QVariant title_value = excel.property("Caption");  //获取标题
    qDebug()<<QString("excel title : ")<<title_value;
    QAxObject *work_book = excel.querySubObject("ActiveWorkBook");
    QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheets
    
    int sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目
    qDebug()<<QString("sheet count : ")<<sheet_count;
    for(int i=1; i<=sheet_count; i++)
    {
        QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", i);  //Sheets(int)也可换用Worksheets(int)
        QString work_sheet_name = work_sheet->property("Name").toString();  //获取工作表名称
        QString message = QString("sheet ")+QString::number(i, 10)+ QString(" name");
        qDebug()<<message<<work_sheet_name;
    }
    if(sheet_count > 0)
    {
        QAxObject *work_sheet = work_book->querySubObject("Sheets(int)", 1);
        QAxObject *used_range = work_sheet->querySubObject("UsedRange");
        QAxObject *rows = used_range->querySubObject("Rows");
        QAxObject *columns = used_range->querySubObject("Columns");
        int row_start = used_range->property("Row").toInt();  //获取起始行
        int column_start = used_range->property("Column").toInt();  //获取起始列
        int row_count = rows->property("Count").toInt();  //获取行数
        int column_count = columns->property("Count").toInt();  //获取列数
        for(int i=row_start; i
    {
        for(int j=column_start; j
        {
            QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", i, j);
                QVariant cell_value = cell->property("Value");  //获取单元格内容
                QString message = QString("row-")+QString::number(i, 10)+QString("-column-")+QString::number(j, 10)+QString(":");
                qDebug()<<message<<cell_value;
            }
        }
    }

    <2>Excel增、删、改

    • 设置标题
    • 插入工作表(至最后一行)
    • 设置工作表名称
    • 删除工作表
    • 设置单元格内容
    • 设置单元格字体(类型、大小、加粗、斜体、下划线、颜色等)
    • 设置单元格对齐方式
    • 设置单元格高度、宽度
    • 设置单元格背景色、边框色
    • 合并/拆分单元格
    • 清空单元格
    QAxObject excel("Excel.Application");  
    excel.setProperty("Visible", true);  
    QAxObject *work_books = excel.querySubObject("WorkBooks");  
    work_books->dynamicCall("Open(const QString&)", "E:\test.xlsx");
    excel.setProperty("Caption", "Qt Excel");
    QAxObject *work_book = excel.querySubObject("ActiveWorkBook");  
    QAxObject *work_sheets = work_book->querySubObject("Sheets");  //Sheets也可换用WorkSheets
     
    //删除工作表(删除第一个)
    QAxObject *first_sheet = work_sheets->querySubObject("Item(int)", 1);
    first_sheet->dynamicCall("delete");
     
    //插入工作表(插入至最后一行)
    int sheet_count = work_sheets->property("Count").toInt();  //获取工作表数目
    QAxObject *last_sheet = work_sheets->querySubObject("Item(int)", sheet_count);
    QAxObject *work_sheet = work_sheets->querySubObject("Add(QVariant)", last_sheet->asVariant());
    last_sheet->dynamicCall("Move(QVariant)", work_sheet->asVariant());
     
    work_sheet->setProperty("Name", "Qt Sheet");  //设置工作表名称
     
    //操作单元格(第2行第2列)
    QAxObject *cell = work_sheet->querySubObject("Cells(int,int)", 2, 2);
    cell->setProperty("Value", "Java C++ C# PHP Perl Python Delphi Ruby");  //设置单元格值
    cell->setProperty("RowHeight", 50);  //设置单元格行高
    cell->setProperty("ColumnWidth", 30);  //设置单元格列宽
    cell->setProperty("HorizontalAlignment", -4108); //左对齐(xlLeft):-4131  居中(xlCenter):-4108  右对齐(xlRight):-4152
    cell->setProperty("VerticalAlignment", -4108);  //上对齐(xlTop)-4160 居中(xlCenter):-4108  下对齐(xlBottom):-4107
    cell->setProperty("WrapText", true);  //内容过多,自动换行
    //cell->dynamicCall("ClearContents()");  //清空单元格内容
     
    QAxObject* interior = cell->querySubObject("Interior");
    interior->setProperty("Color", QColor(0, 255, 0));   //设置单元格背景色(绿色)
     
    QAxObject* border = cell->querySubObject("Borders"); 
    border->setProperty("Color", QColor(0, 0, 255));   //设置单元格边框色(蓝色)
     
    QAxObject *font = cell->querySubObject("Font");  //获取单元格字体
    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));  //设置单元格字体颜色(红色)
     
    //设置单元格内容,并合并单元格(第5行第3列-第8行第5列)
    QAxObject *cell_5_6 = work_sheet->querySubObject("Cells(int,int)", 5, 3);
    cell_5_6->setProperty("Value", "Java");  //设置单元格值
    QAxObject *cell_8_5 = work_sheet->querySubObject("Cells(int,int)", 8, 5);
    cell_8_5->setProperty("Value", "C++");
     
    QString merge_cell;
    merge_cell.append(QChar(3 - 1 + 'A'));  //初始列
    merge_cell.append(QString::number(5));  //初始行
    merge_cell.append(":");
    merge_cell.append(QChar(5 - 1 + 'A'));  //终止列
    merge_cell.append(QString::number(8));  //终止行
    QAxObject *merge_range = work_sheet->querySubObject("Range(const QString&)", merge_cell);
    merge_range->setProperty("HorizontalAlignment", -4108);
    merge_range->setProperty("VerticalAlignment", -4108);
    merge_range->setProperty("WrapText", true);
    merge_range->setProperty("MergeCells", true);  //合并单元格
    //merge_range->setProperty("MergeCells", false);  //拆分单元格
     
    //work_book->dynamicCall("Save()");  //保存文件(为了对比test与下面的test2文件,这里不做保存操作) work_book->dynamicCall("SaveAs(const QString&)", "E:\test2.xlsx");  //另存为另一个文件 
    work_book->dynamicCall("Close(Boolean)", false);  //关闭文件
    excel.dynamicCall("Quit(void)");  //退出
    说明:在打开excel文件时需要使用绝对路径,使用相对路径会报错
               可用实例:"D:/qtProject/QtOpExcel/test.xlsx"
               在另存为时,注意在路径中不能使用/,而要使用\
               可用实例:"D:\qtProject\QtOpExcel\test2.xlsx"
  • 相关阅读:
    SpringBoot 集成Log4j、集成AOP
    SpringBoot 集成JUnit
    SpringBoot yml文件语法
    SpringBoot 集成MyBatis、事务管理
    SpringBoot 集成Spring JDBC
    模板引擎简介
    SpringBoot 解决“不支持发行版本xx”的问题
    SpringBoot 全局异常处理
    SpringBoot 静态资源的配置
    SpringBoot的起步依赖
  • 原文地址:https://www.cnblogs.com/kongbursi-2292702937/p/15035836.html
Copyright © 2011-2022 走看看