Java通用的Excel文件生成工具类,支持生成文件和浏览器直接下载详解编程语言

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(""); 
    } 
}

原创文章,作者:奋斗,如若转载,请注明出处:https://blog.ytso.com/tech/pnotes/10243.html

(0)
上一篇 2021年7月19日 10:08
下一篇 2021年7月19日 10:08

相关推荐

发表回复

登录后才能评论