一、背景

当前b/s模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用excel打开(电信系统、银行系统)。或者是:我们已经习惯用excel打印。这样在我们实际的开发中,很多时候需要实现导入、导出excel的应用。

最近在java上做了一个excel的导出功能,写了一个通用类,在这里分享分享,该类支持多sheet,且无需手动进行复杂的类型转换,只需提供三个参数即可:

1、filename

excel文件名

2、hasmap> data

具体的数据,每个list代表一张表的数据,?表示可为任意的自定义对象

3、linkedhashmap headers

stirng代表sheet名。每个string[][]代表一个sheet的定义,举个例子如下:

string[][] header = {

{"field1","参数1"}

,{"field2","参数2"}

,{"field3","参数3"}

}

其中的field1,field2,field3为对象中的属性名,参数1,参数2,参数3为列名,实际上这个指定了列的名称和这个列用到数据对象的哪个属性。

二、怎么用

以一个例子来说明怎么用,假设有两个类a和b定义如下:

public class a{

private string name;

private string address;

}

public class b{

private int id;

private double sum;

private string cat;

}

现在我们通过查询数据库获得了a和b的两个列表:

list dataa = .....;

list datab = .....;

我们将这两个导出到excel中,首先需要定义sheet:

string[][] sheeta = {

{"name","姓名"}

,{"address","住址"}

}

string[][] sheetb = {

{"id","id"}

,{"sum","余额"}

,{"cat","猫的名字"}

}

然后将数据汇总构造一个excelutil:

string filename = "测试excel";

hashmap> data = new hashmap<>();

//asheet为表名,后面headers里的key要跟这里一致

data.put("asheet",dataa);

data.put("bsheet",datab);

linkedhashmap headers = new linkedhashmap<>();

headers.put("asheet",sheeta);

headers.put("bsheet",sheetb);

excelutil excelutil = new excelutil(filename,data,headers);

//获取表格对象

hssfworkbook workbook = excelutil.createexcel();

//这里内置了一个写到response的方法(判断浏览器类型设置合适的参数),如果想写到文件也是类似的

workbook.writetoresponse(workbook,request,response);

当然通常数据是通过数据库查询的,这里为了演示方便没有从数据库查找。

三、实现原理

这里简单说明下实现过程,从调用createexcel()这里开始

1、遍历headers创建sheet

public hssfworkbook createexcel() throws exception {

try {

hssfworkbook workbook = new hssfworkbook();

//遍历headers创建表格

for (string key : headers.keyset()) {

this.createsheet(workbook, key, headers.get(key), this.data.get(key));

}

return workbook;

} catch (exception e) {

log.error("创建表格失败:{}", e.getmessage());

throw e;

}

}

将workbook,sheet名,表头数据,行数据传入cratesheet方法中创建sheet。

2、创建表头

表头也就是一个表格的第一行,通常用来对列进行说明

hssfsheet sheet = workbook.createsheet(sheetname);

// 列数

int cellnum = header.length;

// 单元行,单元格

hssfrow row;

hssfcell cell;

// 表头单元格样式

hssfcellstyle columntopstyle = this.getcolumntopstyle(workbook);

// 设置表头

row = sheet.createrow(0);

for (int i = 0; i < cellnum; i++) {

cell = row.createcell(i);

cell.setcellstyle(columntopstyle);

string str = header[i][1];

cell.setcellvalue(str);

// 设置列宽为表头的文字宽度+6个半角符号宽度

sheet.setcolumnwidth(i, (str.getbytes("utf-8").length + 6) * 256);

}

3、插入行数据

这里是最重要的部分,首先通过数据的类对象获取它的反射属性field类,然后将属性名和field做一个hash映射,避免循环查找,提高插入速度,接着通过一个switch语句,根据属性类别设值,主要代码如下:

/**

* 设置单元格,根据fieldname获取对应的field类,使用反射得到值

*

* @param cell 单元格实例

* @param obj 存有属性的对象实例

* @param fieldmap 属性名与field的映射

* @param fieldname 属性名

*/

private void setcell(hssfcell cell, object obj, map fieldmap, string fieldname) throws exception {

//获取该属性的field对象

field field = fieldmap.get(fieldname);

//通过反射获取属性的值,由于不能确定该值的类型,用下面的判断语句进行合适的转型

object value = field.get(obj);

if (value == null) {

cell.setcellvalue("");

} else {

switch (field.getgenerictype().gettypename()) {

case "java.lang.string":

cell.setcellvalue((string) value);

break;

case "java.lang.integer":

case "int":

cell.setcellvalue((int) value);

break;

case "java.lang.double":

case "double":

cell.setcellvalue((double) value);

break;

case "java.util.date":

cell.setcellvalue(this.dateformat.format((date) value));

break;

default:

cell.setcellvalue(obj.tostring());

}

}

}

完整代码可以到github上查看下载,这里就不列出来了。

github地址:点击跳转

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对萬仟网的支持。

希望与广大网友互动??

点此进行留言吧!

java生成excel文件步骤_java导出Excel文件的步骤全纪录相关推荐

  1. java excel sheet页_Java导出Excel Sheet页

    1.问题背景 导出Excel表格时,首先要生成Sheet页,下面将介绍如何生成Sheet页 2.实现源码 /** * * @Project: * @Title:ExcelExport.java * @ ...

  2. java导出excel表头斜线_Java导出Excel三表头

    1.问题背景 Java导出Excel表格时,表头出现了三个,即多表头Excel 2.实现源码 /** * * @Project:Report * @Title:ThreeHead.java * @Pa ...

  3. java csv导出用excel打开乱码_java导出csv文件使用Excel打开乱码问题

    写一个csv文件,发现使用 notpad++ 打开是没有问题的,但是使用 Excel 打开之后显示乱码 刚开始的代码是这样子的: ByteArrayOutputStream os = new Byte ...

  4. Java web中不同浏览器间导出Excel文件名称乱码问题解决方案

    Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 参考文章: (1)Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 (2)https://www.cnblog ...

  5. Java基于注解和反射导入导出Excel

    代码地址如下: http://www.demodashi.com/demo/11995.html 1. 构建项目 使用Spring Boot快速构建一个Web工程,并导入与操作Excel相关的POI包 ...

  6. Java中使用poi导入、导出Excel

    Java中使用poi导入.导出Excel 学习了:http://www.cnblogs.com/Damon-Luo/p/5919656.html 转载于:https://www.cnblogs.com ...

  7. mysql数据库导入sql文件Mysql导入导出.sql文件的方法

    mysql数据库导入sql文件:Mysql导入导出.sql文件的方法 mysql导入sql文件:Mysql导入导出.sql文件 步骤如下: 一.MYSQL的命令行模式的设置: 桌面->我的电脑- ...

  8. java导出用什么_Java导出Excel

    简介 我们知道最简单的导出excel的方式其实是导出csv, 例如dbv的导出功能就是导出csv, 非常的傻瓜方便, 也不需要引入依赖, 但是当导出的文件内容中含有 "," (逗号 ...

  9. java导出类_java导出excel工具类

    java导出excel须要使用HSSFWorkbook这个类,须要导入poi-3.6-20091214.jar 工具类调用例如以下: package com.qlwb.business.util; i ...

最新文章

  1. 发送IP和MAC地址的方法
  2. 团队计划(5.25)
  3. appium查看控件的方法
  4. java中集合类的转换_Java中的两个常用工具类及集合数组的相互转换
  5. docker 4 section
  6. gulp.js 自动化构建工具学习入门
  7. 力扣268.丢失的数字
  8. 拒绝PPT手机?魅族首款真无孔手机将开启众筹
  9. python计算商品总价_python根据京东商品url获取产品价格
  10. android sim卡命令,Android常用命令
  11. 海康Ehome协议服务端搭建
  12. 索隆:九山八海,无我不断者。
  13. 网站瞬间变黑白颜色代码
  14. 赞奇科技英特尔共图视觉计算“云”上大作为
  15. 为什么你还没有买新能源汽车? 1
  16. 总成绩和平均分计算------C语言
  17. html5 3d自动,html5 3D微信头像自动抽奖代码
  18. 【万字长文】2022年最全的搭建Web自动化测试框架教程
  19. 区块链基础入门笔记 一
  20. Visio 32位下载

热门文章

  1. python安装过程的一些问题解决方案
  2. 文本区域的高度随着内容增加----插件
  3. Jenkins的Windows Slave分布式构建和部署
  4. Codeforces 405D 数学问题
  5. Asp.net通过Gmail发送邮件
  6. 【报告分享】2022微信视频号生态发展研究报告.pdf(附下载链接)
  7. 【报告分享】2021中国中高端人才趋势报告.pdf(附下载链接)
  8. 微博广告推荐策略工程架构体系演进
  9. 比特币系列——竞争币、竞争块链和应⽤程序
  10. 剑指offer 面试题49. 丑数