poi拆分Excel单元格并填充内容

合并之前文件

//合并并上传fastdfs
public void uploadExcelDataSource(MultipartFile file) throws IOException {
    List<String> list = Arrays.asList("xls,xlsx");
    if (list.contains(FilenameUtils.getExtension(file.getOriginalFilename()))) {
        InputStream in = file.getInputStream();
        byte[] bytes = ExcelUtil.handleExcel(in);
        fdfsService.uploadFile(file.getOriginalFilename(), bytes, file.getSize());
    }
    
}



import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.util.CellRangeAddress;

import java.io.*;
import java.math.BigDecimal;
import java.text.DateFormat;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.*;

/**
 * @author thq
 * @description 处理工具类
 * @create 2023-03-01 17:05
 */
@Slf4j
public class ExcelUtil {

    /**
     * 处理合并的单元格
     * @date: 2023/3/1 17:09
     * @param: inputStream
     * @return: java.util.Map<java.lang.Integer,java.util.List<java.lang.Object>>
     **/
    public static byte[] handleExcel(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteArrayOutputStream = null;
        OutputStream os = null;
        try{
            //创建工作簿
            Workbook workbook = WorkbookFactory.create(inputStream);
            //获取sheet的个数
            int sheetNum = workbook.getNumberOfSheets();
            //遍历每一个sheet
            for(int i = 0;i<sheetNum;i++){
                Sheet sheet = workbook.getSheetAt(i);
                splitCell(sheet);
            }
            //字节数组输出流
            byteArrayOutputStream = new ByteArrayOutputStream();
            //输出缓冲流
            os = new BufferedOutputStream(byteArrayOutputStream);
            //将Excel写出到输出流中
            workbook.write(os);
            //刷新缓冲区
            os.flush();
            //获取输出流的数据
            byte[] bytes = byteArrayOutputStream.toByteArray();
            return bytes;
        }catch (Exception e){
            log.error("excel文件解析失败",e.getMessage());
        }finally {
           if(byteArrayOutputStream!=null){
               byteArrayOutputStream.close();
           }
           if (os != null){
               os.close();
           }
            if (os != null){
                os.close();
            }
        }
        return null;
    }

    /**
     * 拆分单元格并填充数据
     * @date: 2023/3/2 10:58
     * @param: sheet 
     **/
    public static void splitCell(Sheet sheet)  {
        //获取合并单元格的数量
        int numMergedRegions = sheet.getNumMergedRegions();
        for(int z = numMergedRegions-1;  z>=0; z--) {
            //获取合并单元格
            CellRangeAddress merge = sheet.getMergedRegion(z);
            sheet.removeMergedRegion(z);
            //获取合并单元格起始行、结束行、起始列、结束列
            int firstCol = merge.getFirstColumn();
            int lastCol = merge.getLastColumn();
            int firstRow = merge.getFirstRow();
            int lastRow = merge.getLastRow();
            Cell cell = null;
            int rowNum = 1;
            for (int k = firstRow; k <= lastRow; k++) {
                int repeatNum = 1;
                for (int l = firstCol; l <= lastCol; l++) {
                    int colNum = 0;
                    //拿到第一个值就是合并单元格的值
                    if (cell == null){
                        cell = sheet.getRow(k).getCell(l);
                    }else {
                        Cell cell1 = sheet.getRow(k).getCell(l);
                        switch (cell.getCellType()) {
                            case Cell.CELL_TYPE_NUMERIC:
                                //判断是否为日期类型
                                if (DateUtil.isCellDateFormatted(cell)) {
                                    Date date = cell.getDateCellValue();
                                    DateFormat formater = new SimpleDateFormat("yyyy-MM-dd");
                                    cell1.setCellValue(formater.format(date));
                                } else {
                                    DecimalFormat df = new DecimalFormat("####.####");
                                    cell1.setCellValue( df.format(cell.getNumericCellValue()));
                                }
                                break;
                            case Cell.CELL_TYPE_STRING:
                                if(firstCol == lastCol){
                                    cell1.setCellValue(cell.getStringCellValue()+rowNum);
                                    rowNum++;
                                }else if(firstRow == lastRow){
                                    cell1.setCellValue(cell.getStringCellValue()+repeatNum);
                                }else{
                                    cell1.setCellValue(cell.getStringCellValue()+(rowNum+colNum));
                                    rowNum++;
                                    colNum++;
                                }
                                repeatNum ++;
                                break;
                            case Cell.CELL_TYPE_BOOLEAN:
                                cell1.setCellValue(cell.getBooleanCellValue() + "");
                                break;
                            case Cell.CELL_TYPE_BLANK:
                                cell1.setCellValue("");
                                break;
                            case Cell.CELL_TYPE_ERROR:
                                cell1.setCellValue("");
                                break;
                            default:
                                break;
                        }
                    }
                }
            }
        }
    }

}

合并处理之后的文件

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值