工作中特别是后台管理方面的同学时常会遇到导出数据的需求,下面博主分享下利用poi快速导出数据的方法:
一.加入poi的相关包
我用的是poi-3.9.jar,直接谷歌收缩下载后加入项目引用即可
二.编写代码
我的需求是导出某个月的系统签到记录,下面分别是Controller 和Service层面的代码
首先看controller
/**
* 收费员签到记录信息导出
*/
@RequestMapping("/exportPossUserSignIn")
public void exportPossUserSignIn(HttpServletRequest request,HttpServletResponse response){
String propertyId = request.getParameter("customerId");
String token = request.getParameter("token");
String certType = request.getParameter("certType");
String version = request.getParameter("version");
String checkDate=request.getParameter("checkDate");
//获取当前月份
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
String ss=sdf.format(new Date());
String strs=ss.substring(0,7);
if(checkDate==null||checkDate.equals("")){
checkDate=strs;
}
String possAccount=request.getParameter("possAccount");
String parkingLotName=request.getParameter("parkingLotName");
String backOperatorName=request.getParameter("backOperatorName");//获取登录用户名 用于操作日志记录
String streetName=request.getParameter("streetName");
String streetId=null;
if(streetName==null){
streetId=null;
}else{
streetId=streetService.selectByName(streetName, propertyId).getStreetId();
}
JSONObject str = new JSONObject();
Properties properties = null;
try {
properties = propertyService.findPropertyById(propertyId);
//str.put("properties", properties);
} catch (Exception e) {
str.put("message","物业信息查询失败" );
WebUtil.write(response, str.toString());
return;
}
boolean safeCheck = SafeUtil.safeCheck(propertyId, token, properties);
if (safeCheck==false) {
// 安全验证不通过
str.put("result", 500);
str.put("message", "安全验证失败");
WebUtil.write(response, str.toString());
return;
}
try{
//查询出全部收费员信息
List<PossUser> possUser = possService.selectOndutyRecord(propertyId, checkDate, possAccount, parkingLotName,streetId);
System.out.println("查询全部收费员信息");
System.out.println(possUser.size());
System.out.println("查询全部收费员信息");
List<PossUserSignIn> list = new ArrayList<PossUserSignIn>();
if (possUser.size() > 0) {
for (int i=0;i<possUser.size();i++) {
PossUserSignIn pus = new PossUserSignIn();//初始化导出类
OndutyRecord ondutyRecord = new OndutyRecord();
possUser.get(i).getOndutyRecord().clear();
String loginTime = "";
for (int j = 1; j <= 31; j++) {
if (j < 10) {
loginTime = checkDate + "-" + "0" + j;
// System.out.println(loginTime);
} else {
loginTime = checkDate + "-" + j;
// System.out.println(loginTime);
}
List<OndutyRecord> ondutyRecord_1 = ondutyRecordService.selectByLoginTime(possUser.get(i).getPossAccount(), loginTime);
if (ondutyRecord_1 == null || ondutyRecord_1.isEmpty()) {
// 如果当天收费员没有签到也要返回给前端 只不过赋值为null
// possUser.get(i).getOndutyRecord().add(j, null);
possUser.get(i).getOndutyRecord().add(ondutyRecord);
} else {
possUser.get(i).getOndutyRecord().add(ondutyRecord_1.get(0));
}
}
pus.setCheckDate(checkDate);
String parkingLotNames="";
if(possUser.get(i).getParkingLots()==null){
parkingLotNames="无";
}else{
parkingLotNames=possUser.get(i).getParkingLots().getParkingLotName();
}
pus.setParkingLotName(parkingLotNames);
pus.setPossAccount(possUser.get(i).getPossAccount());
pus.setOndutyRecord(possUser.get(i).getOndutyRecord());
list.add(pus);
}
}
Date date = new Date();
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd-HH-mm-ss");
String time=sdf1.format(date);
String fileName = "收费员签到记录表"+time+".xls";
//创建一个webbook 对应一个excel文件
HSSFWorkbook wb = new HSSFWorkbook();
//为当前工作簿创建名字
HSSFSheet sheet =wb.createSheet("收费员签到记录表"+time);
//通过工具类创建表格以及设值
ExportExcelForPossUserSignIn.createExcelOfUser(list,sheet,checkDate,wb);
ExportExcelForPossUserSignIn.setAttachmentFileName(request, response, fileName);
OutputStream out = response.getOutputStream();
wb.write(out);
out.flush();
out.close();
operationRecService.add("收费员管理", "成功", "参数",backOperatorName, "导出收费员签到记录表", propertyId);
}catch(Exception e){
e.printStackTrace();
operationRecService.add("收费员管理", "失败", "参数",backOperatorName, "导出收费员签到记录表", propertyId);
}
}
说明:在controller层吧需要的数据拿到,通过service中封装的方法组合成表格进行下载到本地。
service层:
这里吧相关的依赖包写出来,注意不要导错,其中合并单元格的方法已在代码中写明注释,实在不明白的同学,可以移驾慈宁宫,额,不对,移驾百度求解一番即可。
package com.pilot.core.controller.possuser;
import java.io.UnsupportedEncodingException;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
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;
import org.apache.poi.hssf.util.CellRangeAddress;
import com.pilot.core.pojo.Operator;
import com.pilot.core.pojo.PossUserMessage;
import com.pilot.core.pojo.PossUserSignIn;
public class ExportExcelForPossUserSignIn {
/**
* 备份用户的excel数据文件方法。
*
* @param UserList
* 根据要清理的条件获得的用户数据信息。
* @param sheet
*
*
*/
public static void createExcelOfUser(List<PossUserSignIn> pay,
HSSFSheet sheetForAuth,String checkDate,HSSFWorkbook wb) {
//设置单元格格式
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 水平布局:居中
//设置单元格跨行、跨列
//参数说明:1:开始行 2:结束行 3:开始列 4:结束列
//比如我要合并 第二行到第四行的 第六列到第八列 sheet.addMergedRegion(new CellRangeAddress(1,3,5,7));
sheetForAuth.addMergedRegion(new CellRangeAddress(0,1,0,1));//合并第一行到第二行的第一列到第二例
sheetForAuth.addMergedRegion(new CellRangeAddress(0,1,2,3));//合并第一行到第二行的第三列到第四例
sheetForAuth.addMergedRegion(new CellRangeAddress(0,0,4,34));//合并第一行的第5列到第34列
// 第三步,在sheet中添加表头第0行
HSSFRow rowHead1 = sheetForAuth.createRow(0);
rowHead1.createCell(0).setCellValue("收费员编号");
rowHead1.createCell(2).setCellValue("所属停车场");
rowHead1.createCell(4).setCellValue(" "+checkDate+" (1:表示已签到或者已签退 0:表示未签到或未签退)");
// 第四步,在sheet中添加表头第1行
HSSFRow rowHead2 = sheetForAuth.createRow(1);
rowHead2.createCell(4).setCellValue("1");
rowHead2.createCell(5).setCellValue("2");
rowHead2.createCell(6).setCellValue("3");
rowHead2.createCell(7).setCellValue("4");
rowHead2.createCell(8).setCellValue("5");
rowHead2.createCell(9).setCellValue("6");
rowHead2.createCell(10).setCellValue("7");
rowHead2.createCell(11).setCellValue("8");
rowHead2.createCell(12).setCellValue("9");
rowHead2.createCell(13).setCellValue("10");
rowHead2.createCell(14).setCellValue("11");
rowHead2.createCell(15).setCellValue("12");
rowHead2.createCell(16).setCellValue("13");
rowHead2.createCell(17).setCellValue("14");
rowHead2.createCell(18).setCellValue("15");
rowHead2.createCell(19).setCellValue("16");
rowHead2.createCell(20).setCellValue("17");
rowHead2.createCell(21).setCellValue("18");
rowHead2.createCell(22).setCellValue("19");
rowHead2.createCell(23).setCellValue("20");
rowHead2.createCell(24).setCellValue("21");
rowHead2.createCell(25).setCellValue("22");
rowHead2.createCell(26).setCellValue("23");
rowHead2.createCell(27).setCellValue("24");
rowHead2.createCell(28).setCellValue("25");
rowHead2.createCell(29).setCellValue("26");
rowHead2.createCell(30).setCellValue("27");
rowHead2.createCell(31).setCellValue("28");
rowHead2.createCell(32).setCellValue("29");
rowHead2.createCell(33).setCellValue("30");
rowHead2.createCell(34).setCellValue("31");
PossUserSignIn al = new PossUserSignIn();
System.out.println(pay);
// 第五步,写入实体数据 实际应用中这些数据从数据库得到,
if (pay != null) {
System.out.println("进入循环进入循环进入循环进入循环进入循环进入循环进入循环进入循环");
System.out.println(pay.size());
// 5 从集合的最高下标 递减 添加数据
for (int i = 0; i<pay.size(); i++) {
// i = 1
al = pay.get(i);
String farmington = al.getPossAccount();
// 放置数据存在 null 字符串 null ''
if (farmington != null && farmington.equals("null")) {
farmington = "";
}
HSSFRow row = sheetForAuth.createRow(i + 2);
sheetForAuth.addMergedRegion(new CellRangeAddress(i + 2,i + 2,0,1));//合并第一行到第二行的第一列到第二例
sheetForAuth.addMergedRegion(new CellRangeAddress(i + 2,i + 2,2,3));//合并第一行到第二行的第三列到第四例
row.createCell(0).setCellValue(farmington);
System.out.println(farmington);
row.createCell(2).setCellValue(al.getParkingLotName());
System.out.println(al.getParkingLotName());
System.out.println(checkDate);
for(int j=0;j<31;j++){
//判断如果有签到时间则导出标记为1 否则为0 同理签到一样
if(al.getOndutyRecord().get(j).getLoginTime()==null){
if(al.getOndutyRecord().get(j).getQuitTime()==null){
row.createCell(4+j).setCellValue(0+","+0);
}else{
row.createCell(4+j).setCellValue(0+","+0);
}
}else{
if(al.getOndutyRecord().get(j).getQuitTime()==null){
row.createCell(4+j).setCellValue(1+","+0);
}else{
row.createCell(4+j).setCellValue(1+","+1);
}
}
}
}
}
}
/**
* 设置下载文件编码/响应格式
*
* @param request
* @param response
* @param fileName
* @throws UnsupportedEncodingException
*/
public final static void setAttachmentFileName(HttpServletRequest request,
HttpServletResponse response, String fileName)
throws UnsupportedEncodingException {
response.setCharacterEncoding("UTF-8");
// 下载响应格式
response.setContentType("application/vnd.ms-excel;charset=UTF-8");
// 防止中文乱码,设置文本的编码格式
fileName = new String(fileName.getBytes("GBK"), "ISO-8859-1");
// 设置下载后生成的文件名字
response.setHeader("Content-Disposition", "attachment; filename="+ fileName);
}
}