现在很多的后台数据都需要进行收集,一般都可以直接导出,公司后台也需要数据导出,相关技术也比较多,公司使用的apache.poi。
需要的jar包
<!--Excel表导出依赖-->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.17</version>
</dependency>
操作Excel的类主要是HSSFWorkbook,初始化一个HSSFWorkbook的类来操作Excel。
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet();
// 设置表格默认列宽度
sheet.setDefaultColumnWidth((short) 18);
生成Excel头部
//创建一行,Excel是0为第一行
HSSFRow row = sheet.createRow(0);
//设置Excel头部
String headers = {'用户id','用户姓名','用户年龄','用户性别'}
for (short i = 0; i < headers.length; i++) {
//获取第一行的第i列
HSSFCell cell = row.createCell(i);
//把头部数组信息转为HSSFRichTextString 对象存到对应的列中
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
生成Excel内容
//遍历集合数据,产生数据行
for (int index = 0; index < users.size(); index++) {
//依次创建行
row = sheet.createRow(index+1);
User t = users.get(index);
//设置字体
HSSFFont font3 = workbook.createFont();
richString.applyFont(font3);
//把信息设置到对应的列
HSSFCell cell = row.createCell(0);
HSSFRichTextString userId = new HSSFRichTextString(user.getId());
cell.setCellValue(userId);
HSSFCell cell1 = row.createCell(1);
HSSFRichTextString name = new HSSFRichTextString(user.getName());
cell1.setCellValue(name);
HSSFCell cell2 = row.createCell(2);
HSSFRichTextString age = new HSSFRichTextString(user.getAge());
cell2.setCellValue(age);
HSSFCell cell3 = row.createCell(3);
HSSFRichTextString sex = new HSSFRichTextString(user.getSex());
cell3.setCellValue(sex);
}
此刻一个用户的信息Excel就生成了,把Excel导出
response.setContentType("application/octet-stream");
//默认Excel名称
response.setHeader("Content-disposition", "attachment;filename=" + header + "Excel.xls");
response.flushBuffer();
workbook.write(response.getOutputStream());
这就是一个简单的Excel生成与导出,但是我们的项目中需要导出的表格太多,每个类都需要写一个导出方法太麻烦,因此我们使用反射根据类的字段生成对应内容,这样就达到了通用的目的,以下是我们的代码,也可以根据具体你们的实际情况定制。
/**
* Created by Administrator on 2018-03-12.
* excel导出工具类
*/
public class ExcelUtil {
public static Map<String, String[]> excelHeaders = new HashMap<>();
static {
excelHeaders.put(ConstantUtil.EXPORT_USER, new String[]{"姓名", "性别", "手机号","归属地", "生日", "用户类型", "创建时间", "公司员工", "用户状态", "允许登录后台","邀请码"});
excelHeaders.put(ConstantUtil.EXPORT_TASK, new String[]{"任务标题", "任务内容", "品牌", "奖金", "需求数", "任务类型", "创建人", "创建时间", "截止时间", "验证情况", "进度","已收集线索", "参与人数"});
excelHeaders.put(ConstantUtil.EXPORT_CLUE, new String[]{"线索ID","产品", "品牌", "数量", "地址", "商店名", "商店类型","任务", "发现时间", "创建人", "创建人电话", "创建时间", "验证情况"});
excelHeaders.put(ConstantUtil.EXPORT_BRAND, new String[]{"品牌名", "品牌英文名", "所属企业", "创建人", "创建时间", "更新人", "更新时间", "验证情况"})
}
public static void exportExcel(HttpServletResponse response, String header, List data) throws IOException {
String[] headers = excelHeaders.get(header);//导出的Excel头部
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet();
// 设置表格默认列宽度
sheet.setDefaultColumnWidth((short) 18);
HSSFRow row = sheet.createRow(0);
for (short i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
//遍历集合数据,产生数据行
for (int index = 0; index < data.size(); index++) {
row = sheet.createRow(index+1);
Object t = data.get(index);
//利用反射,根据javabean属性的先后顺序,动态调用getXxx()方法得到属性值
int column = 0;
Field[] fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
Field field = fields[i];
//不需要的类型去除
if (field.getGenericType().toString().equals("int") || field.getGenericType().toString().equals("class java.lang.Integer") || field.getGenericType().toString().equals("class java.util.Date")) {
continue;
}
String fieldName = field.getName();
//导出表中不需要id以及相应字段去除
if (fieldName.contains("Id") || fieldName.equals("creatorOfEnterprise")) {
continue;
}
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class tCls = t.getClass();
Method getMethod = tCls.getMethod(getMethodName,
new Class[]{});
Object value = getMethod.invoke(t, new Object[]{});
String textValue = "";
if (value != null) {
textValue += value;
}
HSSFCell cell = row.createCell(column);
HSSFRichTextString richString = new HSSFRichTextString(textValue);
HSSFFont font3 = workbook.createFont();
richString.applyFont(font3);
cell.setCellValue(richString);
column++;
} catch (Exception e) {
e.printStackTrace();
}
}
}
response.setContentType("application/octet-stream");
//默认Excel名称
response.setHeader("Content-disposition", "attachment;filename=" + header + "Excel.xls");
response.flushBuffer();
workbook.write(response.getOutputStream());
}
}