导出excel报表

话不多说,上代码。

maven依赖

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.9</version>
</dependency>
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-excelant</artifactId>
    <version>3.9</version>
</dependency>
ExcelUtil类

public class ExcelExport {

    public static  SXSSFWorkbook buildExcel(  ExcelBean ev,List<Integer> widthList)throws Exception{
        int rowaccess = 100;//内存中缓存记录行数
        SXSSFWorkbook wb = new SXSSFWorkbook(rowaccess);
        //创建名称为ev.getSheetName()的sheet
        Sheet sh = wb.createSheet(ev.getSheetName());
        Row row0 = sh.createRow(0);
        Cell cell0 = row0.createCell(0);
        //社会第一个row的第一个cell  excel名称
        cell0.setCellValue(ev.getTitle());
        for (int i=0;i<widthList.size();i++){//设置excel每列宽度
            sh.setColumnWidth(i, widthList.get(i) * 256);
        }
        CellStyle style1 = wb.createCellStyle();//第一行样式
        CellStyle style = wb.createCellStyle();//第二行样式
        Font f  = wb.createFont();
        Font f1  = wb.createFont();
        f.setFontHeightInPoints((short) 14);//字号
        f1.setFontHeightInPoints((short) 15);//字号
        f.setBoldweight(Font.BOLDWEIGHT_NORMAL);//加粗
        f.setFontName("楷体");
        style.setFont(f);
        style.setWrapText(true);
        style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直
        style.setAlignment(CellStyle.ALIGN_CENTER);//字体垂直居中
        style1.setFont(f1);
        style1.setAlignment(CellStyle.ALIGN_CENTER);//字体左右居中
        CellRangeAddress region = new CellRangeAddress(0, 0, (short) 0, (short) (ev.getColumn().size()-1));
        sh.addMergedRegion(region);// 合并到rowTo行columnTo的区域
        //第一行字体样式----------------
        cell0.setCellStyle(style1);
        cell0.setCellValue(ev.getTitle());
        // 设置border
        style.setBorderLeft(CellStyle.BORDER_THIN);
        style.setBorderRight(CellStyle.BORDER_THIN);
        style.setBorderTop(CellStyle.BORDER_THIN);
        style.setBorderBottom(CellStyle.BORDER_THIN);
        style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());      // 填充颜色
        style.setFillPattern(CellStyle.SOLID_FOREGROUND);           // 填充方式
        //设置第二行数据名称
        Row row1 = sh.createRow(1);
        for (int i=0;i<ev.getColumn().size();i++){
            Cell cells = row1.createCell(i);
            cells.setCellValue(ev.getColumn().get(i));
            cells.setCellStyle(style);
        }
        //每个SHEET有 content.size()数据
        List<Map<String, Object>> content = ev.getContent();
        for(int rownum = 0; rownum < content.size(); rownum++) {
            Row row = sh.createRow(rownum + 2);
            //每行有ev.getDbcolumn().size()个CELL
            Map<String, Object> m11 = content.get(rownum);
            for(int cellnum = 0; cellnum < ev.getDbcolumn().size(); cellnum++) {
                Cell cell = row.createCell(cellnum);{
                    if(m11.get(ev.getDbcolumn().get(cellnum))!=null ){
                        cell.setCellValue(m11.get(ev.getDbcolumn().get(cellnum)).toString());
                    }else{
                        cell.setCellValue("");
                    }
                }
            }
            //每当行数达到设置的值就刷新数据到硬盘,以清理内存
            if(rownum%rowaccess == 0){
                ((SXSSFSheet)sh).flushRows();
            }
        }
        return wb;
    }
}
excel格式类
public class ExcelBean {

    /**
     * sheet名
     */
    private String sheetName;//sheet名

    /**
     * 标题
     */
    private String title;//标题

    /**
     * 列名集合
     */
    private List<String> column;//列名集合

    /**
     * 数据库列名
     */
    private List<String> dbcolumn;//数据库列名

    private List<Map<String,Object>> content;//内容

    public String getSheetName() {
        return sheetName;
    }

    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }

    public List<String> getColumn() {
        return column;
    }

    public void setColumn(List<String> column) {
        this.column = column;
    }

    public List<String> getDbcolumn() {
        return dbcolumn;
    }

    public void setDbcolumn(List<String> dbcolumn) {
        this.dbcolumn = dbcolumn;
    }

    public List<Map<String, Object>> getContent() {
        return content;
    }

    public void setContent(List<Map<String, Object>> content) {
        this.content = content;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public ExcelBean(String sheetName, String title, List<String> column, List<String> dbcolumn, List<Map<String, Object>> content) {
        this.sheetName = sheetName;
        this.title = title;
        this.column = column;
        this.dbcolumn = dbcolumn;
        this.content = content;
    }

    public ExcelBean() {
    }
}
方法调用
//获取导出数据
List<CoffeeOrderDomain> coffeeOrders = null;
try {
    coffeeOrders = statisticDao.exportOrder(startTime,endTime,status,devNo);
} catch (Exception e) {
    e.printStackTrace();
}
//数据库字段和列名一一对应
List<String> col = new ArrayList();
col.add("订单编号");
col.add("设备编号");
col.add("支付金额");
col.add("订单时间");
col.add("支付状态");
List<String> dbCol = new ArrayList();
dbCol.add("order_no");
dbCol.add("dev_no");
dbCol.add("price");
dbCol.add("gmt_create");
dbCol.add("status");
//生成报表sheet1
ExcelBean excel = new ExcelBean();
excel.setColumn(col);
excel.setDbcolumn(dbCol);
excel.setTitle("设置标题");
excel.setSheetName("设置工作表名称");
//生成数据
List<Map<String, Object>> content = new ArrayList<Map<String, Object>>();
for (int i = 0; i < coffeeOrders.size(); i++) {
    Map map = new HashMap();
    map.put("order_no", coffeeOrders.get(i).getOrderNo());
    map.put("dev_no", coffeeOrders.get(i).getDevNo());
    map.put("price", coffeeOrders.get(i).getPrice());
    map.put("gmt_create", DateUtils.getDateTimeFormat(coffeeOrders.get(i).getGmtCreate()));
    if(coffeeOrders.get(i).getStatus() == 1){
        map.put("status", "已支付");
    }
    if(coffeeOrders.get(i).getStatus() == 0){
        map.put("status", "未支付");
    }
    content.add(map);
}
excel.setContent(content);
//设置每列的列宽
List<Integer> widthList = new ArrayList<Integer>();
widthList.add(30);
widthList.add(15);
widthList.add(15);
widthList.add(25);
widthList.add(20);
SXSSFWorkbook workBook = null;
try {
    workBook = ExcelExport.buildExcel(excel,widthList);
} catch (Exception e) {
    logger.error("生成SXSSFWorkbook错误",e);
}
//写入流
OutputStream out = null;
try {
    out = response.getOutputStream();
    String fileName ="XXX.xlsx";
    response.setContentType("application/x-msdownload");
    //避免中文名称乱码
    response.setHeader("Content-Disposition", "attachment; filename="
            + URLEncoder.encode(fileName, "UTF-8"));
    workBook.write(out);
} catch (Exception e) {
    logger.error("向浏览器输出XSSFWorkbook错误",e);
} finally {
    try {
        out.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}
大家可以看到ExcelExport工具类中用的是SXSSFWorkbook并且设置的内存中缓存的记录为100有助于减少内存的消耗,但是报表导出确实非常耗内存。以前用的是HSSFWorkbook每次导出的时候就会内存溢出,用SXSSFWorkbook可以有效的减少内存的消耗,其实解决这个问题也很简单就是加大内存呗,但是架不住我们服务器就这么大啊,因为我们不止一个地方用到了导出报表并且项目共用一个数据库,我个人的解决方案是把导出报表自己起一个服务,占大一点的内存,导出的时候统一走这个服务,因为导出报表使用的次数相对于别的业务还是比较少的。如果有些小伙伴的服务器配置好可以挥霍内存的话,那就更好啦。
                                                                  ---------------一个搬砖的小菜鸡
 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值