zoukankan      html  css  js  c++  java
  • SpringMVC生成Excel下载

    SpringMVC controller里的方法:

    @RequestMapping(value="/notify/download",produces = {"application/vnd.ms-excel;charset=UTF-8"})
        public String download(HttpSession session,HttpServletResponse response){
            try {
                User user= (User) session.getAttribute("user");
                String queryParam="";
                if (!user.getRole().getName().equals("超级管理员")){
                    queryParam+=" and sbn.be_notified_user_id = "+user.getId();
                }
                List<Notify> notifyList=slDao.getNotifyList(queryParam,0,999999999);
                String fileName="纠错统计表";
                List<Map<String,Object>> list=createExcelRecord(notifyList);
                String columnNames[]={"发起纠错时间","纠错人","负责人","标准库名","纠错内容","纠错状态"};//列名
                String keys[]    =     {"time","notifyUser","beNotifiedUser","standardName","content","finish"};//map中的key
                ByteArrayOutputStream os = new ByteArrayOutputStream();
                try {
                    ExcelUtil.createWorkBook(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 + ".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();
                }
            }catch (Exception e){
    
            }
    
            return null;
        }

    所调用的createExcelRecord方法

    private List<Map<String, Object>> createExcelRecord(List<Notify> notifyList) {
            List<Map<String, Object>> listmap = new ArrayList<Map<String, Object>>();
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("sheetName", "sheet1");
            listmap.add(map);
            for (int j = 0; j < notifyList.size(); j++) {
                Notify notify=notifyList.get(j);
                Map<String, Object> mapValue = new HashMap<String, Object>();
                mapValue.put("time", notify.getTime());
                mapValue.put("notifyUser",notify.getNotifyUserNickname());
                mapValue.put("beNotifiedUser",notify.getBeNotifiedUserNickname());
                mapValue.put("standardName",notify.getStandardName());
                mapValue.put("content",notify.getContent());
                String finish=notify.getFinishFlag()+"";
                if (finish.equals("0")) finish="已纠错";
                else finish="未纠错";
                mapValue.put("finish",finish);
                listmap.add(mapValue);
            }
            return listmap;
        }

    所调用的ExcelUtil

    public class ExcelUtil {
        /**
         * 创建excel文档,
         *  list 数据
         * @param keys list中map的key数组集合
         * @param columnNames excel的列名
         * */
        public static Workbook createWorkBook(List<Map<String, Object>> list, String []keys, String columnNames[]) {
            // 创建excel工作簿
            Workbook wb = new HSSFWorkbook();
            // 创建第一个sheet(页),并命名
            Sheet sheet = wb.createSheet(list.get(0).get("sheetName").toString());
            // 手动设置列宽。第一个参数表示要为第几列设;,第二个参数表示列的宽度,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());
            f.setBoldweight(Font.BOLDWEIGHT_BOLD);
    
            // 创建第二种字体样式(用于值)
            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(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 (short i = 1; i < list.size(); i++) {
                // Row 行,Cell 方格 , Row 和 Cell 都是从0开始计数的
                // 创建一行,在页sheet上
                Row row1 = sheet.createRow((short) i);
                // 在row行上创建一个方格
                for(short 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);
                }
            }
            return wb;
        }
    }

    所需要引用的maven包:

    <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.15</version>
            </dependency>
  • 相关阅读:
    HDU2586 How far away?(tarjan的LCA)
    You Raise Me Up
    POJ2891 Strange Way to Express Integers(中国剩余定理)
    POJ2142 The Balance(扩展欧几里得)
    HDU 1166模仿大牛写的线段树
    NetWord Dinic
    HDU 1754 线段树裸题
    hdu1394 Minimum Inversion Number
    hdu2795 Billboard
    【完全版】线段树
  • 原文地址:https://www.cnblogs.com/blog5277/p/6065601.html
Copyright © 2011-2022 走看看