package com.paic.pacz.core.salesmanage.util; import java.util.List; import org.apache.commons.beanutils.PropertyUtils; import org.apache.poi.xssf.usermodel.XSSFCell; import org.apache.poi.xssf.usermodel.XSSFRow; import org.apache.poi.xssf.usermodel.XSSFSheet; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.util.CollectionUtils; import com.paic.icore.fa.logging.Log; import com.paic.pacz.core.salesmanage.dto.ExportExcelDTO; import com.paic.pacz.core.salesmanage.dto.ExportExcelPropertyDTO; public class ExportExcelUtil{ /** 日志服务 */ private Log log; /** * 创建sheet * @param xssfWorkbook 工作簿 * @return */ private XSSFSheet createSheet(XSSFWorkbook xssfWorkbook){ XSSFSheet sheet=xssfWorkbook.createSheet(); log.trace("XSSFSheet 创建成功"); return sheet; } /** * 设置表头值 * @param sheet * @param haeders * @throws Exception */ private void setHaeder(XSSFSheet sheet,List<String> haeders){ // 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制short XSSFRow haederRow = sheet.createRow(0); for(int i=0;i<haeders.size();i++){ //创建表头的cell XSSFCell xssfCell=haederRow.createCell(i); //给表头的cell赋值 xssfCell.setCellValue(haeders.get(i)); } log.trace("Excel 表头信息设置成功"); } /** * 给Excel添加数据 * @param datas 数据对象集合 * @param sheet * @param cellSize 每row的cell数 * @throws Exception */ private void setExeclCellValue(List<ExportExcelPropertyDTO> datas,XSSFSheet sheet,Integer cellSize)throws Exception{ //没有数据时终止生成数据 if(CollectionUtils.isEmpty(datas))return; int rowIndex=1;//数据行从第1行开始,第0行为表头 //循环给 每row的每cell赋值 for(ExportExcelPropertyDTO exportExcelPropertyDTO:datas){ XSSFRow dataRow=sheet.createRow(rowIndex); setCellVal(exportExcelPropertyDTO, dataRow, cellSize); rowIndex++; } //赋值完成 清空数据对象集合 datas.clear(); log.trace("Excel 数据添加成功"); } /** * 设置cell的值 * @param excelDTO 数据对象 * @param dataRow excel的行 * @param cellSize 每行的cell的数量 * @throws Exception */ private void setCellVal(ExportExcelPropertyDTO exportExcelPropertyDTO,XSSFRow dataRow,Integer cellSize)throws Exception{ for(int i=0;i<cellSize;i++){ //创建 cell XSSFCell cell=dataRow.createCell(i); //生成数据对象的属性(property) String property="porp"+i; //获取数据对象中对应属性(property)的值 Object val=null; try{ val=PropertyUtils.getProperty(exportExcelPropertyDTO, property); }catch(Exception e){ log.error("获取属性::"+property+" 的值出错!Message:::"+e.getMessage(), e); } if(!CommonUtil.isNull(val)){//值不为空时,赋值 if(val instanceof Double){ cell.setCellValue(Double.parseDouble(val.toString()));//统一转成String的数据 }else{ cell.setCellValue(val.toString());//统一转成String的数据 } }else{//值为空时,赋值"" cell.setCellValue(""); } } log.trace("每行设置值成功"); } /** * 导出Excel文件 * @param httpServletResponse * @param exportExcelDTO * @throws Exception */ public void exportExcel(XSSFWorkbook workbook,ExportExcelDTO exportExcelDTO) throws Exception{ //表头信息为空是终止导出数据 if(CollectionUtils.isEmpty(exportExcelDTO.getHeaders()))return; //创建sheet XSSFSheet sheet=createSheet(workbook); //设置表头信息 setHaeder(sheet, exportExcelDTO.getHeaders()); //获取每一行row的cell的数量 Integer cellSize=exportExcelDTO.getHeaders().size(); //给row的cell赋值 setExeclCellValue(exportExcelDTO.getExcelPropertyDTOs(), sheet,cellSize); } public Log getLog() { return log; } public void setLog(Log log) { this.log = log; } }