Java 工具类之基于 POI 导出 Excel

在平时的Web项目开发中,经常会用到Excel导出功能,在此将其总结为一个简单的工具类,以供平常使用

/**
 * Created with Intellij IDEA.
 *
 * @author potoyang
 * Create: 2018/8/29 10:16
 * Modified By:
 * Description: 依赖于poi构建的excel表格导出工具类
 * <!-- poi -->
 * <dependency>
 * <groupId>org.apache.poi</groupId>
 * <artifactId>poi-ooxml</artifactId>
 * <version>3.10-FINAL</version>
 * </dependency>
 */
public class ExcelExportUtil<T> {
    private Class<T> clazz;

    public ExcelExportUtil(Class<T> clazz) {
        this.clazz = clazz;
    }

    /**
     * 直接在浏览器输出excel表格
     *
     * @param excelName 导出excel名称
     * @param titles    导出excel的表头
     * @param data      导出excel中的数据
     * @param response  请求输出流
     * @return 是否成功
     */
    public String getExcel(String excelName, String[] titles, List<T> data, HttpServletResponse response) {
        try {
            response.setContentType("application/x-xls;charset=UTF-8");
            Long milliSecond = LocalDateTime.now().toInstant(ZoneOffset.of("+8")).toEpochMilli();
            String fileName = excelName + "-" + milliSecond + ".xls";
            fileName = MimeUtility.encodeText(URLEncoder.encode(fileName, "UTF-8"), "UTF-8", "B");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName);
            ServletOutputStream outputStream = response.getOutputStream();
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet hssfSheet = workbook.createSheet("sheet1");
            HSSFRow hssfRow = hssfSheet.createRow(0);
            HSSFCellStyle hssfCellStyle = workbook.createCellStyle();
            hssfCellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);

            HSSFCell hssfCell;
            for (int i = 0; i < titles.length; i++) {
                hssfCell = hssfRow.createCell(i);
                hssfCell.setCellValue(titles[i]);
                hssfCell.setCellStyle(hssfCellStyle);
            }

            // 获取需要写入的数据
            for (int i = 0; i < data.size(); i++) {
                hssfRow = hssfSheet.createRow(i + 1);

                T t = data.get(i);
                boolean flag = false;

                Field[] fields = clazz.getDeclaredFields();
                for (int j = 0; j < fields.length; j++) {
                    String fieldName = fields[j].getName();
                    if ("serialVersionUID".equals(fieldName)) {
                        flag = true;
                        continue;
                    }
                    // 类中需要有类成员的get方法
                    Method method = clazz.getMethod("get" + change(fieldName), (Class<?>[]) null);
                    Object obj = method.invoke(t, (Object[]) null);
                    if (flag) {
                        hssfRow.createCell(j - 1).setCellValue(String.valueOf(obj));
                    } else {
                        hssfRow.createCell(j).setCellValue(String.valueOf(obj));
                    }
                }
            }

            // 输出文件到浏览器
            try {
                workbook.write(outputStream);
                outputStream.flush();
                outputStream.close();
                return "success";
            } catch (Exception e) {
                e.printStackTrace();
                return e.getMessage();
            }
        } catch (Exception e) {
            e.printStackTrace();
            return e.getMessage();
        }
    }

    /**
     * @param src 源字符串
     * @return 字符串,将src的第一个字母转换为大写,src为空时返回null
     */
    private String change(String src) {
        if (src != null) {
            StringBuilder stringBuilder = new StringBuilder(src);
            stringBuilder.setCharAt(0, Character.toUpperCase(stringBuilder.charAt(0)));
            return stringBuilder.toString();
        } else {
            return null;
        }
    }
}

不定时更新,见Github:ExcelExportUtil.java

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值