使用easypoi 根据模板横向导出excel并合并横向单元格

文章介绍了如何在Java项目中通过Easypoi库添加依赖,并处理Excel模板,包括创建数据map,调用exportIndexToDirectByTemp方法填充数据并设置样式,最终实现Excel文件的导出。
摘要由CSDN通过智能技术生成

一、添加pom依赖:

<dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-base</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-web</artifactId>
            <version>4.1.2</version>
        </dependency>
        <dependency>
            <groupId>cn.afterturn</groupId>
            <artifactId>easypoi-annotation</artifactId>
            <version>4.1.2</version>
        </dependency>

二、excel模板如图:

 三、将数据填充为map,调用导出方法

Map<String, Object> data = new HashMap<String, Object>(3);
        data.put("content", sb.toString());
        data.put("indexNames", indexNames);
        Map<String, Object> maps = new HashMap<String, Object>(2);
        maps.put("indexManage", data);
        File file = new File(filePath);
        if (!file.exists()) {
            // 路径不存在
            file.mkdirs();
        }
        ExcelOutUtil.exportIndexToDirectByTemp(indexNames.size(), maps, "file/指标生成模板.xlsx", formulaIdIn.getFormulaInfoId() + "指标模板.xlsx", new Integer[]{1}, filePath);

四、exportIndexToDirectByTemp具体内容为:

public static void exportIndexToDirectByTemp(Integer indexSize,Map<String, Object> param, String path, String fileName, Integer[] sheetNums, String direct) {
        OutputStream out = null;
        try {
            TemplateExportParams params = new TemplateExportParams(path, true);
            //要使用横向遍历必须设置为true
            params.setColForEach(true);
            params.setStyle(ExcelStyleType.BORDER.getClazz());
            //params.setSheetNum(new Integer[]{1, 2, 3, 4});
            params.setSheetNum(sheetNums);
            Workbook book = ExcelExportUtil.exportExcel(params, param);
            setCell(book,indexSize,0);
            setCell(book,indexSize,1);
            exportToDirect(direct, book, fileName);
        } catch (Exception e) {
            throw new RuntimeException("导出异常", e);
        }
    }

//设置边框样式并合并单元格
public static void setCell(Workbook book,Integer indexSize,Integer rowNum){
        //CellRangeAddress(第几行开始,第几行结束,第几列开始,第几列结束)
        CellRangeAddress craOne = new CellRangeAddress(rowNum, rowNum, 0, indexSize+1);
        Sheet sheet = book.getSheetAt(0);
        sheet.addMergedRegion(craOne);
        Row row = sheet.getRow(rowNum);
        CellStyle style = book.createCellStyle();
        // 设置边框样式
        style.setBorderTop(BorderStyle.THIN);
        style.setBorderBottom(BorderStyle.THIN);
        style.setBorderLeft(BorderStyle.THIN);
        style.setBorderRight(BorderStyle.THIN);
        for (int i = 1; i <= indexSize+1; i++) {
            Cell cell = row.getCell(i);
            if (cell == null) {
                cell = row.createCell(i);
            }
            cell.setCellStyle(style);
        }
    }

五、最终导出结果:

Easypoi库中,使用模板导出Excel并处理横向多层嵌套循环通常涉及`XSSFDataFormat`、`RowFactory.createRow()`以及`CellStyle`的使用。以下是一个基本示例,假设你有一个二维数组代表数据层次结构: ```java import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; public void exportToExcel(XSSFWorkbook workbook, String[][] data) { // 获取工作表 Sheet sheet = workbook.createSheet("数据"); // 创建行工厂 Row row = workbook.createRow(0); // 获取样式 CellStyle headerCellStyle = createHeaderCellStyle(workbook); // 循环填充数据 for (int i = 0; i < data.length; i++) { for (int j = 0; j < data[i].length; j++) { // 如果是第一层,创建新行 if (i == 0) { row = workbook.createRow(i); } // 根据层数设置列索引 int colIndex = getColIndex(j, data.length); // 自定义获取列索引的函数 // 设置单元格值和样式 Cell cell = row.createCell(colIndex); cell.setCellValue(data[i][j]); // 第一层添加标题样式 if (j == 0) { cell.setCellStyle(headerCellStyle); } } } } // 辅助方法 private CellStyle createHeaderCellStyle(XSSFWorkbook workbook) { DataFormatter df = new DataFormatter(); CellStyle style = workbook.createCellStyle(); style.setFillForegroundColor(IndexedColors.YELLOW.getIndex()); style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setBorderTop(BorderStyle.THIN); style.setBorderBottom(BorderStyle.THIN); style.setBorderLeft(BorderStyle.THIN); style.setBorderRight(BorderStyle.THIN); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); style.setDataFormat(df.createDataFormat().getFormat("@")); // 使用通用格式 return style; } private int getColIndex(int level, int maxLevel) { // 自定义获取列索引的逻辑,这里简化为直接映射 return level * (maxLevel + 1); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值