java导出、下载EXCEL文件,后台实现

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.17</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.17</version>
</dependency>
//公共方法,创建Workbook 
public static Workbook createWorkBook(List<Map<String, Object>> list, String[] keys,
        String columnNames[]) {
    // 创建excel工作簿
    Workbook wb = new HSSFWorkbook();
    // 创建第一个sheet(页),并命名
    Sheet sheet = wb.createSheet("sheet1");
    // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
    for (int i = 0; i < keys.length; i++) {
        sheet.setColumnWidth((short) i, (short) (35.7 * 200));
    }

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

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

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

    // 创建第一种字体样式(用于列名)
    f.setFontHeightInPoints((short) 10);
    f.setColor(IndexedColors.BLACK.getIndex());

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

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

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

    // 设置第二种单元格的样式(用于值)
    cs2.setFont(f2);
    cs2.setBorderLeft(BorderStyle.THIN);
    cs2.setBorderRight(BorderStyle.THIN);
    cs2.setBorderTop(BorderStyle.THIN);
    cs2.setBorderBottom(BorderStyle.THIN);
    cs2.setAlignment(HorizontalAlignment.CENTER);
    //设置列名
    for (int i = 0; i < columnNames.length; i++) {
        Cell cell = row.createCell(i);
        cell.setCellValue(columnNames[i]);
        cell.setCellStyle(cs);
    }
    //设置每行每列的值
    for (short i = 0; i < list.size(); i++) {
        // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
        // 创建一行,在页sheet上
        Row row1 = sheet.createRow((short) i + 1);
        // 在row行上创建一个方格
        for (short j = 0; j < keys.length; j++) {
            Cell cell = row1.createCell(j);
            if (list.get(i).get(keys[j]) == null) {
                cell.setCellValue("");
            } else {
                if (Pattern.compile("[0-9]*").matcher(list.get(i).get(keys[j]).toString())
                        .matches()) {
                    cell.setCellValue(Double.valueOf(list.get(i).get(keys[j]).toString()));
                } else {
                    cell.setCellValue(list.get(i).get(keys[j]).toString());
                }
            }
            //                cell.setCellValue(list.get(i).get(keys[j]) == null?" ": list.get(i).get(keys[j]).toString());
            cell.setCellStyle(cs2);
        }
    }
    return wb;
}
@RequestMapping(value = "downLoadStatistics",
        produces = {"application/vnd.ms-excel;charset=UTF-8"})
public String downLoadStatistics(final String clearmonth, final HttpServletResponse response) {
ByteArrayOutputStream os = new ByteArrayOutputStream();
List statistics = this.xxservice.getdata();//map集合
String columnNames[] = {"AA", "BB", "CC", "DD"};//列名
String keys[] = {"SN", "DEPARTUREAIRPORT_ANS", "NUMB", "DIVISION"};//map中的key
ByteArrayOutputStream os = new ByteArrayOutputStream();
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
    ExcelUtil.createWorkBook(statistics, keys, columnNames).write(os);
    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 + ".xls").getBytes(), "iso-8859-1"));
    ServletOutputStream out = response.getOutputStream();
    bis = new BufferedInputStream(is);
    bos = new BufferedOutputStream(out);
    byte[] buff = new byte[2048];
    int bytesRead;
    // Simple read/write loop.
    while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
        bos.write(buff, 0, bytesRead);
    }
} catch (final IOException e) {
    e.printStackTrace();
} finally {
    if (bis != null) {
        try {
            bis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if (bos != null) {
        try {
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
return null;

}

猜你喜欢

转载自blog.csdn.net/qq_41782949/article/details/91801995