使用EasyExcel实现国际化Excel文档的支持

2025-04发布9次浏览

在实际开发中,我们经常需要生成Excel文档以满足用户需求。然而,当系统支持多语言环境时,如何让生成的Excel文档也支持国际化(i18n)成为了一个重要的问题。本文将详细介绍如何使用EasyExcel库来实现这一目标,并提供具体的代码示例和操作步骤。

一、EasyExcel简介

EasyExcel 是阿里巴巴开源的一个基于 Java 的 Excel 处理工具,它对 Apache POI 进行了封装,极大地简化了读写 Excel 文件的操作。相比传统的 POI 库,EasyExcel 提供了更简洁的 API 和更高的性能,尤其适合处理大规模数据。

二、国际化支持的基本原理

在实现国际化之前,我们需要了解其基本原理。国际化通常通过资源文件(如 .properties 文件)来存储不同语言的文字内容。程序根据用户的语言设置动态加载对应的资源文件,从而实现多语言支持。

对于Excel文档来说,国际化的关键是能够根据不同的语言动态生成对应的语言文本内容。

三、实现步骤

1. 引入依赖

首先,在项目中引入 EasyExcel 的 Maven 依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>easyexcel</artifactId>
    <version>3.0.5</version>
</dependency>

2. 创建资源文件

为了支持国际化,我们需要创建多个语言的资源文件。例如:

  • messages_en_US.properties
  • messages_zh_CN.properties

假设我们要在 Excel 中显示 "Name" 和 "Age" 列名,可以这样定义资源文件:

messages_en_US.properties:

name=Name
age=Age

messages_zh_CN.properties:

name=姓名
age=年龄

3. 编写实体类

接下来,我们需要定义一个实体类来映射 Excel 的列。通过注解 @ExcelProperty 来指定列名,并结合国际化支持动态加载列名。

import com.alibaba.excel.annotation.ExcelProperty;
import java.util.Locale;

public class User {

    @ExcelProperty(value = "${name}", index = 0)
    private String name;

    @ExcelProperty(value = "${age}", index = 1)
    private Integer age;

    // Getters and Setters
}

注意:${name}${age} 是占位符,稍后我们将通过自定义解析器将其替换为实际的国际化文本。

4. 自定义解析器

为了让 @ExcelProperty 支持国际化,我们需要自定义解析器。可以通过实现 GlobalConfigurationBuilder 来完成。

import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import org.springframework.context.MessageSource;
import org.springframework.context.i18n.LocaleContextHolder;

import java.util.Map;

public class I18nConfig {

    public static HorizontalCellStyleStrategy getHorizontalCellStyleStrategy(MessageSource messageSource) {
        return new HorizontalCellStyleStrategy(
                getWriteCellStyle(),
                getWriteFont(messageSource)
        );
    }

    private static WriteCellStyle getWriteCellStyle() {
        WriteCellStyle style = new WriteCellStyle();
        // 设置样式
        return style;
    }

    private static WriteFont getWriteFont(MessageSource messageSource) {
        WriteFont font = new WriteFont();
        Map<String, String> messages = getMessages(messageSource);
        font.setFontHeightInPoints((short) 11);
        return font;
    }

    private static Map<String, String> getMessages(MessageSource messageSource) {
        Locale locale = LocaleContextHolder.getLocale();
        return Map.of(
            "name", messageSource.getMessage("name", null, locale),
            "age", messageSource.getMessage("age", null, locale)
        );
    }
}

5. 写入Excel

最后,我们可以编写代码来生成带有国际化支持的 Excel 文件。

import com.alibaba.excel.EasyExcel;
import org.springframework.context.MessageSource;

import java.util.ArrayList;
import java.util.List;

public class ExcelWriter {

    public static void main(String[] args) {
        String fileName = "output.xlsx";

        List<User> data = new ArrayList<>();
        data.add(new User("Alice", 25));
        data.add(new User("Bob", 30));

        MessageSource messageSource = ...; // 初始化MessageSource

        EasyExcel.write(fileName, User.class)
                .registerWriteHandler(I18nConfig.getHorizontalCellStyleStrategy(messageSource))
                .sheet("Sheet1")
                .doWrite(data);
    }
}

6. 动态切换语言

通过 Spring 的 LocaleContextHolder,我们可以轻松地动态切换语言环境。例如:

LocaleContextHolder.setLocale(Locale.US); // 切换到英文环境

四、总结

通过上述步骤,我们成功地实现了使用 EasyExcel 生成支持国际化的 Excel 文档。关键在于通过资源文件和自定义解析器动态加载列名,确保生成的文档能够适应不同的语言环境。