解决 Excel 模板填充痛点:开发一款高效实用的工具

发布于:2025-03-03 ⋅ 阅读:(42) ⋅ 点赞:(0)

在项目开发中,Excel 模板在数据导出过程中扮演着重要角色。然而,在使用现有开源 Excel 处理工具的过程中,我们团队遇到了一些挑战,例如:

  • 性能问题: 处理大规模 Excel 文件时速度较慢,影响业务效率。

  • 功能受限: 无法满足复杂的模板填充需求,如动态表格、自定义计算等。

  • 稳定性不足: 可能出现不可预知的错误,影响使用体验。

我们尝试了多种解决方案,但未能找到完全符合需求的工具。因此,我们决定从实际需求出发,自主开发一款高效、灵活且稳定的 Excel 模板填充工具。

设计思路与技术选型

为了确保工具的通用性和易用性,我们采用了以下设计方案:

  1. 数据模型:使用 JSON 组织填充数据,使数据结构清晰、易于解析。

  2. 模板解析:识别 Excel 模板中的自定义标签,如 #{Map.SupplierMaster.detail}#{Table1.id} 等,自动匹配对应数据。

  3. 数据填充:依据解析结果,将 JSON 数据填充到 Excel 的相应位置。

  4. 函数支持:支持自定义计算逻辑,满足更复杂的数据处理需求。

在技术选型方面,我们选择了以下关键技术:

  • Apache POI:用于 Excel 文件的读取与写入。

  • JSON 解析:用于数据组织与转换。

  • 正则表达式:用于解析和匹配模板标签。

模板示例

实现示例

工具的使用方式简洁直观:

Map<String, Object> fillDataMap = new HashMap<>();
fillDataMap.put("SupplierMaster", supplierMaster);
fillDataMap.put("Table1", table1List);
fillDataMap.put("SumCfr", sumCfr);

ExcelUtil.writeToExcel(xssfWorkbook, fillDataMap);

示例代码展示了如何处理 #{Map.XXX} 标签,并用 JSON 数据填充 Excel:

import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class ExcelUtil {

    private static final Pattern MAP_TAG_PATTERN = Pattern.compile("#\\{Map\\.([^}]+)\\}");

    public static void processMapTag(XSSFCell xssfCell, Map<String, Object> map) {
        String cellValue = xssfCell.getStringCellValue();
        Matcher matcher = MAP_TAG_PATTERN.matcher(cellValue);
        
        if (matcher.find()) {
            String key = matcher.group(1);
            Object value = map.get(key);
            xssfCell.setCellValue(value != null ? value.toString() : "");
        }
    }
}

此外,我们还实现了一个 writeToExcel 方法,用于将数据填充到 Excel 中:

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import java.io.IOException;
import java.util.Map;

public static void writeToExcel(XSSFWorkbook xssfWorkbook, Map<?, ?> map) throws IOException {
    for (int i = 0; i < xssfWorkbook.getNumberOfSheets(); i++) {
        XSSFSheet sheet = xssfWorkbook.getSheetAt(i);
        CellStyle style = xssfWorkbook.createCellStyle();
        style.setAlignment(HorizontalAlignment.CENTER);
        Font font = xssfWorkbook.createFont();
        font.setFontName("Times New Roman");
        style.setFont(font);
        
        for (int rowNum = sheet.getFirstRowNum(); rowNum < sheet.getLastRowNum(); rowNum++) {
            XSSFRow row = sheet.getRow(rowNum);
            if (row != null) {
                for (int cellNum = row.getFirstCellNum(); cellNum < row.getLastCellNum(); cellNum++) {
                    XSSFCell cell = row.getCell(cellNum);
                    if (cell != null) {
                        if (isFillPosition(cell)) {
                            fillData(sheet, map, rowNum, cellNum, style);
                        }
                    }
                }
            }
        }
    }
    xssfWorkbook.setForceFormulaRecalculation(true);
}

主要特点

  • 高效:针对大数据量优化,确保快速填充。

  • 灵活:支持自定义标签和函数,适应多种业务场景。

  • 稳定:经过充分测试,确保工具的可靠性。

推广与应用

为了更好地应用和推广该工具,我们还进行了以下工作:

  • 文档编写:详细说明使用方法,降低学习成本。

  • 团队培训:组织内部分享,提高团队成员的使用效率。

  • 持续优化:结合用户反馈,不断改进工具的功能和稳定性。

通过开发这款 Excel 模板填充工具,我们提升了团队的工作效率,优化了数据导出流程,并积累了宝贵的技术经验。希望这次实践能为更多开发者提供思路和借鉴。


网站公告

今日签到

点亮在社区的每一天
去签到