poi导出excel,这里介绍两种方法:一种是写到本地磁盘,一种是从浏览器下载。
一.写到本地磁盘的方法
1.先写一个导出的公用方法,然后传入数据即可,工具类可以拿走直接用,传参就行了。
/**
* Purpose:汇出excel工具类
* @author JaxWan
* @param fileName 文件名称
* @param titles 表头集合
* @param dateMaps 数据集合
* @return HSSFWorkbook
*/
public void dateToExcel(String fileName,List<String> titles,List<Map<String,Object>> dateMaps){
//创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = workbook.createSheet();
//创建单元格样式 ,首先生成一个样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
//设置这些样式
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
// 背景色
// cellStyle.setFillForegroundColor(HSSFColor.GREEN.index);
// cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// cellStyle.setFillBackgroundColor(HSSFColor.GREEN.index);
//设置边框
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
//自动换行
cellStyle.setWrapText(true);
//生成一个字体
HSSFFont font = workbook.createFont();//设置字体大小
font.setFontHeightInPoints((short) 12); // 字体高度
font.setFontName("宋体"); // 字体
//把字体应用到当前样式
cellStyle.setFont(font);
//创建行
HSSFRow row;
row = sheet.createRow(0);
//设置表头
for (int i = 0; i < titles.size(); i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(titles.get(i));
cell.setCellStyle(cellStyle);
//设置列宽
sheet.setColumnWidth(i, 3766);
}
//填充数据
for (int i = 0; i < dateMaps.size(); i++) {
Map<String, Object> map = dateMaps.get(i);
//第一行是表头 数据要从第二行开始
row = sheet.createRow(i+1);
//第一种遍历map的方法,通过加强for循环map.keySet(),然后通过键key获取到value值
int cellNumber = 0;
for (String s : map.keySet()) {
System.out.println("key : " + s + " value : " + map.get(s));
//创建单元格并赋值
HSSFCell cell = row.createCell(cellNumber);
cell.setCellValue((String)map.get(s));
cell.setCellStyle(cellStyle);
cellNumber++;
}
}
try {
String path = "E:";
OutputStream out = new FileOutputStream(path+fileName+".xls");
out.flush();
workbook.write(out);
out.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
2.调用工具类输出到指定位置,我的是"E:"
public void importFlightPlanInfo() throws Exception {
List<String> titles = new ArrayList<String>();
titles.add("航班号");
// titles.add("类别");
titles.add("计飞old");
titles.add("计飞new");
titles.add("计飞差");
titles.add("预飞old");
titles.add("预飞new");
titles.add("预飞差");
titles.add("实飞old");
titles.add("实飞new");
titles.add("实飞差");
titles.add("计达old");
titles.add("计达new");
titles.add("计达差");
titles.add("预达old");
titles.add("预达new");
titles.add("预达差");
titles.add("实达old");
titles.add("实达new");
titles.add("实达差");
titles.add("状态");
titles.add("机型");
titles.add("更新时间");
String sql = " select flt_aid,schd_dpt_dt_old,schd_dpt_dt_new,schd_dpt_dt1,estmt_dpt_dt_old,estmt_dpt_dt_new,estmt_dpt_dt1,dpt_tm_old,dpt_tm_new,dpt_tm1, "
+ " schd_arrv_dt_old,schd_arrv_dt_new,schd_arrv_dt1,estmt_arrv_dt_old,estmt_arrv_dt_new,estmt_arrv_dt1,arrv_dt_old,arrv_dt_new,arrv_dt1, flt_stat_chn_nm,air_crft_typ_cd,flight_date"
+ " from w_source_test where 1=1 ";
List<Map<String, Object>> flights1 = dao.getMapList(sql);
String fileName = "定时导出excel任务";
this.dateToExcel(fileName+new Date().getHours(), titles, flights1);
}
二.从浏览器中下载,大致思路还是先写一个工具类,然后从wen端调用,输出就可以了
1.工具类,和上面那个只有一点区别 就是不输出到本地了,而是返回一个HSSFWorkbook 对象(HSSFWorkbook 和XSSFWorkbook的区别有空再说吧,这里就不说了 )
/**
* Purpose:汇出excel工具类
* @author JaxWan
* @param fileName 文件名称
* @param titles 表头
* @param dateMaps 数据集合
* @return HSSFWorkbook
*/
public HSSFWorkbook dateToExcel(String fileName,List<String> titles,List<Map<String,Object>> dateMaps){
//创建工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
//创建工作表
HSSFSheet sheet = workbook.createSheet();
//创建单元格样式 ,首先生成一个样式
HSSFCellStyle cellStyle = workbook.createCellStyle();
//设置这些样式
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平居中
// 背景色
// cellStyle.setFillForegroundColor(HSSFColor.GREEN.index);
// cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
// cellStyle.setFillBackgroundColor(HSSFColor.GREEN.index);
//设置边框
cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
//自动换行
cellStyle.setWrapText(true);
//生成一个字体
HSSFFont font = workbook.createFont();//设置字体大小
font.setFontHeightInPoints((short) 12); // 字体高度
font.setFontName("宋体"); // 字体
//把字体应用到当前样式
cellStyle.setFont(font);
//创建行
HSSFRow row;
row = sheet.createRow(0);
//设置表头
for (int i = 0; i < titles.size(); i++) {
HSSFCell cell = row.createCell(i);
cell.setCellValue(titles.get(i));
cell.setCellStyle(cellStyle);
//设置列宽
sheet.setColumnWidth(i, 3766);
}
//填充数据
for (int i = 0; i < dateMaps.size(); i++) {
Map<String, Object> map = dateMaps.get(i);
//第一行是表头 数据要从第二行开始
row = sheet.createRow(i+1);
//第一种遍历map的方法,通过加强for循环map.keySet(),然后通过键key获取到value值
int cellNumber = 0;
for (String s : map.keySet()) {
System.out.println("key : " + s + " value : " + map.get(s));
//创建单元格并赋值
HSSFCell cell = row.createCell(cellNumber);
cell.setCellValue((String)map.get(s));
cell.setCellStyle(cellStyle);
cellNumber++;
}
}
return workbook;
}
2.controller方法
/**
* Purpose:导出全部
* @author JaxWan
* @param req
* @return IZrarResponse
*/
public IZrarResponse exportExcelData(IZrarRequest req) {
IZrarResponse res = new ZrarResponse();
String airport = req.getParameter("airport");
String flightdate = req.getParameter("flightDate");
String disType = req.getParameter("disType");
String sql = " select flt_aid,schd_dpt_dt_old,schd_dpt_dt_new,schd_dpt_dt1,estmt_dpt_dt_old,estmt_dpt_dt_new,estmt_dpt_dt1,dpt_tm_old,dpt_tm_new,dpt_tm1, "
+ " schd_arrv_dt_old,schd_arrv_dt_new,schd_arrv_dt1,estmt_arrv_dt_old,estmt_arrv_dt_new,estmt_arrv_dt1,arrv_dt_old,arrv_dt_new,arrv_dt1, flt_stat_chn_nm,air_crft_typ_cd,flight_date,"
+ " xml_info,copy_xml_info "
+ " from w_source_test where 1=1 ";
if(StringUtil.isNull(flightdate)){
flightdate = DateUtil.dateToString(1, new Date());
}
if(StringUtil.isNotNull(flightdate)){
sql += " and flight_date like '"+ flightdate +"%'";
}
if(StringUtil.isNotNull(airport)&&!"null".equals(airport)){
sql += " and airport = '"+ airport+"'";
}
String comSql = sql;
if(StringUtil.isNotNull(disType)&&!"0".equals(disType)){
comSql += " and type = '"+ disType+"'";
}
List<Map<String, Object>> flights1 = dao.getMapList(comSql);
List<String> titles = new ArrayList<String>();
titles.add("航班号");
// titles.add("类别");
titles.add("计飞old");
titles.add("计飞new");
titles.add("计飞差");
titles.add("预飞old");
titles.add("预飞new");
titles.add("预飞差");
titles.add("实飞old");
titles.add("实飞new");
titles.add("实飞差");
titles.add("计达old");
titles.add("计达new");
titles.add("计达差");
titles.add("预达old");
titles.add("预达new");
titles.add("预达差");
titles.add("实达old");
titles.add("实达new");
titles.add("实达差");
titles.add("状态");
titles.add("机型");
titles.add("更新时间");
String fileName = "xxx对比结果";
HSSFWorkbook workbook = this.dateToExcel(fileName, titles, flights1);
try {
HttpServletResponse response = (HttpServletResponse) ThreadPool.get(SysConstant.HTTP_RESPONSE);
//发送响应流方法
fileName = new String(fileName.getBytes(), "ISO8859-1");
response.setContentType("application/octet-stream;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename=" + fileName+".xls");
response.addHeader("Pargam", "no-cache");
response.addHeader("Cache-Control", "no-cache");
OutputStream os = response.getOutputStream();
workbook.write(os);
os.flush();
os.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return res;
}
3.jsp直接调用即可
<a href="flightsInterfaceBLH_exportExcelData.do?" >导出全部</a>