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

javaweb项目基于poi的excel导出功能实现

程序员文章站 2022-03-15 15:03:44
...

javaweb项目基于poi的excel导出功能实现

1.js页面请求

<script type="text/javascript">
$("a[name='exportBtn']").click(function(){
    $.confirm({
        title : '提示:',
        content : '确定导出信息到EXCEL?',
        buttons : {
            '确定' : function() {
                location.href='admin/exportExcelAction/exportExcel.do;
            },
            '取消' : function() {
                $.alert({title:"提示:",content:"取消操作!"});
            }
        }
    });
});
</script>

注意:
1.ajax获取不到返回的文件,ajax只能接受文本内容
2.如果想使用ajax请求,请尝试返回excel的文件名,然后ajax回调成功后js执行

2.action层

@ResponseBody
@RequestMapping("exportExcel")
public void exportExcel(HttpServletRequest request, HttpServletResponse response) throws IOException {
    //对每一个页面展示数据进行日志记录
    ServletContext application = request.getSession().getServletContext();
    Object dicMap = application.getAttribute("dictionaryMap");
    JSONObject dictionaryMap = JSONObject.fromObject(dicMap);

    String fileName = df.format(dt) + "信息";
    String columnNames[];
    String keys[];

    // 列名
    columnNames = new String[] { "AA", "BB", "CC", "DD" };
    // map中的key
    keys = new String[] { "A", "B", "C", "D" };

    List<Contract> datalist = new ArrayList<data>();

    Expression expr = Expr.isNotNull("id");

    dataList = dataService.getObjListByExpression(expr);

    List<Map<String, Object>> list = createExcelRecord(dataList , dictionaryMap);

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    try {
        exportToExcelService.createWorkBookNew(list, keys, columnNames).write(os);
    } catch (IOException e) {
        e.printStackTrace();
    }
    byte[] content = os.toByteArray();
    InputStream is = new ByteArrayInputStream(content);
    // 设置response参数,可以打开下载页面
    response.reset();
    response.setContentType("application/vnd.ms-excel;charset=utf-8");
    response.setHeader("Content-Disposition",
            "attachment;filename=" + new String((fileName + ".xlsx").getBytes(), "iso-8859-1"));
    ServletOutputStream out = response.getOutputStream();
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
        bis = new BufferedInputStream(is);
        bos = new BufferedOutputStream(out);
        byte[] buff = new byte[2048];
        int bytesRead;
        while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
            bos.write(buff, 0, bytesRead);
        }
    } catch (final IOException e) {
        throw e;
    } finally {
        if (bis != null)
            bis.close();
        if (bos != null)
            bos.close();
    }
}

createExcelRecord方法的代码

private List<Map<String, Object>> createExcelRecord(List<Contract> contractList, JSONObject dictionaryMap) {
        JSONArray type = dictionaryMap.getJSONArray("use_type");

        List<Map<String, Object>> listMap = new ArrayList<Map<String, Object>>();
        Map<String, Object> map = new HashMap<String, Object>();
        String sheetName = df.format(dt) + "信息";
        map.put("sheetName", sheetName);
        listMap.add(map);
        Contract contract = null;
        for (int j = 0; j < contractList.size(); j++) {
            contract = dataList.get(j);
            Map<String, Object> mapValue = new HashMap<String, Object>();
            try {
                mapValue.put("A", dataList.getA());
                mapValue.put("B", dataList.getB());
                mapValue.put("C", dataList.getC());
                mapValue.put("D", dataList.getD());
            } catch (Exception e) {
                e.printStackTrace();
            }
            listMap.add(mapValue);
        }
        return listMap;
    }

3.核心代码

基于poi的导出,因为项目需要导出大批量的数据(万级),所以使用了SXSSFWorkbook

/**
* 创建excel文档 --处理大数据
 * @param list--数据
 * @param keys--list中map的key数组集合
 * @param columnNames--excel的列名
 * 
 * */
public SXSSFWorkbook createWorkBookNew(List<Map<String, Object>> list, String[] keys, String columnNames[]) {
    // long startTime = System.currentTimeMillis();
    // 创建excel工作簿
    SXSSFWorkbook sxssfWb = new SXSSFWorkbook(10000);//内存中保留10000 条数据,以免内存溢出,其余写入 硬盘 
    // 创建第一个sheet(页),并命名
    Sheet sheet = sxssfWb.createSheet(list.get(0).get("sheetName").toString());
    // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
    for (int i = 0; i < keys.length; i++) {
        sheet.setColumnWidth(i, (short) (35.7 * 150));
    }

    // 创建第一行
    Row row = sheet.createRow(0);

    // 创建两种单元格格式
    CellStyle cs = sxssfWb.createCellStyle();
    CellStyle cs2 = sxssfWb.createCellStyle();

    // 创建两种字体
    Font f = sxssfWb.createFont();
    Font f2 = sxssfWb.createFont();

    // 创建第一种字体样式(用于列名)
    f.setFontHeightInPoints((short) 12);//设置字体大小
    f.setColor(IndexedColors.BLACK.getIndex());
    f.setBoldweight(Font.BOLDWEIGHT_BOLD);//设置字体 粗体

    // 创建第二种字体样式(用于值)
    f2.setFontHeightInPoints((short) 10);
    f2.setColor(IndexedColors.BLACK.getIndex());

    // Font f3=sxssfWb.createFont();
    // f3.setFontHeightInPoints((short) 10);
    // f3.setColor(IndexedColors.RED.getIndex());

    // 设置第一种单元格的样式(用于列名)
    cs.setFont(f);
    cs.setBorderLeft(CellStyle.BORDER_THIN);
    cs.setBorderRight(CellStyle.BORDER_THIN);
    cs.setBorderTop(CellStyle.BORDER_THIN);
    cs.setBorderBottom(CellStyle.BORDER_THIN);
    cs.setAlignment(CellStyle.ALIGN_CENTER);

    // 设置第二种单元格的样式(用于值)
    cs2.setFont(f2);
    cs2.setBorderLeft(CellStyle.BORDER_THIN);
    cs2.setBorderRight(CellStyle.BORDER_THIN);
    cs2.setBorderTop(CellStyle.BORDER_THIN);
    cs2.setBorderBottom(CellStyle.BORDER_THIN);
    cs2.setAlignment(CellStyle.ALIGN_CENTER);
    // 设置列名
    for (int i = 0; i < columnNames.length; i++) {
        Cell cell = row.createCell(i);
        cell.setCellValue(columnNames[i]);
        cell.setCellStyle(cs);
    }
    // 设置每行每列的值
    for (int i = 1; i < list.size(); i++) {
        // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
        // 创建一行,在页sheet上
        Row row1 = sheet.createRow(i);
        // 在row行上创建一个方格
        for (int j = 0; j < keys.length; j++) {
            Cell cell = row1.createCell(j);
            cell.setCellValue(list.get(i).get(keys[j]) == null ? " " : list.get(i).get(keys[j]).toString());
            cell.setCellStyle(cs2);
        }
    }
//      long endTime = System.currentTimeMillis();    //获取结束时间
//      System.out.println("大数据方法:运行时间:" + (endTime - startTime) + "ms");    //输出程序运行时间
    return sxssfWb;
}