Springmvc和poi3.9导出excel并弹出下载框

Springmvc 和 poi3.9 用java程序从数据库导出数据到excel(在博客园的第一篇原创博客)

@RequestMapping(value = "/importexcel.htm", method = RequestMethod.GET)
    public ModelAndView _importExcel(HttpServletRequest request, HttpServletResponse response, Integer cId) throws Exception {

        // 获得要导出的数据集
        List<Map<String, Object>> list = d_ExchangeCodeService.selectExcelRecord(cId);

        // 创建excel工作簿
        Workbook wb = new HSSFWorkbook();
        // 创建第一个sheet(页),并命名
        Sheet sheet = wb.createSheet(list.get(0).get("NAME").toString());

        // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,n为列高的像素数。
        sheet.setColumnWidth((short) 0, (short) (35.7 * 150));
        sheet.setColumnWidth((short) 1, (short) (35.7 * 150));
        sheet.setColumnWidth((short) 2, (short) (35.7 * 150));
        sheet.setColumnWidth((short) 3, (short) (35.7 * 100));
        sheet.setColumnWidth((short) 4, (short) (35.7 * 250));
        sheet.setColumnWidth((short) 5, (short) (35.7 * 150));
        sheet.setColumnWidth((short) 6, (short) (35.7 * 150));

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

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

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

        // 创建第一种字体样式
        f.setFontHeightInPoints((short) 10);
        f.setColor(IndexedColors.RED.getIndex());
        f.setBoldweight(Font.BOLDWEIGHT_BOLD);

        // 创建第二种字体样式
        f2.setFontHeightInPoints((short) 10);
        f2.setColor(IndexedColors.BLACK.getIndex());
        f2.setBoldweight(Font.BOLDWEIGHT_BOLD);

        // 设置第一种单元格的样式
        cs.setFont(f);
        cs.setBorderLeft(CellStyle.BORDER_THIN);
        cs.setBorderRight(CellStyle.BORDER_THIN);
        cs.setBorderTop(CellStyle.BORDER_THIN);
        cs.setBorderBottom(CellStyle.BORDER_THIN);
        // cs.setDataFormat(df.getFormat("#,##0.0"));

        // 设置第二种单元格的样式
        cs2.setFont(f2);
        cs2.setBorderLeft(CellStyle.BORDER_THIN);
        cs2.setBorderRight(CellStyle.BORDER_THIN);
        cs2.setBorderTop(CellStyle.BORDER_THIN);
        cs2.setBorderBottom(CellStyle.BORDER_THIN);
        // cs2.setDataFormat(df.getFormat("text"));

        // 创建列(每行里的单元格)
        Cell cell = row.createCell(0);
        cell.setCellValue("用户名");
        cell.setCellStyle(cs);

        cell = row.createCell(1);
        cell.setCellValue("订单号");
        cell.setCellStyle(cs);

        cell = row.createCell(2);
        cell.setCellValue("兑换券序列号");
        cell.setCellStyle(cs);

        cell = row.createCell(3);
        cell.setCellValue("兑换券金额");
        cell.setCellStyle(cs);

        cell = row.createCell(4);
        cell.setCellValue("兑换券类型名称");
        cell.setCellStyle(cs);

        cell = row.createCell(5);
        cell.setCellValue("使用时间");
        cell.setCellStyle(cs);

        cell = row.createCell(6);
        cell.setCellValue("使用结束日期");
        cell.setCellStyle(cs);

        DateFormat df = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");

        for (short i = 0; i < list.size(); i++) {

            // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
            // 创建一行,在页sheet上
            row = sheet.createRow((short) i + 1);
            // 在row行上创建一个方格
            cell = row.createCell(0);
            cell.setCellValue(list.get(i).get("usr_UserID") == null ? "未使用" : list.get(i).get("usr_UserID").toString());
            cell.setCellStyle(cs2);

            cell = row.createCell(1);
            cell.setCellValue(list.get(i).get("ord_OrderID") == null ? "未使用" : list.get(i).get("ord_OrderID").toString());
            cell.setCellStyle(cs2);

            cell = row.createCell(2);
            cell.setCellValue(list.get(i).get("Account").toString());
            cell.setCellStyle(cs2);

            cell = row.createCell(3);
            cell.setCellValue(Double.parseDouble(list.get(i).get("Amount").toString()));
            cell.setCellStyle(cs2);

            cell = row.createCell(4);
            cell.setCellValue(list.get(i).get("NAME").toString());
            cell.setCellStyle(cs2);

            cell = row.createCell(5);
            cell.setCellValue(list.get(i).get("UsedTime") == null ? "未使用" : df.format(list.get(i).get("UsedTime")).toString());
            cell.setCellStyle(cs2);

            cell = row.createCell(6);
            cell.setCellValue(df.format(list.get(i).get("BlankOutTime")).toString());
            cell.setCellStyle(cs2);
        }

        ByteArrayOutputStream os = new ByteArrayOutputStream();

        try {
            wb.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((list.get(0).get("NAME").toString() + ".xls").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;

            // Simple read/write loop.
            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();
        }
        return null;

    }