按照固定模板动态POI导出Excel

项目中需求按照固定格式导出账单,刚开始用的poi4.0版本的包,各种拼接、合并单元
格、设置字体样式太麻烦了,后来同事给推荐了用模板导出,很好用,不过jar包得用
3.17版本的,不然会有坑,合并单元格的内容会被覆盖没了,自己玩时小心掉坑,也
可以直接复制下边代码,绝对没坑,给你个眼神

用poi的包一定要注意版本,版本不一样里边的好多方法都不一样,连常量都有些不一样

<!-- 导出 -->
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi</artifactId>
   <version>3.17</version>
</dependency>
<dependency>
   <groupId>org.apache.poi</groupId>
   <artifactId>poi-ooxml</artifactId>
   <version>3.17</version>
</dependency>
<!-- 导出 -->
export.java

import java.io.File;
import java.io.FileInputStream;  
import java.io.FileNotFoundException;  
import java.io.FileOutputStream;  
import java.io.IOException;  
  
import org.apache.poi.xssf.usermodel.XSSFCell;  
import org.apache.poi.xssf.usermodel.XSSFRow;  
import org.apache.poi.xssf.usermodel.XSSFSheet;  
import org.apache.poi.xssf.usermodel.XSSFWorkbook;  
  
public class CreatRowTest {  
    //当前文件已经存在  
    private String excelPath = "/Users/lihui/work/账单-模板.xlsx";
    private String excelPath2 = "/Users/lihui/work/生成账单.xlsx";
    //从第几行插入进去  
    private int insertStartPointer = 11;
    //在当前工作薄的那个工作表单中插入这行数据   
    private String sheetName = "对账单(月)";
  
    /** 
     * 总的入口方法 
     */  
    public static void main(String[] args) {  
        CreatRowTest crt = new CreatRowTest();  
        crt.insertRows();  
    }  
    /** 
     * 在已有的Excel文件中插入一行新的数据的入口方法 
     */  
    public void insertRows() {  
        XSSFWorkbook wb = returnWorkBookGivenFileHandle();  
        XSSFSheet sheet1 = wb.getSheet(sheetName);  
        XSSFRow row = createRow(sheet1, insertStartPointer);  
        createCell(row);
        saveExcel(wb);
  
    }  
    /** 
     * 保存工作薄 
     * @param wb 
     */  
    private void saveExcel(XSSFWorkbook wb) {  
        FileOutputStream fileOut;  
        try {  
            fileOut = new FileOutputStream(excelPath2);
            wb.write(fileOut);  
            fileOut.close();  
        } catch (FileNotFoundException e) {  
            e.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
  
    }  
    /** 
     * 创建要出入的行中单元格 
     * @param row 
     * @return 
     */  
    private XSSFCell createCell(XSSFRow row) {  
        XSSFCell cell = row.createCell((short) 0);  

        row.createCell(0).setCellValue(0);
        row.createCell(1).setCellValue("1");
        row.createCell(2).setCellValue(2);
        row.createCell(3).setCellValue(3);
        row.createCell(4).setCellValue(4);
        row.createCell(5).setCellValue(5);
        row.createCell(6).setCellValue(6);

        return cell;  
    }  
   /** 
    * 得到一个已有的工作薄的POI对象 
    * @return 
    */  
    private XSSFWorkbook returnWorkBookGivenFileHandle() {  
        XSSFWorkbook wb = null;  
        FileInputStream fis = null;  
        File f = new File(excelPath);  
        try {  
            if (f != null) {  
                fis = new FileInputStream(f);  
                wb = new XSSFWorkbook(fis);  
            }  
        } catch (Exception e) {  
            return null;  
        } finally {  
            if (fis != null) {  
                try {  
                    fis.close();  
                } catch (IOException e) {  
                    e.printStackTrace();  
                }  
            }  
        }  
        return wb;  
    }  
   /** 
    * 找到需要插入的行数,并新建一个POI的row对象 
    * @param sheet 
    * @param rowIndex 
    * @return 
    */  
    private XSSFRow createRow(XSSFSheet sheet, Integer rowIndex) {  
        XSSFRow row = null;  
        if (sheet.getRow(rowIndex) != null) {  
            int lastRowNo = sheet.getLastRowNum();  
            sheet.shiftRows(rowIndex, lastRowNo, 1);  
        }  
        row = sheet.createRow(rowIndex);  
        return row;  
    }  
  
      
  
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值