1.数据导出在业务场景中经常使用,下面需要导出以下样式的excel表格.
可以看出这个excel表格不是很复杂,只需要将前三行自己写进去.用的技术是POI的导出
2.具体实现
2.1 首先是创建样式,创建字体的大小和位置
//创建样式 cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //创建字体样式 HSSFFont font2 = wb.createFont(); font2.setFontName("宋体"); font2.setFontHeightInPoints((short) 10); //水平对齐方式(居中) cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //垂直对齐方式(居中) cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); cellStyle.setFont(font2);
2.2 写入前三行
//创建第一行 HSSFRow row = sheet.createRow(0); //合并第一行的一二三列 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); HSSFCell cell = row.createCell(0); //样式 cell.setCellStyle(cellStyle); cell.setCellType(HSSFCell.CELL_TYPE_STRING); //值 cell.setCellValue("浙江公司基建管理单位复工人员情况统计表");
2.3 第二三行
HSSFRow row1 = sheet.createRow(1);
//设置第二行第一列的宽度 sheet.setColumnWidth(0,(int)((35+0.72)*256)); HSSFCell cell1 = row1.createCell(0); cell1.setCellStyle(cellStyle); cell1.setCellValue("基建管理单位"); sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2)); HSSFCell cel2 = row1.createCell(1); cel2.setCellStyle(cellStyle); cel2.setCellValue("管理人员"); HSSFRow row2 = sheet.createRow(2); row2.setRowStyle(cellStyle); row2.createCell(1).setCellValue("绿码人员"); row2.createCell(2).setCellValue("红码人员");
还可以根据该列内容的长度自适应列的宽度,这里长度差不多,就直接写死了.
2.4 插入中间数据
private void setCellData(List<Map> data, int startRow, String[] colKeys) { HSSFRow row = null; HSSFCell cell = null; int i = startRow; if (data != null && data.size() > 0) { for (int k=0;k<data.size();k++){ Map<String, Object> rowData = data.get(k); row = sheet.createRow(i); int j = 0; for (String key:colKeys){ Object colValue = rowData.get(key); cell = row.createCell(j); if (colValue != null) { sheet.setColumnWidth(0,(int)((35+0.72)*256)); cell.setCellValue(colValue.toString()); if (j!=0){ cell.setCellStyle(cellStyle); } } j++; } i++; } } }
2.5 直接导出显示在浏览器上下载
response.reset(); String fileName = URLEncoder.encode("浙江公司基建管理单位管理人员复工情况表.xls","UTF-8"); response.setHeader("content-disposition", "attachment;filename="+fileName); response.setCharacterEncoding("UTF-8"); //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setContentType("multipart/form-data"); // 创建输出流 OutputStream out = response.getOutputStream(); HSSFWorkbook workbook = (excel.getExcelFile(data, "管理人员", headNames, keys,data.size())); workbook.write(out); workbook.close(); out.close();
3 合成代码
package com.hyit.appdev.personnel.appHealth.service; import com.hyit.appdev.personnel.appHealth.bean.AppHealthPersonnelInfomation; import org.apache.poi.hssf.usermodel.HSSFCell; 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.ss.util.CellRangeAddress; import org.apache.poi.hssf.usermodel.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.net.URLEncoder; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class excel { private HSSFWorkbook wb; private HSSFSheet sheet; private HSSFCellStyle cellStyle; public void createExcel(HSSFWorkbook wb){ sheet = wb.createSheet("管理人员"); //创建样式 cellStyle = wb.createCellStyle(); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //创建字体样式 HSSFFont font2 = wb.createFont(); font2.setFontName("宋体"); font2.setFontHeightInPoints((short) 10); //水平对齐方式(居中) cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER); //垂直对齐方式(居中) cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER); cellStyle.setFont(font2); //创建第一行 HSSFRow row = sheet.createRow(0); //合并第一行的一二三列 sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 2)); HSSFCell cell = row.createCell(0); //样式 cell.setCellStyle(cellStyle); cell.setCellType(HSSFCell.CELL_TYPE_STRING); //值 cell.setCellValue("浙江公司基建管理单位复工人员情况统计表"); HSSFRow row1 = sheet.createRow(1); sheet.setColumnWidth(0,(int)((35+0.72)*256)); HSSFCell cell1 = row1.createCell(0); cell1.setCellStyle(cellStyle); cell1.setCellValue("基建管理单位"); sheet.addMergedRegion(new CellRangeAddress(1, 1, 1, 2)); HSSFCell cel2 = row1.createCell(1); cel2.setCellStyle(cellStyle); cel2.setCellValue("管理人员"); HSSFRow row2 = sheet.createRow(2); row2.setRowStyle(cellStyle); row2.createCell(1).setCellValue("绿码人员"); row2.createCell(2).setCellValue("红码人员"); } public HSSFWorkbook getExcelFile(List<Map> data, String sheetName, String[] headNames, String[] colKeys, int size) throws IOException { wb = new HSSFWorkbook(); //sheet = wb.createSheet(sheetName);// 创建表头 startRow代表表体开始的行 createExcel(wb); setCellData(data,3, colKeys); ByteArrayOutputStream baos = new ByteArrayOutputStream(); wb.write(baos); byte[] ba = baos.toByteArray(); ByteArrayInputStream bais = new ByteArrayInputStream(ba); return wb; } private void setCellData(List<Map> data, int startRow, String[] colKeys) { HSSFRow row = null; HSSFCell cell = null; int i = startRow; if (data != null && data.size() > 0) { for (int k=0;k<data.size();k++){ Map<String, Object> rowData = data.get(k); row = sheet.createRow(i); int j = 0; for (String key:colKeys){ Object colValue = rowData.get(key); cell = row.createCell(j); if (colValue != null) { sheet.setColumnWidth(0,(int)((35+0.72)*256)); cell.setCellValue(colValue.toString()); if (j!=0){ cell.setCellStyle(cellStyle); } } j++; } i++; } } } public void exportData(HttpServletResponse response, List<AppHealthPersonnelInfomation> list, Integer red, Integer green, Integer yellow){ excel excel = new excel(); List<Map> data = new ArrayList<>(); LinkedHashMap<String, Object> e = new LinkedHashMap<String, Object>(); for(int i=0;i<list.size();i++){ e =new LinkedHashMap<String,Object>(); e.put("unit", list.get(i).getUnit()); e.put("greenCode", list.get(i).getGreenCodeTotal()); e.put("redCode", list.get(i).getRedCodeTotal()); data.add(e); } String[] headNames = { "单位名称", "绿码人数", "红码人数" }; String[] keys = { "unit", "greenCode", "redCode"}; try{ response.reset(); String fileName = URLEncoder.encode("浙江公司基建管理单位管理人员复工情况表.xls","UTF-8"); response.setHeader("content-disposition", "attachment;filename="+fileName); response.setCharacterEncoding("UTF-8"); //1.设置文件ContentType类型,这样设置,会自动判断下载文件类型 response.setContentType("multipart/form-data"); // 创建输出流 OutputStream out = response.getOutputStream(); HSSFWorkbook workbook = (excel.getExcelFile(data, "管理人员", headNames, keys,data.size())); workbook.write(out); workbook.close(); out.close(); }catch (Exception ex){ ex.printStackTrace(); } } }
end!