Java导出数据到Excel表格
今天是2020年2月14日,首先祝各位情人节快乐
下面言归正传开始正文。
在后台管理系统中经常会有导出数据到Excel表格的功能需求,这个功能是难以规避的,而且这也是一个非常使用且人性化的一个功能。下面就给大家分享一下我在项目中实现此功能的方式和方法。
我使用的是POI进行一个Excel的操作,POI组件是由Apache提供的组件包,主要是为我们的Java程序提供对于office文档的相关操作,废话不多说直接上代码。
添加依赖(SpringBoot)
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.6</version>
</dependency>
POI相关组件简介
HSSFWorkbook:Excel对象,相当于一个 .xls/.xlsx 文件
HSSFSheet:工作表对象,Excel文件包涵的sheet,一个对象代表一个表单
HSSFRow:表示表格中的行对象。
HSSFCell:表示表格中的单元格对象。
HSSFHeader:Excel文档Sheet的页眉。
HSSFFooter:Excel文档Sheet的页脚。
HSSFDataFormat:日期格式。
HSSFFont:字体对象。
HSSFCellStyle:单元格样式(对齐样式、边框等)
HSSFComment:批注(注释)。
HSSFPatriarch:和HSSFComment用于创建注释的位置。
HSSFColor:颜色对象。
HSSFDateUtil:日期辅助工具
HSSFPrintSetup:打印辅助工具
HSSFErrorConstants:错误信息表
首先需要创建一个工具类
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
/**
* @Auther: ziye
* @Date: 2020/2/14
* @Description:
*/
public class ExcelUtil {
/**
* 导出Excel
*
* @param sheetName sheet名称
* @param title 标题
* @param values 内容
* @param wb HSSFWorkbook对象
* @return
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName, String[] title, String[][] values, HSSFWorkbook wb) {
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if (wb == null)
wb = new HSSFWorkbook();
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
//声明列对象
HSSFCell cell = null;
//创建标题
for (int i = 0; i < title.length; i++) {
cell = row.createCell(i);
cell.setCellValue(title[i]);
cell.setCellStyle(style);
}
//创建内容
for (int i = 0; i < values.length; i++) {
row = sheet.createRow(i + 1);
for (int j = 0; j < values[i].length; j++) {
//将内容按顺序赋给对应的列对象
row.createCell(j).setCellValue(values[i][j]);
}
}
return wb;
}
}
工具类创建完成后就开始进行相关的调用
便于大家理解和查看代码,我就把调用过程直接写在了Controller层中
@ResponseBody
@RequestMapping(value = "/exportExcel", method = RequestMethod.GET)
public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws Exception {
SimpleDateFormat df = new SimpleDateFormat("yyyyMMdd");//设置日期格式
String year = df.format(new Date());
//为了方便大家理解,选择用获取数据表中的全部数据为例子
List<Leader> list = leaderService.getList();
//设置Excel表头
String[] title = {"ID", "领导姓名", "性别", "电子邮箱", "联系电话", "入职时间"};
//设置Excel文件名
String filename = "LeaderList_"+year+".xls";
//设置工作表名称
String sheetName = "sheet1";
//开始对从数据库中获取到的数据进行处理
String[][] content = new String[list.size()][6];
try {
for (int i = 0; i < list.size(); i++) {
content[i][0] = String.valueOf(list.get(i).getLeaderId());
content[i][1] = list.get(i).getName();
if(list.get(i).getSex() == 0){
content[i][2] = "女";
}else{
content[i][2] = "男";
}
content[i][3] = list.get(i).getEmail();
content[i][4] = list.get(i).getPhone();
content[i][5] = String.valueOf(list.get(i).getIntime());
}
} catch (Exception e) {
e.printStackTrace();
}
HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(sheetName, title, content, null);
try {
// 响应到客户端
this.setResponseHeader(response, filename);
OutputStream os = response.getOutputStream();
wb.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}
/**
* 向客户端发送响应流方法
*
* @param response
* @param fileName
*/
public void setResponseHeader(HttpServletResponse response, String fileName) {
try {
try {
fileName = new String(fileName.getBytes(), "UTF-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + URLEncoder.encode(fileName, "UTF-8"));
} catch (Exception ex) {
ex.printStackTrace();
}
}
大家需要注意的一点就是,我这里使用的是GET方式提交,是因为我需要浏览器发送请求时即下载Excel,所以就不能用ajax进行传输
在页面上的调用方式
便于理解,我选择了最简单直观的调用方式(JS调用Controller方法)
<script>
function exportExcel(){
let url = "/leader/exportExcel";
location.href = url;
}
</script>
结语
以上代码即是本人在实现此功能时所选择的实现方式
如果文章中有错误,欢迎大家留言指正;若您有更好、更简便的方式来实现此功能,欢迎大家在留言区留下您的建议。
在这个特殊的情人节,愿:
你在被打击时,记起你的珍贵,抵抗恶意;
你在迷茫时,坚信你的珍贵,抛开蜚语;
爱你所爱 行你所行 听从你心 无问东西