「软件更新」MyExcel重构&性能提升( 3.0.0.RC 发布)

MyExcel简介

MyExcel,是一个集导入、导出、加密Excel等多项功能的Java工具包。

导入:提供简便的API,读取Excel内容,并转化为List< Bean >。
导出:可快速导出海量数据的简单列表,可生成高复杂度布局的Excel,复杂布局指的是包含多种不规则合并单元格、背景色、字体大小、斜体、下拉列表等,可自动划分Excel生成zip压缩包。

3.0.0.RC更新内容

  1. 修复DefaultExcelBuilder、DefaultStreamExcelBuilder自定义样式无效问题;
  2. 修复读取含小数点整数错误问题;
  3. 修复DefaultStreamExcelBuilder海量数据导出多sheet页,无法全部固定标题行问题;
  4. 修复DefaultStreamExcelBuilder续写时重设工作簿类型错误;
  5. 基于DefaultStreamExcelBuilder重写DefaultExcelBuilder,在保证API简单便捷的情况下,根源上解决性能问题;
  6. 新增DefaultExcelBuilder、DefaultStreamExcelBuilder支持图片导出;
  7. 新增DefaultExcelBuilder、DefaultStreamExcelBuilder支持全局样式设置,隔行样式设置;
  8. 新增DefaultExcelBuilder、DefaultStreamExcelBuilder、模板ExcelBuilder均支持自定义行高度;
  9. 新增DefaultStreamExcelBuilder新增cancel、clear接口,增强资源主动清理能力;
  10. 新增各项ExcelBuilder单元测试,提升项目稳定性;
  11. 新增读取异常时,相关行以及内容提示,加快问题定位速度;
  12. 删除rowAccessWindowSize选项,默认采用最佳实践,也避免使用者不熟悉导致的错误使用,不予向下兼容;
  13. 修改autoWidthStrategy方法为widthStrategy方法,加强接口语意;
  14. 原DefaultStreamExcelBuilder的start(int waitQueueSize,Class[] groups)参数改为方法选项,waitQueueSize()、groups();
  15. 同一文件续写时支持同名称续写;
  16. 重构SaxExcelReader,提升代码可读性;
  17. CsvBuilder新增append功能,允许对已生成的文件进行数据追加;
  18. DefaultStreamExcelBuilder时间处理类增加缓存,进一步提升导出性能;

问题

  1. 因大面积重构,造成了部分的API无法兼容3.0.0.RC以下版本:
    删除rowAccessWindowSize选项;
  2. 原DefaultStreamExcelBuilder的start(int waitQueueSize,Class[] groups)参数改为方法选项,waitQueueSize()、groups();
// 新设定分组、等待队列容量方式
DefaultStreamExcelBuilder excelBuilder = DefaultStreamExcelBuilder.of(CommonPeople.class)
                .start(100,CommonPeople.class);

// 新设定分组、等待队列容量方式
DefaultStreamExcelBuilder excelBuilder = DefaultStreamExcelBuilder.of(CommonPeople.class)
                .groups(CommonPeople.class)
                .waitQueueSize(100)
                .start();

具体更新点如下:

  1. 新增csv追加数据方式
CsvBuilder<CsvPeople> csvBuilder = CsvBuilder.of(People.class);
for (int i = 0; i < 10; i++) {
    csvBuilder.append(data(1000));
}
Csv csv = csvBuilder.build();

AttachmentExportUtil.export(csv.getFilePath(), "test.csv", response);

// 该种方式会覆盖原append.csv文件
csv.write(Paths.get("/User/append.csv"));

// 该种方式会在原append.csv文件继续追加数据,而不是覆盖
csv.write(Paths.get("/User/append.csv"),true);
  1. 自定义高度(Bean形式)
@Data
@FieldDefaults(level = AccessLevel.PRIVATE)
@ExcelTable(sheetName = "人员信息", rowHeight = 50)
public class CommonPeople {

    @ExcelColumn(title = "姓名", index = 0)
    String name;

    @ExcelColumn(title = "年龄", index = 1)
    Integer age;

    @ExcelColumn(title = "是否会跳舞", groups = CommonPeople.class, index = 2)
    boolean dance;

    @ExcelColumn(title = "金钱", decimalFormat = "#,000.00", index = 3)
    BigDecimal money;
}

设定rowHeight即可。

3、自定义高度(模板方式)

<% DIRECTIVE SAFE_OUTPUT_OPEN; %>
<table>
    <caption>${sheetName}</caption>
    <thead>
        <tr style="background-color: #6495ED">
            <th colspan="3" style="text-align: center;vertical-align: middle;font-weight: bold;font-size: 14px;">产品介绍</th>
        </tr>
        <tr>
            <% for(title in titles){ %>
            <th>${title}</th>
            <% } %>
        </tr>
    </thead>
<% if(data!=null){ %>
    <tbody>
    <% for(item in data){ %>
    <tr style="height: 100px;">
        <td>${item.category}</td>
        <td>${item.name}</td>
        <td>${item.count}</td>
    </tr>
    <% } %>
</tbody>
<% } %>
</table>
<%
//关闭安全输出。
DIRECTIVE SAFE_OUTPUT_CLOSE;
%>

设定高度样式 style="height: 100px;"即可。

4、隔行样式设置

@ExcelColumn(order = 0, title = "姓名",style = {"title->color:red;","even->color:yellow;","odd->background-color:green;width:50"})
private String name;

odd、even对应奇偶行样式。

更多更新内容请查看:https://github.com/liaochong/myexcel/wiki

MyExcel优势 | Advantages

1、可生成任意复杂表格:本工具使用迭代单元格方式进行Excel绘制,可生成任意复杂度Excel,提供多种宽度策略;
2、零学习成本:使用Html作为模板,学习成本几乎为零;
3、支持常用背景色、边框、字体等样式设置:具体参见下方Style-support(样式支持)部分;
4、支持.XLS、.XLSX、.CSV:支持生成.xls、.xlsx后缀的Excel,支持.csv文件生成;
5、支持低内存SXSSF模式:支持低内存的SXSSF模式,可利用极低的内存生成.xlsx;
6、支持生产者消费者模式导出:支持生产者消费者模式导出,无需一次性获取所有数据,分批获取数据配合SXSSF模式实现真正意义上海量数据导出;
7、支持多种模板引擎:已内置Freemarker、Groovy、Beetl等常用模板引擎Excel构建器(详情参见文档Getting started),默认内置Beetl模板引擎(推荐引擎,Beetl文档);
8、提供默认Excel构建器,直接输出简单Excel:无需编写任何Html,已内置默认模板,可直接根据POJO数据列表输出;
9、支持SAX模式读取:支持SAX模式导入海量数据;
10、支持Excel容量设定:支持设定Excel容量,到达容量后自动新建Excel,可构建成zip压缩包导出;

导入示例

// (推荐)方式一:全部读取后处理,SAX模式,避免OOM,建议大量数据使用
List<ArtCrowd> result = SaxExcelReader.of(ArtCrowd.class)
        .sheet(0) // 0代表第一个,如果为0,可省略该操作
        .rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
        .beanFilter(ArtCrowd::isDance) // bean过滤
        .read(path.toFile());// 可接收inputStream

// (推荐)方式二:读取一行处理一行,可自行决定终止条件,SAX模式,避免OOM,建议大量数据使用
// readThen有两种重写接口,返回Boolean型接口允许在返回False情况下直接终止读取
SaxExcelReader.of(ArtCrowd.class)
        .sheet(0) // 0代表第一个,如果为0,可省略该操作
        .rowFilter(row -> row.getRowNum() > 0) // 如无需过滤,可省略该操作,0代表第一行
        .beanFilter(ArtCrowd::isDance) // bean过滤
        .readThen(path.toFile() ,artCrowd -> {System.out.println(artCrowd.getName);});// 可接收inputStream

public class ArtCrowd {
    // index代表列索引,从0开始
    @ExcelColumn(index = 0)
    private String name;

    @ExcelColumn(index = 1)
    private String age;

    @ExcelColumn(index = 2,dateFormatPattern="yyyy-MM-dd")
    private Date birthday;
}

导出示例

List<ArtCrowd> dataList = this.getDataList();
    Workbook workbook = DefaultExcelBuilder.of(ArtCrowd.class)
            .build(dataList);
    AttachmentExportUtil.export(workbook, "艺术生信息", response);
    // 加密导出
    // AttachmentExportUtil.encryptExport(workbook, "艺术生信息", response,"123456");
}
5a119468c54d7548d814da6e43847ccd58c.jpg.png
4d9c7c625e1e492c71386a03be1e1500f39.jpg.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,117评论 4 360
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 66,963评论 1 290
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 107,897评论 0 240
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,805评论 0 203
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,208评论 3 286
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,535评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,797评论 2 311
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,493评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,215评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,477评论 2 244
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 31,988评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,325评论 2 252
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 32,971评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,055评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,807评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,544评论 2 271
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,455评论 2 266

推荐阅读更多精彩内容