java导出Excel文件的步骤全纪录

一、背景

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

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

1、fileName

excel文件名

2、HasMap<String,List<?>> data

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

3、LinkedHashMap<String,String[][]> 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<A> dataA = .....;
List<B> dataB = .....;

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

String[][] sheetA = {
 {"name","姓名"}
 ,{"address","住址"}
}
String[][] sheetB = {
 {"id","ID"}
 ,{"sum","余额"}
 ,{"cat","猫的名字"}
}

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

String fileName = "测试Excel";
HashMap<String,List<?>> data = new HashMap<>();
//ASheet为表名,后面headers里的key要跟这里一致
data.put("ASheet",dataA);
data.put("BSheet",dataB);
LinkedHashMap<String,String[][]> 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<String, Field> 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地址:点击跳转

总结

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

(0)

相关推荐

  • java实现在线预览--poi实现word、excel、ppt转html的方法

    java实现在线预览 - -之poi实现word.excel.ppt转html,具体内容如下所示: ###简介 java实现在线预览功能是一个大家在工作中也许会遇到的需求,如果公司有钱,直接使用付费的第三方软件或者云在线预览服务就可以了,例如永中office.office web 365(http://www.officeweb365.com/)他们都有云在线预览服务,就是要钱0.0 如果想要免费的,可以用openoffice,还需要借助其他的工具(例如swfTools.FlexPaper等)才

  • java 如何往已经存在的excel表格里面追加数据的方法

    第一步.导入jar包,两个 poi.jar包  地址在 https://www.jb51.net/softs/542575.html jxl.jar包  地址在  https://www.jb51.net/softs/544392.html 第二步.编写程序 package cn.com.com; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import

  • 如何使用Java在excel单元格中设置超链接

    这篇文章主要介绍了如何使用Java在excel单元格中设置超链接,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 (一)问题引入 有时候我们在导入数据到excel中时可能要给某个文件或图片设置超链接,例如链接到外网或者是本地的某个目录.我们可以通过Java代码来实现,借助POI库. (二)解决方案 下面直接给出参考代码示例: File file; Workbook wb = new XSSFWorkbook(file); Sheet sheet

  • java导出Excel通用方法实例

    数据导出到Excel几乎是所有客户都会提出的一个需求.下面我就分享一下我的代码. 首先需要引入的jar包: 然后就是正式代码了. package lcy._41_50; import java.io.FileOutputStream; import java.io.OutputStream; import java.net.URLEncoder; import javax.servlet.http.HttpServletResponse; import org.apache.poi.hssf.u

  • Java POI实现将导入Excel文件的示例代码

    问题描述 现需要批量导入数据,数据以Excel形式导入. POI介绍 我选择使用的是apache POI.这是有Apache软件基金会开放的函数库,他会提供API给java,使其可以对office文件进行读写. 我这里只需要使用其中的Excel部分. 实现 首先,Excel有两种格式,一种是.xls(03版),另一种是.xlsx(07版).针对两种不同的表格格式,POI对应提供了两种接口.HSSFWorkbook和XSSFWorkbook 导入依赖 <dependency> <group

  • java实现导出Excel的功能

    导出excel是咱Java开发的必备技能啦,之前项目有这个功能,现在将其独立出来,分享一下. 所用技术就是SpringBoot,然后是MVC架构模式. 废话不多说,直接上代码了,源码点末尾链接就可以下载. (1)新建一个SpringBoot项目(可以官网https://start.spring.io/直接生成下载,然后导入eclipse),项目结构如下: (2)修改pom文件,添加依赖: <dependency> <groupId>org.springframework.boot&

  • Java利用POI读取、写入Excel的方法指南

    前言 Apache POI [1] 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能.POI为"Poor Obfuscation Implementation"的首字母缩写,意为"简洁版的模糊实现". 做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求: 网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里

  • JAVA使用POI(XSSFWORKBOOK)读取EXCEL文件过程解析

    经过一番搜索发现,java操纵excel文件常用的有jxl和poi两种方式,孰好孰坏看自己需求而定. 其中最主要的区别在于jxl不支持.xlsx,而poi支持.xlsx 这里介绍的使用poi方式(XSSFWorkbook),实际上poi提供了HSSFWorkbook和XSSFWorkbook两个实现类.区别在于HSSFWorkbook是针对.xls文件,XSSFWorkbook是针对.xslx文件. 首先明确一下基本概念: 先创建一个工作簿,一个工作簿可以有多个工作表,一个工作表可以有多个行,一

  • java导出Excel文件的步骤全纪录

    一.背景 当前B/S模式已成为应用开发的主流,而在企业办公系统中,常常有客户这样子要求:你要把我们的报表直接用Excel打开(电信系统.银行系统).或者是:我们已经习惯用Excel打印.这样在我们实际的开发中,很多时候需要实现导入.导出Excel的应用. 最近在java上做了一个EXCEL的导出功能,写了一个通用类,在这里分享分享,该类支持多sheet,且无需手动进行复杂的类型转换,只需提供三个参数即可: 1.fileName excel文件名 2.HasMap<String,List<?&g

  • java中的export方法实现导出excel文件

    目录 1.export函数 2.导出列名 3.export实现方法 4.前端对接 5.前端代码 1.export函数 //导出文件接口 public String export(){ return this.myExport(exportList); } 2.导出列名 private String myExport(List<BusinessDept> list){ com.bronzesoft.power.tools.json.JSONObject info = new com.bronze

  • Java数据导出功能之导出Excel文件实例

    在编程中经常需要使用到表格(报表)的处理主要以Excel表格为主.下面给出用java写入数据到excel表格方法: 1.添加jar文件 java导入导出Excel文件要引入jxl.jar包,最关键的是这套API是纯Java的,并不依赖Windows系统,即使运行在Linux下,它同样能够正确的处理Excel文件.下载地址:http://www.andykhan.com/jexcelapi/ 2.jxl对Excel表格的认识 可以参见:http://www.jb51.net/article/686

  • Java中利用POI优雅的导出Excel文件详解

    前言 故事是这样开始的: 公司给排了几天的工期,让完成 2 个功能模块的开发.其中有一个场景是这样的,从 Excel 导入数据,要求数据不能重复.用户可以下载导入失败的 Excel 文件. 这样就有 2 种实现 将失败数据存储数据库,需要下载时生成 Excel 下载即可 将失败数据生成 Excel 文件存储文件服务器,然后返回下载链接. 老大要求按方案二进行.好吧,导出 Excel 是再常见不过的功能了,然而总是觉得以前写的不够优雅,所以决定进行简单的封装,以适应简单场景的 Excel 导出.

  • Java实现导入导出Excel文件的方法(poi,jxl)

    目前,比较常用的实现Java导入.导出Excel的技术有两种Jakarta POI和Java Excel直接上代码: 一,POI POI是apache的项目,可对微软的Word,Excel,Ppt进行操作,包括office2003和2007,Excl2003和2007.poi现在一直有更新.所以现在主流使用POI. xls: pom: <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi

  • Java树形结构数据生成导出excel文件方法记录

    目录 什么是树形结构数据 效果 用法 源码 总结 什么是树形结构数据 效果 用法 String jsonStr = "{\"name\":\"aaa\",\"children\":[{\"name\":\"bbb\",\"children\":[{\"name\":\"eee\"},{\"name\":\"f

  • JSP导出Excel文件的方法

    本文实例讲述了JSP导出Excel文件的方法.分享给大家供大家参考,具体如下: <%@page import="jxl.Workbook,com.ecc.emp.core.*,com.ecc.emp.data.*,com.ecc.emp.jdbc.ConnectionManager,jxl.format.VerticalAlignment,java.sql.*,jxl.write.*,jxl.format.UnderlineStyle,javax.sql.DataSource"%

  • java导出Excel通用方法的实例详解

    java导出Excel通用方法的实例详解 Java导出Excel通用方法,只需要一个list 集合.通用方法改进之处踊跃提出 package oa.common.utils; import java.io.OutputStream; import java.util.List; import javax.servlet.http.HttpServletResponse; import org.apache.struts2.ServletActionContext; import java.lan

  • POI通过模板导出EXCEL文件的实例

    一般的EXCEL导出使用POI先创建一个HSSFWorkbook,然后通过不断创建HSSFRow,HSSFCell后设置单元格内容便可以完成导出. 这次在项目中需要用到模板,导出的内容包括(1.模板中的内容.样式.2.自己需要新增的内容.样式.),还需要设置单元格的样式,在网上搜了一些blog,完成后记录一下. 分析这次需求,最关键的就是如何获取到填充了模板的新HSSFWorkbook,如果获取到它,我们可以熟练的往里面添加内容. File fi = new File("F:/usr/user.

随机推荐