package com.cxy.domain.poi; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) public @interface ExcelAttribute { /** 对应的列名称 */ String name() default ""; /** excel列的索引 */ int sort(); /** 字段类型对应的格式 */ String format() default ""; }
package com.ihrm.common.poi; import com.ihrm.domain.poi.ExcelAttribute; import lombok.Getter; import lombok.Setter; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.formula.functions.T; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.lang.reflect.Field; import java.net.URLEncoder; import java.util.ArrayList; import java.util.LinkedList; import java.util.List; import java.util.concurrent.atomic.AtomicInteger; /** * 导出Excel工具类 * 基于模板打印的方式导出: */ @Getter @Setter public class ExcelExportUtil<T> { private int rowIndex; //写入数据的起始行 private int styleIndex; //需要提取的样式所在的行号 private Class clazz; //对象的字节码 private Field fields[]; //对象中的所有属性 public ExcelExportUtil(Class clazz,int rowIndex,int styleIndex) { this.clazz = clazz; this.rowIndex = rowIndex; this.styleIndex = styleIndex; fields = clazz.getDeclaredFields(); } /** * 基于注解导出 参数: response: InputStream:模板的输入流 objs:数据 fileName:生成的文件名 * */ public void export(HttpServletResponse response,InputStream is, List<T> objs,String fileName) throws Exception { //1.根据模板创建工作簿 XSSFWorkbook workbook = new XSSFWorkbook(is); //2.读取工作表 Sheet sheet = workbook.getSheetAt(0); //3.提取公共的样式 CellStyle[] styles = getTemplateStyles(sheet.getRow(styleIndex)); //4.根据数据创建每一行和每一个单元格的数据2 AtomicInteger datasAi = new AtomicInteger(rowIndex); //数字 for (T t : objs) { //datasAi.getAndIncrement() :获取数字,并++ i++ Row row = sheet.createRow(datasAi.getAndIncrement()); for(int i=0;i<styles.length;i++) { Cell cell = row.createCell(i); cell.setCellStyle(styles[i]); for (Field field : fields) { if(field.isAnnotationPresent(ExcelAttribute.class)){ field.setAccessible(true); ExcelAttribute ea = field.getAnnotation(ExcelAttribute.class); if(i == ea.sort()) { if(field.get(t) != null) { cell.setCellValue(field.get(t).toString()); } } } } } } fileName = URLEncoder.encode(fileName, "UTF-8"); response.setContentType("application/octet-stream"); response.setHeader("content-disposition", "attachment;filename=" + new String(fileName.getBytes("ISO8859-1"))); response.setHeader("filename", fileName); workbook.write(response.getOutputStream()); } public CellStyle[] getTemplateStyles(Row row) { CellStyle [] styles = new CellStyle[row.getLastCellNum()]; for(int i=0;i<row.getLastCellNum();i++) { styles[i] = row.getCell(i).getCellStyle(); } return styles; } }
package com.ihrm.common.poi; import com.ihrm.domain.poi.ExcelAttribute; import org.apache.poi.hssf.usermodel.*; import org.apache.poi.poifs.filesystem.POIFSFileSystem; import org.apache.poi.ss.format.CellFormat; import org.apache.poi.ss.usermodel.Cell; import org.apache.poi.ss.usermodel.DateUtil; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import java.io.FileInputStream; import java.io.InputStream; import java.lang.reflect.Field; import java.math.BigDecimal; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; public class ExcelImportUtil<T> { private Class clazz; private Field fields[]; public ExcelImportUtil(Class clazz) { this.clazz = clazz; fields = clazz.getDeclaredFields(); } /** * 基于注解读取excel */ public List<T> readExcel(InputStream is, int rowIndex,int cellIndex) { List<T> list = new ArrayList<T>(); T entity = null; try { XSSFWorkbook workbook = new XSSFWorkbook(is); Sheet sheet = workbook.getSheetAt(0); // 不准确 int rowLength = sheet.getLastRowNum(); System.out.println(sheet.getLastRowNum()); for (int rowNum = rowIndex; rowNum <= sheet.getLastRowNum(); rowNum++) { Row row = sheet.getRow(rowNum); entity = (T) clazz.newInstance(); System.out.println(row.getLastCellNum()); for (int j = cellIndex; j < row.getLastCellNum(); j++) { Cell cell = row.getCell(j); for (Field field : fields) { if(field.isAnnotationPresent(ExcelAttribute.class)){ field.setAccessible(true); ExcelAttribute ea = field.getAnnotation(ExcelAttribute.class); if(j == ea.sort()) { field.set(entity, covertAttrType(field, cell)); } } } } list.add(entity); } } catch (Exception e) { e.printStackTrace(); } return list; } /** * 类型转换 将cell 单元格格式转为 字段类型 */ private Object covertAttrType(Field field, Cell cell) throws Exception { String fieldType = field.getType().getSimpleName(); if ("String".equals(fieldType)) { return getValue(cell); }else if ("Date".equals(fieldType)) { return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").parse(getValue(cell)) ; }else if ("int".equals(fieldType) || "Integer".equals(fieldType)) { return Integer.parseInt(getValue(cell)); }else if ("double".equals(fieldType) || "Double".equals(fieldType)) { return Double.parseDouble(getValue(cell)); }else { return null; } } /** * 格式转为String * @param cell * @return */ public String getValue(Cell cell) { if (cell == null) { return ""; } switch (cell.getCellType()) { case STRING: return cell.getRichStringCellValue().getString().trim(); case NUMERIC: if (DateUtil.isCellDateFormatted(cell)) { Date dt = DateUtil.getJavaDate(cell.getNumericCellValue()); return new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(dt); } else { // 防止数值变成科学计数法 String strCell = ""; Double num = cell.getNumericCellValue(); BigDecimal bd = new BigDecimal(num.toString()); if (bd != null) { strCell = bd.toPlainString(); } // 去除 浮点型 自动加的 .0 if (strCell.endsWith(".0")) { strCell = strCell.substring(0, strCell.indexOf(".")); } return strCell; } case BOOLEAN: return String.valueOf(cell.getBooleanCellValue()); default: return ""; } } }
package com.ihrm.common.utils; import org.apache.poi.ss.usermodel.Workbook; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.UnsupportedEncodingException; import java.net.URLEncoder; public class DownloadUtils { public void download(ByteArrayOutputStream byteArrayOutputStream, HttpServletResponse response, String returnName) throws IOException { response.setContentType("application/octet-stream"); returnName = response.encodeURL(new String(returnName.getBytes(),"iso8859-1")); //保存的文件名,必须和页面编码一致,否则乱码 response.addHeader("content-disposition","attachment;filename=" + returnName); response.setContentLength(byteArrayOutputStream.size()); ServletOutputStream outputstream = response.getOutputStream(); //取得输出流 byteArrayOutputStream.writeTo(outputstream); //写到输出流 byteArrayOutputStream.close(); //关闭 outputstream.flush(); //刷数据 } }
@RequestMapping(value = "/export/{month}", method = RequestMethod.GET) public void export(@PathVariable String month) throws Exception { //1.获取报表数据 List<EmployeeReportResult> list = userCompanyPersonalService.findByReport(companyId,month); //2.构造Excel //创建工作簿 //SXSSFWorkbook : 百万数据报表 //Workbook wb = new XSSFWorkbook(); SXSSFWorkbook wb = new SXSSFWorkbook(100); //阈值,内存中的对象数量最大数量 //构造sheet Sheet sheet = wb.createSheet(); //创建行 //标题 String [] titles = "编号,姓名,手机,最高学历,国家地区,护照号,籍贯,生日,属相,入职时间,离职类型,离职原因,离职时间".split(","); //处理标题 Resource resource = new ClassPathResource("excel-template/hr-demo.xlsx"); Row row = sheet.createRow(0); int titleIndex=0; for (String title : titles) { Cell cell = row.createCell(titleIndex++); cell.setCellValue(title); } int rowIndex = 1; Cell cell=null; for(int i=0;i<10000;i++){ for (EmployeeReportResult employeeReportResult : list) { row = sheet.createRow(rowIndex++); // 编号, cell = row.createCell(0); cell.setCellValue(employeeReportResult.getUserId()); // 姓名, cell = row.createCell(1); cell.setCellValue(employeeReportResult.getUsername()); // 手机, cell = row.createCell(2); cell.setCellValue(employeeReportResult.getMobile()); // 最高学历, cell = row.createCell(3); cell.setCellValue(employeeReportResult.getTheHighestDegreeOfEducation()); // 国家地区, cell = row.createCell(4); cell.setCellValue(employeeReportResult.getNationalArea()); // 护照号, cell = row.createCell(5); cell.setCellValue(employeeReportResult.getPassportNo()); // 籍贯, cell = row.createCell(6); cell.setCellValue(employeeReportResult.getNativePlace()); // 生日, cell = row.createCell(7); cell.setCellValue(employeeReportResult.getBirthday()); // 属相, cell = row.createCell(8); cell.setCellValue(employeeReportResult.getZodiac()); // 入职时间, cell = row.createCell(9); cell.setCellValue(employeeReportResult.getTimeOfEntry()); // 离职类型, cell = row.createCell(10); cell.setCellValue(employeeReportResult.getTypeOfTurnover()); // 离职原因, cell = row.createCell(11); cell.setCellValue(employeeReportResult.getReasonsForLeaving()); // 离职时间 cell = row.createCell(12); cell.setCellValue(employeeReportResult.getResignationTime()); } } //3.完成下载 ByteArrayOutputStream os = new ByteArrayOutputStream(); wb.write(os); new DownloadUtils().download(os,response,month+"人事报表.xlsx"); } /** * 采用模板打印的形式完成报表生成 * 模板 * 参数: * 年月-月(2018-02%) * * sxssf对象不支持模板打印 */ // @RequestMapping(value = "/export/{month}", method = RequestMethod.GET) // public void export(@PathVariable String month) throws Exception { // //1.获取报表数据 // List<EmployeeReportResult> list = userCompanyPersonalService.findByReport(companyId,month); // // //2.加载模板 // Resource resource = new ClassPathResource("excel-template/hr-demo.xlsx"); // FileInputStream fis = new FileInputStream(resource.getFile()); // // //3.通过工具类完成下载 //// new ExcelExportUtil(EmployeeReportResult.class,2,2). //// export(response,fis,list,month+"人事报表.xlsx"); // // // //3.根据模板创建工作簿 // Workbook wb = new XSSFWorkbook(fis); // //4.读取工作表 // Sheet sheet = wb.getSheetAt(0); // //5.抽取公共样式 // Row row = sheet.getRow(2); // CellStyle styles [] = new CellStyle[row.getLastCellNum()]; // for(int i=0;i<row.getLastCellNum();i++) { // Cell cell = row.getCell(i); // styles[i] = cell.getCellStyle(); // } // //6.构造单元格 // int rowIndex = 2; // Cell cell=null; // for(int i=0;i<10000;i++) { // for (EmployeeReportResult employeeReportResult : list) { // row = sheet.createRow(rowIndex++); // // 编号, // cell = row.createCell(0); // cell.setCellValue(employeeReportResult.getUserId()); // cell.setCellStyle(styles[0]); // // 姓名, // cell = row.createCell(1); // cell.setCellValue(employeeReportResult.getUsername()); // cell.setCellStyle(styles[1]); // // 手机, // cell = row.createCell(2); // cell.setCellValue(employeeReportResult.getMobile()); // cell.setCellStyle(styles[2]); // // 最高学历, // cell = row.createCell(3); // cell.setCellValue(employeeReportResult.getTheHighestDegreeOfEducation()); // cell.setCellStyle(styles[3]); // // 国家地区, // cell = row.createCell(4); // cell.setCellValue(employeeReportResult.getNationalArea()); // cell.setCellStyle(styles[4]); // // 护照号, // cell = row.createCell(5); // cell.setCellValue(employeeReportResult.getPassportNo()); // cell.setCellStyle(styles[5]); // // 籍贯, // cell = row.createCell(6); // cell.setCellValue(employeeReportResult.getNativePlace()); // cell.setCellStyle(styles[6]); // // 生日, // cell = row.createCell(7); // cell.setCellValue(employeeReportResult.getBirthday()); // cell.setCellStyle(styles[7]); // // 属相, // cell = row.createCell(8); // cell.setCellValue(employeeReportResult.getZodiac()); // cell.setCellStyle(styles[8]); // // 入职时间, // cell = row.createCell(9); // cell.setCellValue(employeeReportResult.getTimeOfEntry()); // cell.setCellStyle(styles[9]); // // 离职类型, // cell = row.createCell(10); // cell.setCellValue(employeeReportResult.getTypeOfTurnover()); // cell.setCellStyle(styles[10]); // // 离职原因, // cell = row.createCell(11); // cell.setCellValue(employeeReportResult.getReasonsForLeaving()); // cell.setCellStyle(styles[11]); // // 离职时间 // cell = row.createCell(12); // cell.setCellValue(employeeReportResult.getResignationTime()); // cell.setCellStyle(styles[12]); // } // } // //7.下载 // //3.完成下载 // ByteArrayOutputStream os = new ByteArrayOutputStream(); // wb.write(os); // new DownloadUtils().download(os,response,month+"人事报表.xlsx"); // } }