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;












免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM