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

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;
}
好的,下面是利用POI导出Excel表格的步骤: 1.导入POI的jar包。 在Java工程中,需要将POI的jar包添加到工程中。 2.创建工作簿(Workbook)和工作表(Sheet)对象。 使用POI创建Excel表格的第一步是创建工作簿和工作表对象。 3.创建表头。 在Excel表格中,表头通常是第一行,我们需要将表头信息写入到该行中。 4.写入数据。 利用Java代码将需要导出的数据写入到Excel表格中。 5.设置单元格样式。 可以通过设置单元格样式来美化Excel表格。 6.保存Excel表格。 最后,将Excel表格保存到指定的位置。 下面是一个示例代码: ``` // 创建工作簿 Workbook wb = new HSSFWorkbook(); // 创建工作表 Sheet sheet = wb.createSheet("Sheet1"); // 创建表头 Row row = sheet.createRow(0); Cell cell = row.createCell(0); cell.setCellValue("姓名"); cell = row.createCell(1); cell.setCellValue("年龄"); // 写入数据 List<User> userList = getUserList(); for(int i = 0; i < userList.size(); i++){ User user = userList.get(i); row = sheet.createRow(i + 1); cell = row.createCell(0); cell.setCellValue(user.getName()); cell = row.createCell(1); cell.setCellValue(user.getAge()); } // 设置单元格样式 CellStyle style = wb.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); cell.setCellStyle(style); // 保存Excel表格 FileOutputStream fos = new FileOutputStream("user.xlsx"); wb.write(fos); fos.close(); ``` 以上是一个简单的POI导出Excel表格的示例代码,你可以根据具体需求进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值