Java poi插件导出Excel文件合并多sheet页

前言:2020年第一篇文章,就写这两天工作中遇到的这个小需求吧,导出多excel,每个excel有多个sheet页,需要把相同格式的excel的sheet页合并。2020年写出更优质的文章,让大家都能从中学到更多的知识。

一、java导出excel格式文件

java导出excel文件,有一个比较好的开源框架,比较好用,而且使用也非常简单,我们不必重复造轮子。

GitHub地址为:Excel4J

使用的时候可以直接引用pom文件

<dependency>
    <groupId>com.github.crab2died</groupId>
    <artifactId>Excel4J</artifactId>
    <version>3.0.0-Alpha</version>
</dependency>

举个简单例子:把要导出的对象组装成list,直接一行代码就可以搞定

ExcelUtils.getInstance().exportObjects2Excel(list2, header, "D:/D.xlsx");

更多具体例子可以参考:GitHub地址为:Excel4J 上面例子。

二、excel文件多sheet页合并

有时候我们会遇到类似这样的需求,比如excel文件多sheet页合并,当遇到这样的需求的时候,首先我们poi的API必需要熟悉。例如:如何创建sheet,如何创建sheet页里面的行,如何给sheet页里面的单元格赋值。

  • 创建工作簿
Workbook megreWorkbook = new XSSFWorkbook();  (2007版excel)
  • 获取工作表中的sheet页
 Sheet sheetAt = book.getSheetAt(i);
  • 创建新的sheet
Sheet sheet = megreWorkbook.createSheet(workbook.getSheetName(i));
  • 创建sheet页里面的行
 Row megreRow = sheet.createRow(k);
  • 给sheet页里面的单元格赋值
 Cell cell = row.getCell(h);
 megreRow.createCell(h).setCellValue(getCellValue(cell));

主要核心代码如下

public static void megreSheet() throws Exception {
        Workbook megreWorkbook = null;
        try {
            megreWorkbook = new XSSFWorkbook();
            int k = 0;
            //循环读取每个excel文件
            List<Workbook> list = new ArrayList<>();
            InputStream inputStream = new FileInputStream(new File("D:\\aplus\\shuqian\\megre\\额度明细报表.xlsx"));
            Workbook workbook = new XSSFWorkbook(inputStream);
            list.add(workbook);
            InputStream inputStream1 = new FileInputStream(new File("D:\\aplus\\shuqian\\megre\\额度明细报表1.xlsx"));
            Workbook workbook1 = new XSSFWorkbook(inputStream1);
            list.add(workbook1);
            int numberOfSheets = workbook.getNumberOfSheets();
            for (int i = 0;i < numberOfSheets; i++) {
                Sheet sheet = megreWorkbook.createSheet(workbook.getSheetName(i));
                for (Workbook book:list) {
                    Sheet sheetAt = book.getSheetAt(i);
                    for (int j = 0; j < sheetAt.getLastRowNum() + 1;j++) {
                        // 只针对第一个excel文件才读取表头,其余文件将不再读取表头
                        if (k > 0 && j ==0) {
                            continue;
                        }
                        Row megreRow = sheet.createRow(k);
                        Row row = sheetAt.getRow(j);
                        //读取
                        for (int h = 0;h < row.getPhysicalNumberOfCells(); h++) {
                            Cell cell = row.getCell(h);
                            megreRow.createCell(h).setCellValue(getCellValue(cell));
                        }
                        k++;
                    }
                }
                k = 0;
            }
            OutputStream outputStream = new FileOutputStream("D:\\aplus\\shuqian\\megre\\额度明细报表Ex.xlsx");
            megreWorkbook.write(outputStream);
        }finally {
           if (megreWorkbook != null) {
               megreWorkbook.close();
           }
        }
    }
 public static String getCellValue(Cell c) {
        String o;
        switch (c.getCellTypeEnum()) {
            case BLANK:
                o = "";
                break;
            case BOOLEAN:
                o = String.valueOf(c.getBooleanCellValue());
                break;
            case FORMULA:
                o = calculationFormula(c);
                break;
            case NUMERIC:
                if (DateUtil.isCellDateFormatted(c)) {
                    o = DateUtils.date2Str(c.getDateCellValue());
                } else {
                    o = String.valueOf(c.getNumericCellValue());
                    o = matchDoneBigDecimal(o);
                    o = RegularUtils.converNumByReg(o);
                }
                break;
            case STRING:
                o = c.getStringCellValue();
                break;
            default:
                o = null;
                break;
        }
        return o;
    }

测试使用excel文件格式为:
在这里插入图片描述
以上就是关于excel文件sheet页合并主要方法,祝大家在新的一年里面心想事成。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

境里婆娑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值