更好用的excel国际化多语言导出

不知道大家在开发中有没有遇到过『excel导出』的需求,反正我最近写了不少这种功能,刚开始利用poi,一行行的手动塞数据,生成excel,而且还有国际化需求,比如:标题栏有一列,用户切换成"简体中文"时, 导出的标题应该是『用户姓名』,而切换到"英文"时, 导出的标题应该变成『Customer Name』(当然还有一些细节 ,比如英文环境,日期通常是 "月/日/年"格式,而中文格式是"年-月-日")

偶尔干一两次还行,经常这么手动处理,纯体力活就太枯燥了,在一个小伙伴的抱怨下,到网上搜索了下,看看有没有更省力的通用解决方案,还真找到了,比如Excel4J (向原作者致敬,提供这么方便的开源项目)。大致原理是基于注解,用法很简单:

public class Student2 {

    @ExcelField(title = "学号", order = 1)
    private Long id;

    @ExcelField(title = "姓名", order = 2)
    private String name;

    ...
}

打个注解就行,导出一行搞定:

        List<Student2> list = new ArrayList<>();
        ...
        ExcelUtils.getInstance().exportObjects2Excel(list, Student2.class, true, "学生信息", true, BASE_PATH + "student2.xlsx");

不过原作者并没有提供国际化多语言的功能,于是顺着这个思路,略为修改了一下,再定义一个多语言的注解:

/**
 * 国际化标题注解
 *
 * @author 菩提树下的杨过
 */
@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
public @interface I18nField {

    /**
     * 国际化标题栏(例如: ["zh-cn|学生","en-us|student"])
     *
     * @return 国际化标题配置数组
     */
    String[] titles();

}

导出的地方去判断有无这个注解就行(详细大家可以看源码),修改后,原来的Student2改成:

@Data
public class Student2 {

    @ExcelField(title = "学号", order = 1)
    @I18nField(titles = {"en-us|student id"})
    private Long id;

    @ExcelField(title = "姓名", order = 2)
    @I18nField(titles = {"en-us|name"})
    private String name;

    ...  
}

导出时指定语言:

        List<Student2> list = new ArrayList<>();
       ...
        ExcelUtils.getInstance().exportObjects2Excel(list, Student2.class, true, "student", true, BASE_PATH + "student2-en.xlsx", "en-us");
        ExcelUtils.getInstance().exportObjects2Excel(list, Student2.class, true, "学生信息", true, BASE_PATH + "student2-cn.xlsx", "zh-cn");

效果如下:

中文导出:

英文导出:

修改后的版本,已在github上开源,地址:https://github.com/yjmyzz/Excel4J

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏Java成神之路

分布式_事务_02_2PC框架raincat源码解析

上一节已经将raincat demo工程运行起来了,这一节来分析下raincat的源码

2271
来自专栏张善友的专栏

Castle 整合.NET Remoting

  今天研究了一下Castle的Remoting Facility.记录如下: 微软以前使用COM/DCOM的技术来处理分布式系统架构,通过Client端的...

2158
来自专栏林冠宏的技术文章

关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

( 转载请务必标明出处:https://cloud.tencent.com/developer/user/1148436/activities) 前序 本文将...

3395
来自专栏精讲JAVA

Netty 实现原理浅析

(点击上方公众号,可快速关注) 来源:kafka0102的博客 , www.kafka0102.com/2010/06/167.html Netty是JBoss...

2698
来自专栏小灰灰

Java & PhantomJs 实现html输出图片

Java & PhantomJs 实现html输出图片 借助phantomJs来实现将html网页输出为图片 I. 背景 如何在小程序里面生成一张图,分享到朋...

7748
来自专栏Java架构师学习

浅析Netty

Netty是JBoss出品的高效的Java NIO开发框架,关于其使用,可参考我的另一篇文章 netty使用初步。本文将主要分析Netty实现方面的东西,由于精...

1601
来自专栏ImportSource

JDK10要来了:下一代 Java 有哪些新特性?

JDK 10 目前正在Rampdown Phase One,开发正在努力的修复着bug。 排期 2017/12/14 Rampdown Phase One ...

6008
来自专栏架构师之旅

《Spring敲门砖之基础教程第一季》 第二章(1) Spring框架之IOC首例-HelloWorld

回顾 上一章我们主要学习了Spring的一些理论知识,对Spring框架有了一个总体的概括,大家应该在头脑里形成一个初步的印象,接下来我们就会针对Spring框...

20310
来自专栏逸鹏说道

360护心镜脚本分析及N种绕过方式

官方介绍: 通过Hook XSS的常用函数,并监控DOM元素的创建,从而对整个页面的js行为进行监控。当发现页面中存在XSS攻击行为时,可根据预置的选项,进行放...

3948
来自专栏老码农专栏

TodoBackend展示应用以及ActFramework的实现

1365

扫码关注云+社区

领取腾讯云代金券