POI根据表头模板导出excel数据,并指定单个单元格样式,多sheet。

发布时间:2023年12月28日

最近的公司需求,因为Excel表头样式较为复杂,不易直接用poi写出。
需要的Excel为这种:在这里插入图片描述
直接模板导出不能成为这样。

   
    public void exportCheckCsdn(HttpServletResponse response) {
        //获取到MNR 和 MNR-DT 的List
        
//        此处写 获取到指定list 的语句
        List<MnrExcelDTO> mnrExcelDTOS = new ArrayList<>();
        
        //sheet2,如果是单个sheet,不需要这个
        List<MnrDtExcelDTO> mnrDtExcelDTOS = new ArrayList<>();
//        list赋值

//excel模板路径
        File fi = null;
        try {
//            这边写的模板在resources下的 templates 下
            fi = ResourceUtils.getFile("classpath:templates/MNR_Check_Result.xlsx");
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        XSSFWorkbook wb = null;
        try {
            //读取excel模板
            wb = new XSSFWorkbook(new FileInputStream(fi));
        } catch (IOException e) {
            e.printStackTrace();
        }
        XSSFSheet mnrSheet = wb.getSheetAt(0);
        XSSFSheet mnrSheetDt = wb.getSheetAt(1);
        
        
        //从第二行开始 sheet1的  ,因为第一行为模板
        for (int i = 2; i < mnrExcelDTOS.size() + 2; i++) {
            //获取行数据
            //根据字段名获取对应行数据
            MnrExcelDTO rowData = mnrExcelDTOS.get(i - 2);
            
            Row row = mnrSheet.getRow(i);
            if (row == null) {
                // 创建新行对象
                row = mnrSheet.createRow(i);
            }
            
            for (int j = 0; j < MnrExcelDTO.class.getDeclaredFields().length; j++) {
                // 获取当前单元格
                Cell cell = row.getCell(j);
                if (cell == null) {
                    // 如果单元格不存在,创建一个新的单元格对象
                    cell = row.createCell(j);
                }
                
                
                // 获取对应单元格的字段名称
                Field field = MnrExcelDTO.class.getDeclaredFields()[j];
                String fieldName = field.getName();
                // 获取字段对应的 getter 方法
                Method method = null;
                String cellValue = "";
                try {
                    //获取get方法
                    method = rowData.getClass().getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
                    // 调用 getter 方法获取字段的属性值
                    Object value = method.invoke(rowData);
                    if (null == value) {
                        cellValue = "";
                    } else {
                        // 将值转换为字符串类型,并设置到单元格中
                        cellValue = String.valueOf(value);
                    }
                    cell.setCellValue(cellValue);
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
                
                
                CellStyle redCellStyle = null;
                
                    Object value = "";
                    try {
//                        如果字段名称不等于ckStatus,则设置单元格的样式
                        if (!"ckStatus".equals(fieldName)) {
                            
                            value = method.invoke(rowData);
                            
                            // 将值转换为字符串类型,并设置到单元格中
                            cellValue = String.valueOf(value);
                            cell.setCellValue(cellValue);
                        }
                    } catch (InvocationTargetException e) {
                        e.printStackTrace();
                    } catch (IllegalAccessException e) {
                        e.printStackTrace();
                    }
                    
                    redCellStyle = wb.createCellStyle();
                    // 重点:从现有样式克隆style,只修改Font,其它style不变
                    redCellStyle.cloneStyleFrom(cell.getCellStyle());
                    // 获取原有字体
                    Font oldFont = wb.getFontAt(redCellStyle.getFontIndexAsInt());
                    // 创建新字体
                    Font redFont = wb.createFont();
                    // 重点:保留原字体样式
                    redFont.setFontName(oldFont.getFontName()); // 保留原字体
                    redFont.setFontHeightInPoints(oldFont.getFontHeightInPoints()); // 保留原字体高度
                    redFont.setBold(true); // 加粗
                    redFont.setColor(IndexedColors.RED.getIndex());  // 字体颜色:红色
                    // 设置红色字体
                    redCellStyle.setFont(redFont);
                    
            
                // 设置样式
                cell.setCellStyle(redCellStyle);
                
            }
        }
    
    
        //从第二行开始 sheet2的  ,因为第一行为模板   同上
        for (int i = 2; i < mnrDtExcelDTOS.size() + 2; i++) {
            //获取行数据
            //根据字段名获取对应行数据
            MnrDtExcelDTO rowData = mnrDtExcelDTOS.get(i - 2);
        
            Row row = mnrSheet.getRow(i);
            if (row == null) {
                // 创建新行对象
                row = mnrSheet.createRow(i);
            }
        
            for (int j = 0; j < MnrExcelDTO.class.getDeclaredFields().length; j++) {
                // 获取当前单元格
                Cell cell = row.getCell(j);
                if (cell == null) {
                    // 如果单元格不存在,创建一个新的单元格对象
                    cell = row.createCell(j);
                }
            
            
                // 获取对应单元格的字段名称
                Field field = MnrExcelDTO.class.getDeclaredFields()[j];
                String fieldName = field.getName();
                // 获取字段对应的 getter 方法
                Method method = null;
                String cellValue = "";
                try {
                    //获取get方法
                    method = rowData.getClass().getMethod("get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1));
                    // 调用 getter 方法获取字段的属性值
                    Object value = method.invoke(rowData);
                    if (null == value) {
                        cellValue = "";
                    } else {
                        // 将值转换为字符串类型,并设置到单元格中
                        cellValue = String.valueOf(value);
                    }
                    cell.setCellValue(cellValue);
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (NoSuchMethodException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            
            
                CellStyle redCellStyle = null;
            
                Object value = "";
                try {
//                        如果字段名称不等于ckStatus,则设置单元格的样式
                    //也可以加上其他的判断,比如字符串末尾有 er 字符后缀,表示处理失败,给他变色即可
                    if (!"ckStatus".equals(fieldName)) {
                    
                        value = method.invoke(rowData);
                    
                        // 将值转换为字符串类型,并设置到单元格中
                        cellValue = String.valueOf(value);
                        cell.setCellValue(cellValue);
                    }
                } catch (InvocationTargetException e) {
                    e.printStackTrace();
                } catch (IllegalAccessException e) {
                    e.printStackTrace();
                }
            
                redCellStyle = wb.createCellStyle();
                // 重点:从现有样式克隆style,只修改Font,其它style不变
                redCellStyle.cloneStyleFrom(cell.getCellStyle());
                // 获取原有字体
                Font oldFont = wb.getFontAt(redCellStyle.getFontIndexAsInt());
                // 创建新字体
                Font redFont = wb.createFont();
                // 重点:保留原字体样式
                redFont.setFontName(oldFont.getFontName()); // 保留原字体
                redFont.setFontHeightInPoints(oldFont.getFontHeightInPoints()); // 保留原字体高度
                redFont.setBold(true); // 加粗
                redFont.setColor(IndexedColors.RED.getIndex());  // 字体颜色:红色
                // 设置红色字体
                redCellStyle.setFont(redFont);
            
            
                // 设置样式
                cell.setCellStyle(redCellStyle);
            
            }
        }
    
    
        ServletOutputStream outputStream = null;
        
        try {
            ExcelUtil.setResponse(response, "userName-today-check");
            outputStream = response.getOutputStream();
            wb.write(outputStream);
            outputStream.flush();
            outputStream.close();
            wb.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    
文章来源:https://blog.csdn.net/chongyang_/article/details/135267733
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。