Java通用的Excel文件生成工具類,支持生成文件和瀏覽器直接下載

koel 9年前發布 | 9K 次閱讀 Java

java通用的Excel文件創建方法,支持同文件多tab頁創建。只需要調用靜態方法,傳遞List<String>表頭和List<Map>數據集合等,即可生成Excel文件。

package com.matols.utils;

import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map;

import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell; import org.apache.poi.hssf.usermodel.HSSFCellStyle; import org.apache.poi.hssf.usermodel.HSSFFont; import org.apache.poi.hssf.usermodel.HSSFRichTextString; import org.apache.poi.hssf.usermodel.HSSFRow; import org.apache.poi.hssf.usermodel.HSSFSheet; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.hssf.util.HSSFColor;

import com.google.common.collect.Lists;

/**

  • Excel工具類 */ public class ExcelUtils { public static void main(String[] args) throws Throwable {

     String path = "D:/tj/統計報表.xls";
     //表頭
     List<String> headers = Lists.newArrayList();
     for (int i = 1; i < 10; i++) {
         headers.add("表頭"+i);
     }
     //數據行
     List<Map> datas = new ArrayList<Map>();
     Map m = null;
     for(int i=1;i<10;i++){
         m = new HashMap(); //一行數據集
         for(int j=0;j<headers.size();j++){
             m.put(j, "第"+i+" 行數據:"+j);
         }
         datas.add(m);
     }
     ExpExs(path,"","統計報表",headers,datas);
    

    }

    /*

    • 通用的Excel文件創建方法
    • title:首行標題: 2015年度統計報表
    • sheets:sheet的tab標簽頁說明: 15年度報表
    • headers:表頭:List存放表頭 編號、姓名、備注
    • datas:數據行:list存放實體數據,map存放具體每一行數據,和headers對應。
    • rs:HttpServletResponse響應作用域,如果不為null,會直接將文件流輸出到客戶端,下載文件 */ public static void ExpExs(String title,String sheets,List headers,List<Map> datas,HttpServletResponse rs){ try { if(sheets== null || "".equals(sheets)){ sheets = "sheet"; }

      HSSFWorkbook workbook = new HSSFWorkbook(); HSSFSheet sheet = workbook.createSheet(sheets); //+workbook.getNumberOfSheets()

      HSSFRow row; HSSFCell cell;

      // 設置這些樣式 HSSFFont font = workbook.createFont(); font.setFontName(HSSFFont.FONT_ARIAL);//字體 font.setFontHeightInPoints((short) 16);//字號 font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗 //font.setColor(HSSFColor.BLUE.index);//顏色

      HSSFCellStyle cellStyle= workbook.createCellStyle(); //設置單元格樣式 cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index); cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND); cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER ); cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN); cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN); cellStyle.setFont(font);

      //產生表格標題行
      row = sheet.createRow(0); row.setHeightInPoints(20); for (int i = 0; i < headers.size(); i++) {

      HSSFRichTextString text = new HSSFRichTextString(headers.get(i).toString());  
      cell = row.createCell(i);
      cell.setCellValue(text); 
      cell.setCellStyle(cellStyle);
      

      }

        cellStyle= workbook.createCellStyle(); 
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cellStyle.setDataFormat((short)0x31);//設置顯示格式,避免點擊后變成科學計數法了
        //cellStyle.setWrapText(true);//設置自動換行
        Map map;
        //遍歷集合數據,產生數據行  
        for (int i=0; i <datas.size(); i++) { 
            row=sheet.createRow((i+1));
            row.setHeightInPoints(20);
            map = datas.get(i);

            for(int j=0;j<map.size();j++) {
                 cell = row.createCell(j);
                 cell.setCellStyle(cellStyle);

                 cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                 if(map.get(j) != null) {
                     cell.setCellValue(new HSSFRichTextString(map.get(j).toString())); 
                 }else{
                     cell.setCellValue(new HSSFRichTextString(""));     
                }
            }
        }   

        for (int i = 0; i < headers.size(); i++) { 
            sheet.autoSizeColumn((short)i);
        }

        rs.reset();
        rs.setContentType("multipart/form-data"); //自動識別
        rs.setHeader("Content-Disposition","attachment;filename=data.xls");
        //文件流輸出到rs里
        workbook.write(rs.getOutputStream());
        rs.getOutputStream().flush();
        rs.getOutputStream().close();
    } catch (Exception e) {  
        System.out.println("#Error ["+e.getMessage()+"] ");
    } 
    System.out.println("["+sheets+"] 創建成功...");
    System.out.println("");
}   


/*
 * 通用的Excel文件創建方法
 *    path:保存路徑: C:/xls/統計報表.xls
 *   title:首行標題: 2015年度統計報表
 *  sheets:sheet的tab標簽頁說明: 15年度報表
 * headers:表頭:List存放表頭  編號、姓名、備注
 *   datas:數據行:list存放實體數據,map存放具體每一行數據,和headers對應。
 */
public static void ExpExs(String path,String title,String sheets,List headers,List<Map> datas){
    try { 
        if(sheets== null || "".equals(sheets)){ sheets = "sheet"; }

        boolean isExist = new File(path).exists();
        if(!isExist){
            HSSFWorkbook workbook = new HSSFWorkbook();
            HSSFSheet sheet = workbook.createSheet(sheets);

            FileOutputStream out = new FileOutputStream(new File(path));
            workbook.write(out);
            out.flush();
            out.close();
        }
        FileInputStream file = new FileInputStream(new File(path));
        HSSFWorkbook workbook = new HSSFWorkbook(file);

        HSSFSheet sheet = null;
        if(!isExist){
            sheet = workbook.getSheetAt(0);
        }else{
            if(workbook.getSheet(sheets) == null){
                sheet = workbook.createSheet(sheets); //+workbook.getNumberOfSheets()
            }else{
                System.out.println("文件:["+path+"] ["+sheets+"] 已經存在...");
                System.out.println("");
                return;
            }
        }
        HSSFRow row;
        HSSFCell cell;

        // 設置這些樣式
        HSSFFont font = workbook.createFont();
        font.setFontName(HSSFFont.FONT_ARIAL);//字體
        font.setFontHeightInPoints((short) 16);//字號 
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//加粗
        //font.setColor(HSSFColor.BLUE.index);//顏色

        HSSFCellStyle cellStyle= workbook.createCellStyle(); //設置單元格樣式
        cellStyle.setFillForegroundColor(HSSFColor.PALE_BLUE.index);
        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER );
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cellStyle.setFont(font);

        //產生表格標題行       
        row = sheet.createRow(0);
        row.setHeightInPoints(20);
        for (int i = 0; i < headers.size(); i++) { 
            HSSFRichTextString text = new HSSFRichTextString(headers.get(i).toString());  
            cell = row.createCell(i);
            cell.setCellValue(text); 
            cell.setCellStyle(cellStyle);
        }  


        cellStyle= workbook.createCellStyle(); 
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_LEFT);
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        cellStyle.setDataFormat((short)0x31);//設置顯示格式,避免點擊后變成科學計數法了
        //cellStyle.setWrapText(true);//設置自動換行
        Map map;
        //遍歷集合數據,產生數據行  
        for (int i=0; i <datas.size(); i++) { 
            row=sheet.createRow((i+1));
            row.setHeightInPoints(20);
            map = datas.get(i);

            for(int j=0;j<map.size();j++) {
                 cell = row.createCell(j);
                 cell.setCellStyle(cellStyle);

                 cell.setCellType(HSSFCell.CELL_TYPE_STRING);
                 if(map.get(j) != null) {
                     cell.setCellValue(new HSSFRichTextString(map.get(j).toString())); 
                 }else{
                     cell.setCellValue(new HSSFRichTextString(""));     
                }
            }
        }   

        for (int i = 0; i < headers.size(); i++) { 
            sheet.autoSizeColumn((short)i);
        }

        FileOutputStream out = new FileOutputStream(new File(path));
        workbook.write(out);
        out.flush();
        out.close();

        /*
        HSSFRow row = sheet.createRow(sheets);
        HSSFCell cell = null;
        cell=row.createCell(sheets);
        cell.setCellValue(new HSSFRichTextString("-["+sheets+"]-"));
        sheets=sheets+2;//中間空一行
        row=sheet.createRow(sheets);
        */

    } catch (Exception e) {  
        System.out.println("#Error ["+e.getMessage()+"] ");
    } 
    System.out.println("文件:["+path+"] ["+sheets+"] 創建成功...");
    System.out.println("");
}

}</pre>

 本文由用戶 koel 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!