读写excel文档入门讲解一

最近工作中需要将数据以各种格式存放到excel文档中,工程是基于C++,并且采用QT设计的界面,因此,通过网络搜索寻找到基于QT来读写excel文档的开源库QXlsx,本文将介绍开源库QXlsx的简单使用和效果,一方面提供入门知识,另一方面也给自己的学习成果做一个总结记录,方便后续查找复习。

一、简单的例子

1、 网上下载QXlsx开源库后,需要将QXlsx加载到Qt Creator工具,直接参考开源库代码中的HowToSetProject.md文件即可

2、展示写入数据,并且生成excel文档的例子


// 头文件

#include "xlsxdocument.h"

#include "xlsxformat.h"

#include "xlsxworkbook.h"

QXlsx::Document xlsx;

// 通过单元格名写入字符串

xlsx.write("A1", "Hello!");

// 通过行列方式写入字符串

xlsx.write(2, 1, "Everyone!");

std::string str_file_name = JPathHandler::GetDebugPath() + "excel_hello.xlsx";

// 生成excel文档

xlsx.saveAs(QString::fromStdString(str_file_name));

3、最后生成的excel文档的内容如下图所示

image

二、自动换行

有时候写入单元格的内容比较长,超过了单元格的展示范围,而我们又不想扩大单元格的宽度,怎么办呢,可以通过设置自动换行的方式,让写入单元格的内容自动适配当前的单元格。

1、携带配置好的格式写入到单元格


QXlsx::Document xlsx2;

// 初始化格式

QXlsx::Format format2;

format2.setFontSize(10);

format2.setHorizontalAlignment(QXlsx::Format::AlignHDistributed);

// 用上面的格式来初始化下面的单元格

xlsx2.write("A1", "onetwothree,onetwothree,onetwothree", format2);

// 最后生成excel文档(注意JPathHandler::GetDebugPath()自定义的类,用于获取路径,不是开源库的接口)

std::string str_file_name2 = JPathHandler::GetDebugPath() + "excel_align.xlsx";

xlsx2.saveAs(QString::fromStdString(str_file_name2));

2、最后生成的excel文档的内容效果如下图所示

image

三、多个表单

当需要多个表单来保存不同的数据的时候,这就涉及到创建多个表单的问题。那么将用创建两个表单的例子来作为简单的入门知识点。

1、生成两个表单,并且分别往表单中写入数据


QXlsx::Document xlsx3;

// 第一个表单

xlsx3.addSheet("first year");

xlsx3.write("A1", "first");

// 第二个表单

xlsx3.addSheet("second year");

xlsx3.write("A1", "second");

// 最后生成excel文档

std::string str_file_name3 = JPathHandler::GetDebugPath() + "excel_addsheet.xlsx";

xlsx3.saveAs(QString::fromStdString(str_file_name3));

2、最后生成的excel文档的内容效果如下图所示

image
image

四、读取excel文档

写入数据到excel文档之后,肯定有需求场景需要读取excel文档数据来展示,所以,接下来将说明读取excel文档的所有数据的方法。

1、先读取excel文档,然后获取每一个表单,读取每一个表单中的单元格内容


// 读取上一个步骤中生成的excel文档

QXlsx::Document xlsx4( QString::fromStdString(str_file_name3) );

int i_index_sheet = 0;

// 循环读取excel中的每一个表单,最后打印输出每个单元格的内容

foreach( QString current_sheetname, xlsx4.sheetNames() )

{

    QXlsx::AbstractSheet* p_current_sheet = xlsx4.sheet( current_sheetname );

    p_current_sheet->workbook()->setActiveSheet(i_index_sheet);

    QXlsx::Worksheet* wsheet = (QXlsx::Worksheet*) p_current_sheet->workbook()->activeSheet();

    int i_max_row = -1;

    int i_max_col = -1;

    QVector<QXlsx::CellLocation> clList = wsheet->getFullCells( &i_max_row, &i_max_col );

    for ( int i_cellindex = 0; i_cellindex < clList.size(); ++i_cellindex )

    {

        QXlsx::CellLocation cell_location = clList.at(i_cellindex);

        QVariant var = cell_location.cell.data()->value();

        QString str = var.toString();

        LOG(INFO)<< std::string( str.toLocal8Bit() );

    }

    i_index_sheet++;

}

2、最后输出的打印信息如下所示


[2019-10-20 21:09:48,039626] [bool JQtAttr::TestXlsx():135] first

[2019-10-20 21:09:48,039675] [bool JQtAttr::TestXlsx():135] second

五、总结

从上面的例子中,可以看出QXlsx::Document是控制整个excel文档的类,它可以控制表单的宽高,控制表单等功能,而QXlsx::Format则是控制单元格格式的类,它可以设置字体、字体大小,对齐方式等。

参考链接:

Handling Microsoft Excel file format

QXlsx

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转自链接 目录 1.认识NPOI 2.使用NPOI生成xls文件 2.1创建基本内容 2.1.1创建Workboo...
    腿毛裤阅读 10,720评论 1 3
  • ORA-00001: 违反唯一约束条件 (.) 错误说明:当在唯一索引所对应的列上键入重复值时,会触发此异常。 O...
    我想起个好名字阅读 5,453评论 0 9
  • # Python 资源大全中文版 我想很多程序员应该记得 GitHub 上有一个 Awesome - XXX 系列...
    小迈克阅读 3,063评论 1 3
  • 韩元旭、余橙、沈开洋 Qt介绍 Qt是一个跨平台的C++图形用户界面应用程序框架。它早在1991年奇趣科技公司两位...
    开洋_shen阅读 16,236评论 4 24
  • 1. 我是一个特别不喜欢客套和问候的人,身边总有家人朋友恨铁不成钢的对我说:你可以再放聪明点,多去主动跟别人联系,...
    文长长阅读 3,455评论 22 65