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