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();
for(int i=;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行开始,第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=;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;
}
}