最近项目中需要用到excel的导出功能,之前也曾做过,但是没有总结过,考虑到这个功能在web项目中的高频使用,因此这次开发完成之后,把对excel的导出功能进行一次总结,样式的问题,我这次没有考虑,主要是导出功能的实现过程,下面就是我的代码:
既然是对excel的操作,那么首先考虑的就是要把这段操作代码进行抽取,将其作为一个工具类进行重复调用,下面就是我的excel的工具类:
package com.suyin.goods.utils;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import javax.servlet.ServletOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
/**
* 导出Excel公共方法
* @version 1.0
*
* @author lihao
*
*/
public class ExcelUtils {
//显示的导出表的标题
private String title;
//导出表的列名
private String[] rowName ;
private List<Object[]> dataList = new ArrayList<Object[]>();
private ServletOutputStream outputStream;
//构造方法,传入要导出的数据
public ExcelUtils(String title, String[] rowName, List<Object[]> dataList, ServletOutputStream outputStream){
this.dataList = dataList;
this.rowName = rowName;
this.title = title;
this.outputStream =outputStream;
}
/*
* 导出数据
* */
public void export() throws Exception{
try{
HSSFWorkbook workbook = new HSSFWorkbook(); // 创建工作簿对象
HSSFSheet sheet = workbook.createSheet(title); // 创建工作表
// 产生表格标题行
HSSFRow rowm = sheet.createRow(0);
rowm.setHeight((short) (25 * 35)); //设置高度
// 定义所需列数
int columnNum = rowName.length;
HSSFRow rowRowName = sheet.createRow(0); // 在索引2的位置创建行(最顶端的行开始的第二行)
rowRowName.setHeight((short) (25 * 25)); //设置高度
// 将列头设置到sheet的单元格中
for(int n=0;n<columnNum;n++){
HSSFCell cellRowName = rowRowName.createCell(n); //创建列头对应个数的单元格
cellRowName.setCellType(CellType.STRING); //设置列头单元格的数据类型
HSSFRichTextString text = new HSSFRichTextString(rowName[n]);
cellRowName.setCellValue(text); //设置列头单元格的值
}
//将查询出的数据设置到sheet对应的单元格中
for(int i=0;i<dataList.size();i++){
Object[] obj = dataList.get(i);//遍历每个对象
HSSFRow row = sheet.createRow(i+1);//创建所需的行数
row.setHeight((short) (25 * 20)); //设置高度
for(int j=0; j<obj.length; j++){
HSSFCell cell =row.createCell(j);
if(null !=obj[j] && !"".equals(obj[j])){
cell.setCellValue(obj[j].toString());
}
}
}
if(null!=workbook){
try
{
workbook.write(outputStream);
outputStream.flush();
outputStream.close();
}catch (IOException e){
e.printStackTrace();
}
}
}catch(Exception e){
e.printStackTrace();
}
}
}
下面是对数据的封装
@RequestMapping(value = "/export",method = RequestMethod.GET)
public String export(HttpServletResponse response, HttpServletRequest request,String beginTime, String endTime) {
response.setContentType("application/binary;charset=UTF-8");
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Map<String, Object> paraMap = new HashMap<>();
if(StringUtils.isNotEmpty(beginTime) && StringUtils.isNotBlank(beginTime)){
paraMap.put("beginTime", beginTime);
}
if(StringUtils.isNotEmpty(beginTime) && StringUtils.isNotBlank(beginTime)){
paraMap.put("endTime", endTime);
}
try {
ServletOutputStream out = response.getOutputStream();
String title = new String((new SimpleDateFormat("yyyy-MM-dd HH-mm-ss").format(new Date())).getBytes(), "UTF-8");
response.setHeader("Content-disposition", "filename=" + title + ".xls");
String[] rowName = {"序号","用户昵称", "打卡内容", "打卡时间"};
List<SignVO> list = fiveMinutesServiceSign.getSignVOList(paraMap);
List<Object[]> dataList = new ArrayList<Object[]>();
Object[] objs = null;
for (int i = 0; i <list.size() ; i++) {
SignVO signVO =list.get(i);
objs =new Object[rowName.length];
objs[0] =i;
objs[1] =signVO.getNickname();
objs[2] =signVO.getComment();
objs[3] =simpleDateFormat.format(signVO.getSignTime());
dataList.add(objs);
}
ExcelUtil excelUtil = new ExcelUtil("每日五分钟打卡",rowName,dataList,out);
excelUtil.export();
return null;
} catch (Exception e) {
e.printStackTrace();
return "导出信息失败";
}
以上就是数据导出excel的代码,希望能帮助到大家!后面会写一篇关于poi的导入,关于poi的jar包可以去我的资源地址下载:
https://download.csdn.net/download/lbd_123/10775477
原文:https://www.cnblogs.com/lazydays/p/12078012.html