欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Excle 报表导出得一点心得

程序员文章站 2022-07-14 10:20:29
...
   Excle 导出 有很多现有得集成API,例如 easypoi,非常好用,尤其是使用 模板语法,简直是爽的不要不要的。如果 不想使用模板呢 ? 那就得自己使用原生得poi来操作了。
   我这里介绍一种比较简单得方式,没有合并单元格。优点:1.数据填充灵活  2. 对于列 控制简单 ; 缺点:1. 列明设置有点傻 ,有待优化。
 逻辑主要分三步:1.设置设置实体类(注意,实体类字段要和导出得列明一一对应)2. 组织数据为list<xxxVO>  3.填充数据  4.导出
直接上代码
实体类

public class CustomermanagerVo{
/**
* 姓名
/
private String username;
/
*
* 内勤工号
/
private String usercode;
/
*
* 营销工号
*/
private String salecode;

/**
 *  二级机构
 */
private String secondcom;
/**
 * 三级机构
 */
private String thirdcom;
/**
 * 四级团队
 */
private String fourcom;
/**
 * 岗位性质
 */
private String positionname;
/**
 * 角色
 */
private String usertype;
/**
 * 在/离职
 */
private String userstatus;
/**
   *  累计储备客户数
 */
private Integer allCustomerNums;
/**
   *   新增储备客户数
 */
private Integer newInsertCustomerNums;
/**
 *  邀约客户数
 */
private Integer visitCustomerNums;
/**
 *   面谈客户数
 */
private Integer interviewerCustomerNums;
/**
 *   提交建议书客户数
 */
private Integer suggestCustomerNums;
/**
 *   成交客户数
 */
private Integer acieveCustomerNums;
/**
 * 数量
 */
private Integer sumnum;
//省略 get set
}
2.组织下载数据
List<CustomermanagerVo> list = //处理逻辑
3.声明下载项目
//声明下载项目
	 //列的名称
    List<String> colListName = new ArrayList<String>();
    colListName.add("姓名");
    colListName.add("内勤工号");
    colListName.add("营销工号");
    colListName.add("二级机构");
    colListName.add("三级机构");
    colListName.add("四级机构");
    colListName.add("岗位性质");
    colListName.add("角色");
    colListName.add("在/离职");
    colListName.add("客户数量");//合并单元格
    colListName.add("累计储备");
    colListName.add("新增储备");
    colListName.add("邀约");
    colListName.add("面谈");
    colListName.add("提交建议书");
    colListName.add("成交");
    
	//1.创建工作簿
    HSSFWorkbook workbook = new HSSFWorkbook();
    //2.创建工作表
    HSSFSheet sheet = workbook.createSheet("汇总");
    sheet.setDefaultColumnWidth(10);
    sheet.setColumnWidth(1, 16 * 256);
    for(int i=0;i<9;i++) {
    	CellRangeAddress c1= new CellRangeAddress(0,1,i,i);
    	sheet.addMergedRegion(c1);
    }
    CellRangeAddress c2= new CellRangeAddress(0,0,9,14);
    sheet.addMergedRegion(c2);
    //创建第一行
    HSSFRow row = sheet.createRow(0);
    
    HSSFCellStyle cellStyle = workbook.createCellStyle();
    cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
    for(int i=0;i<9;i++) {
    	HSSFCell cell = row.createCell(i);
    	cell.setCellValue(colListName.get(i));
    	cell.setCellStyle(cellStyle);
    }
    HSSFCell cell9 = row.createCell(9);
	cell9.setCellValue(colListName.get(9));
	cell9.setCellStyle(cellStyle);
    //创建第二行
    HSSFRow row1 = sheet.createRow(1);
    for(int i=0;i<6;i++) {
    	HSSFCell cell2 = row1.createCell(i+9);
    	cell2.setCellValue(colListName.get(i+10));
    	cell2.setCellStyle(cellStyle);
    }
    //填充数据
    if(userInfoList!=null) {
    	for(int i=0;i<userInfoList.size();i++) {
    		String[] arr = generateObjAttr(userInfoList.get(0));
    		int length = arr.length;
    		HSSFRow row2 = sheet.createRow(2+i);
    		CustomermanagerVo vo = userInfoList.get(i);
    		for (int j = 0; j < length; j++) {
				HSSFCell cell = row2.createCell(j);
				cell.setCellValue((String)generateAttrValue(arr[j],cla[j], vo));
			}
    	}
    }
    String fileName = "客户管理.xls";
	try {
		fileName = URLEncoder.encode(fileName, "UTF-8");
		response.setContentType("application/octet-stream");
		response.setHeader("Content-disposition", "attachment;filename=" + fileName);
		OutputStream fileOut = response.getOutputStream();
		workbook.write(fileOut);
		fileOut.flush();
		fileOut.close();
	} catch (Exception e) {
		e.printStackTrace();
	}
    4. 数据填充使用得两个方法
    public Class[] generateObjClass(Object obj) {
	List<Field> fieldList = new ArrayList<>() ;
	List<String> fieldNameList = new ArrayList<String>() ;
	Class tempClass = (Class) obj.getClass();
	while (tempClass != null) {//当父类为null的时候说明到达了最上层的父类(Object类).
	      fieldList.addAll(Arrays.asList(tempClass .getDeclaredFields()));
	      tempClass = tempClass.getSuperclass(); //得到父类,然后赋给自己
	}
	Class[] arr = new Class[fieldList.size()];
	for(int i=0;i<fieldList.size();i++) {
		Class<?> s = fieldList.get(i).getType();
		arr[i] = s;
	}
	return arr;
}
@Override
public Object generateAttrValue(String fieldName,Class<?> cla, Object obj) {
	try {
		String firstLetter = fieldName.substring(0, 1).toUpperCase();
		String getter = "get" + firstLetter + fieldName.substring(1);
		Method method = obj.getClass().getMethod(getter, new Class[] {});
		Object value = method.invoke(obj, new Object[] {});
		if (value == null) {
			value = "";
			return value;
		}
		if(cla == Integer.class || cla == Double.class ||cla == Float.class || cla == BigDecimal.class) {
			value = String.valueOf(value);
		}else if (cla == Date.class) {
			value = DateFormatUtil.format(DateFormatUtil.DATE_PATTERN_DAY, (Date)value);
		}else if (cla == Timestamp.class) {
			Timestamp timestamp = (Timestamp) value;
            DateFormat df = new SimpleDateFormat(DateFormatUtil.DATE_PATTERN_DEFAULT);
            value = df.format(timestamp);
		}
		return value;
	}catch (Exception e) {
		e.printStackTrace();
		return null;
	}
}
以上所有逻辑,欢迎提出优化的点
相关标签: Excle java