POI使用模板

小编我在工作的时候遇到了很多poi导出excel表的需要,也要导出很多不同模板的excel,如果每一个都要去创建不同的表头,会增加工作量,所以小编我使用了poi的模板功能

我们可以创建poi的util工具类,在里面我们就使用模板功能(srcXlsPath为我创建的工具类里面的常量).

public void getSheet() {
        try{
            InputStream input =    ExportUtil.class.getResourceAsStream(srcXlsPath);
            if(input==null){
                logger.info("模板文件:"+srcXlsPath+"不存在");
                return;
            }
            if(WDWUtil.isExcel2003(srcXlsPath)){
                wb = new HSSFWorkbook(input);
            }
            if(WDWUtil.isExcel2007(srcXlsPath)){
                wb = new XSSFWorkbook(input);  
            }
            sheet= wb.getSheet(sheetName);
        }catch(Exception e){
            logger.error("捕获异常",e);
        }
    }

我在这里再列一下我全部的工具类的代码

public class ExcelMergeUtil {
    private String srcXlsPath="";
    private String fileName="";
    private String sheetName="";
    POIFSFileSystem fs=null;
    Workbook wb= null;  
    Sheet sheet = null; 
    
    private Logger logger = org.slf4j.LoggerFactory.getLogger(ExportUtil.class);
    
    public ExcelMergeUtil(String srcXlsPath,String fileName,String sheetName){//标题 列名
        this.srcXlsPath=srcXlsPath;
        this.setFileName(fileName);
        this.sheetName=sheetName;
        getSheet();
    }
    public ExcelMergeUtil(){}
    public void setSrcXlsPath(String srcXlsPath) {
        this.srcXlsPath = srcXlsPath;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }public String getFileName() {
        return fileName;
    }
    //获得工作表sheet
    public void getSheet() {
        try{
            
            InputStream input =    ExportUtil.class.getResourceAsStream(srcXlsPath);
            if(input==null){
                logger.info("模板文件:"+srcXlsPath+"不存在");
                return;
            }
            if(WDWUtil.isExcel2003(srcXlsPath)){
                wb = new HSSFWorkbook(input);
            }
            if(WDWUtil.isExcel2007(srcXlsPath)){
                wb = new XSSFWorkbook(input);  
            }
            sheet= wb.getSheet(sheetName);
        }catch(Exception e){
            logger.error("捕获异常",e);
        }
    }
    

当我们调用ExcelMergeUtil(String srcXlsPath,String fileName,String sheetName)时就能利用模板得到我们模板excel的sheet。这里值得强调的是,我们调用ExcelMergeUtil()方法的时候的srcXlsPath是我们模板的路径,fileName是我们模板excel的文件名(要加上后缀.xlsx),sheetName是我们模板的工作表sheet的名称。如果这三个变量有一个写错了,就会报空指针异常。可以把getSheet()当做初始化sheet。

 

 

 

 之后只要我们模板导入成功,我们就能去填写数据,然后到处excel文件了。

下面我把我的util工具类的全部代码都贴出来,大家需要的可以自取

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.slf4j.Logger;

import com.yusys.innermanager.utils.export.ExportUtil;
import com.yusys.innermanager.utils.export.WDWUtil;

public class ExcelMergeUtil {
    private String srcXlsPath="";
    private String fileName="";
    private String sheetName="";
    POIFSFileSystem fs=null;
    Workbook wb= null;  
    Sheet sheet = null; 
    
    private Logger logger = org.slf4j.LoggerFactory.getLogger(ExportUtil.class);
    
    public ExcelMergeUtil(String srcXlsPath,String fileName,String sheetName){//标题 列名
        this.srcXlsPath=srcXlsPath;
        this.setFileName(fileName);
        this.sheetName=sheetName;
        getSheet();
    }
    public ExcelMergeUtil(){}
    public void setSrcXlsPath(String srcXlsPath) {
        this.srcXlsPath = srcXlsPath;
    }

    public void setFileName(String fileName) {
        this.fileName = fileName;
    }
    public void setSheetName(String sheetName) {
        this.sheetName = sheetName;
    }public String getFileName() {
        return fileName;
    }
    //获得工作表sheet
    public void getSheet() {
        try{
            
            InputStream input =    ExportUtil.class.getResourceAsStream(srcXlsPath);
            if(input==null){
                logger.info("模板文件:"+srcXlsPath+"不存在");
                return;
            }
            if(WDWUtil.isExcel2003(srcXlsPath)){
                wb = new HSSFWorkbook(input);
            }
            if(WDWUtil.isExcel2007(srcXlsPath)){
                wb = new XSSFWorkbook(input);  
            }
            sheet= wb.getSheet(sheetName);
        }catch(Exception e){
            logger.error("捕获异常",e);
        }
    }
    
    
    /**
     *       写进IO流
     * @param path 文件存放位置
     * @param fileName  文件名,包括文件后缀
     * @throws IOException
     */
    public void exportExcel2007( String path , String fileName) throws IOException{
        FileOutputStream fileOutputStream = new FileOutputStream(path + fileName);
        wb.write(fileOutputStream);
        fileOutputStream.close();
    }
    
    /**
     *         创建行
     * @param list 从数据库中查到的数据
     * @param args 数据的字段名
     * @param first 从第几行开始创建
     */
    public void myCreateRow(List<Map<String,String>> list ,String args[] ,int first){
        for(int i=0;i<list.size();i++){  //
            Row row=sheet.createRow(i+first);  //有多少行创建多少行   
            Cell cellNum = row.createCell(0);        //创建行的第一个单元格 
            cellNum.setCellValue(i+1);  
            for(int j = 0 ; j < args.length ; j++ ){ //遍历map 即excel中的一行
                Cell cell = row.createCell(j+1);        //创建行的第一个单元格 
                cell.setCellValue(list.get(i).get(args[j]));   
                }
        }
        //countSum(list, args, first );
            
    }
    
    /**
     *
     * @param sheet
     * @param list   传入列表
     * @param args   数据库字段(可以不用传进来)
     * @param mergeArgs  判断是否需要合并的参数(销售点代码)
     * @param sumCol  想要计算合计的列名(月租金)
     * @param first   数据从第几行开始
     * @param writeSumCol 合计租金所在列数
     */
    public void myMerge(List<Map<String,String>> list, String mergeArgs ,String sumCol, int first ,int writeSumCol){
        String same = list.get(0).get(mergeArgs); //拿到合并参数的第一个值
        int firstRow = first; //合并的第一行行数
        int lastRow = 0;      //合并的最后一行行数
        int sumRent = 0;      //合计租金
        for(int i=0;i<list.size();i++){ // 这里我是遍历合并的参数(销售点代码),查看相同与不相同的
            if(same != list.get(i).get(mergeArgs) ){ //如果发生了不同,进入更新 合并参数和same的过程
                same = list.get(i).get(mergeArgs) ; //更新same的值
                lastRow = i + first-1 ; 
                //拿到单元格,把数值放到第一列
                Row mergeRow = sheet.getRow(firstRow);
                Cell mergeCell = mergeRow.createCell(writeSumCol);
                mergeCell.setCellValue(sumRent);
                //合并单元格
                if( (lastRow - firstRow)>0 ){ //如果行数大于一才合并
                CellRangeAddress region = new CellRangeAddress(firstRow, lastRow, writeSumCol, writeSumCol); //初始行,终止行,初始列,终止列
                sheet.addMergedRegion(region);
                }
                //合计月租更新+牌照费
                sumRent = Integer.valueOf(list.get(i).get(sumCol)) + Integer.valueOf(list.get(i).get("LICENSE_FEE"));
                firstRow = i+first;
                
                //如果相同,则更新合计租金
            }else if(same== list.get(i).get(mergeArgs)){
                sumRent = sumRent + Integer.valueOf(list.get(i).get(sumCol)) +Integer.valueOf(list.get(i).get("LICENSE_FEE")) ;
            }
            //最后一行单独合并 & 合并到最后一行
            if( i ==list.size()-1 && same== list.get(i).get(mergeArgs)){
                //拿到单元格,把数值放到第一列
                Row mergeRow = sheet.getRow(firstRow);
                Cell mergeCell = mergeRow.createCell(writeSumCol);
                mergeCell.setCellValue(sumRent);
                if( i - firstRow +first> 0 ){
                CellRangeAddress region = new CellRangeAddress(firstRow,i+first, writeSumCol, writeSumCol); //初始行,终止行,初始列,终止列
                sheet.addMergedRegion(region);
            }
        }
    }
    }

 

posted @ 2020-08-08 11:09  拿着放大镜看世界  阅读(768)  评论(1编辑  收藏  举报