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;
}
}
以上所有逻辑,欢迎提出优化的点
上一篇: Linux初级:文件管理
下一篇: 安卓文件管理器打开指定目录
推荐阅读