zoukankan      html  css  js  c++  java
  • Java导出Excel文件的两种方法


    将数据以Excel表格的形式导出:
    首先下载poi的jar包,导入项目中,或者使用maven仓库管理,在pom文件添加:
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.9</version>
    </dependency>

    前端代码:
    页面上定义下载/导出按钮,点击按钮时下载/导出,如:
    <button class="" id="exportDate" onclick="exportDate()">下载/导出</button>

    function exportDate(){
        var url="";    //路径
        window.open(url);
    }
    后端代码:
    Controller层:
    @RequestMapping(value="/exportDate",method=RequestMethod.GET)
    public void exportDate(需要接受的参数/条件,HttpServletResponse response) throws Exception{
        //如涉及权限/级别/条件等,先进行判断;
        //根据条件等查询要导出的数据
        List<Object> list = 查询要导出的数据;
        //可先判断要导出的数据的数量来确定使用HSSFWorkbook工具类或者SXSSFWorkbook工具类
        if(list.size()>60000){
            list = list.subList(0,60000);
        }
        //将数据放入HSSFWorkbook对象中
        HSSFWorkbook wb = xxxService.getWb(list);
        //大数据量时使用SXSSFWorkbook工具类
        //SXSSFWorkbook wb = xxxService.getWb(list);
        //定义导出的表名
        String fileName = URLEncoder.encode("表名"+".xls","UTF-8");
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        wb.write(os);
        if(os.size() > 0){
            response.setContentType("application/octet-stream");
            response.addHeader("Content-Disposition","attachment;filename="+fileName);
            response.addHeader("Content-Length",""+os.size());
            IOUtils.write(os.toByteArray(),response.getOutputStream());
            response.getOutputStream().flush();
        }
        os.close();
    }

    获取HSSFWorkbook/SXSSFWorkbook工具类对象的方法,可写在service层
    一、HSSFWorkbook工具类(导出.xls格式文件)
    HSSFWorkbook对象,最多支持65535行,适用一般数据量少导出
    //适用公共方法获取表单元格标题
    public HSSFWorkbook getWb(List<Object> list) throws Exception{
        //创建对象
        HSSFWorkbook wb = new HSSFWorkbook();
        //创建一个sheet
        HSSFSheet sheet = wb.createSheet("sheet名");
        //添加表头
        HSSFRow row = sheet.createRow((int)0);
        //单元格样式
        HSSFCellStyle style = wb.createCellStyle();
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        HSSFCell cell = row.createCell(0);
        //创建公共工具类对象
        Utils util = new Utils();
        //调用方法获得标题
        Map<String,String> map = util.getBeanComment("实体类路径");
        int i=0;
        for (String key : map.keySet()) {
            cell = row.createCell(i);
            cell.setCellValue(map.get(key));
            cell.setCellStyle(style);
            i++;
        }
        i=0;
        for (Object obj:list) {
            row = sheet.createRow((int) i + 1);
            int j=0;
            for (String key : map.keySet()) {
                cell=row.createCell(j);
                cell.setCellValue(BeanUtils.getProperty(obj,key));
                j++;
            }
            i ++ ;
        }
        return wb;
    }

    二、SXSSFWorkbook工具类(导出.xlsx格式文件,适用于数据量大的文件导出)
    SXSSFWorkbook对象,只支持.xlsx格式。它就是用来解决大数据量以及超大数据量的导入导出操作的,
    单个sheet表就支持近104万条数据了。要是导出104万以上的数据,这时我们必须拆分到多个工作表来实现。
    //以数组的方式手动定义表单元格标题和对应值
    public SXSSFWorkbook getWb(String sheetName,String[] title,String[][] values){
        //内存中只创建100个临时对象,超过100个将释放不用对象
        SXSSFWorkbook wb = new SXSSFWorkbook(100);
        //工作表对象
        Sheet sheet = null;
        //行对象
        Row row = null;
        //列对象
        Cell cell = null;
        int rowNo = 0;
        int pageRowNo = 0;
        //表单样式风格
        CellStyle style = wb.createCellStyle();
        style.setAlignment(CellStyle.ALIGN_CENTER);
        if(values != null && values.length>0){
            for(int j=0;j<values.length;j++){
                //超过一百万行后换一个工作薄,单个sheet最多1048576行
                if(rowNo%1000000 == 0){
                    sheet = wb.createSheet("第"+(rowNo/1000000+1)+"个工作薄");
                    sheet = wb.getSheetAt(rowNo/1000000);
                    pageRowNo = 0;
                }
                rowNo++;
                //创建标题
                if(pageRowNO == 0){
                    row = sheet.createRow(0);
                    for(int i=0;i<title.length;i++){
                        cell = row.createCell(i);                         
                        cell.setCellValue(title[i]);                      
                        cell.setCellStyle(style);
                        if(i==title.length-1){
                            sheet.setDefaultColumnWidth(20);
                        }
                    }
                }else{
                    //创建行
                    row = sheet.createRow(pageRowNo);
                    for(int k=0;k<values[j].length;k++){
                        // 创建列  
                        cell = row.createCell(k);
                        if(k == 0){
                            //对列进行赋值  
                            cell.setCellValue(Long.parseLong(values[j][k]));
                        }else{
                            if(numType(values[j][k])){
                                cell.setCellValue(Double.parseDouble(values[j][k]));
                            }else{
                                cell.setCellValue(String.valueOf(values[j][k]));
                            }
                        }
                        cell.setCellStyle(style);
                    }
                }
                pageRowNo++;
            }
        }
        return wb;
    }


    如果用一中公共工具类的getBeanComment()方法,如下:
    public Map<String,String> getBeanComment(String bean){
        Map<String,String> map = new HashMap<>();
        try{
            Class clz = Class.forName(bean);
            Field[] strsSub = clz.getDeclaredFields();
            Class clzSuper = Class.forName(bean).getSuperclass();
            List<Field> strs = new ArrayList<>();
            for(Field filed : strsSub){
                strs.add(filed);
            }
            if(null != clzSuper){
                Field[] StrsSuper = clzSuper.getDeclaredFields();
                for(Field field : StrsSuper){
                    strs.add(field);
                }
            }
            //StringBuffer sb = new StringBuffer();
            for(Field field : strs){
                Comment comment = field.getAnnotation(Comment.class);
                if(null == comment){
                    continue;
                }
                String name = field.getName();
                if("id".equals(name)){
                    continue;
                }
                if(StringUtils.isNotBlank(comment.value())){
                    map.put(name, comment.value());
                }
            }
            return map;
        }catch(ClassNotFoundException e) {
            e.printStackTrace();
            return null;
        }
    }


    注:
    可参考:https://blog.csdn.net/runzhisheng114/article/details/75303750;
            https://blog.csdn.net/u014621859/article/details/54944059;











  • 相关阅读:
    VS2010 配置驱动开发环境
    C函数调用与入栈顺序
    Ecshop后台流量分析地区分布的地名全是乱码
    使用.net程序发送邮件代码
    齐博系统出现此文件不可写:cache/label_cache/index_0_8_0_0_1_6539c.php
    UCHOME中链接前多了link.php?url=,如何去除
    discuz7.2 修改数据调用中日期格式
    php设置和获取cookie
    删除数据库所有存储过程的SQL语句
    docker搭建skywalking 8.7简明笔记 海口
  • 原文地址:https://www.cnblogs.com/Big-Boss/p/10002739.html
Copyright © 2011-2022 走看看