前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >几行代码就能实现复杂的 Excel 导入导出,这个工具类真心强大!

几行代码就能实现复杂的 Excel 导入导出,这个工具类真心强大!

作者头像
好好学java
发布于 2022-10-31 03:02:16
发布于 2022-10-31 03:02:16
63100
代码可运行
举报
运行总次数:0
代码可运行

今日推荐

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
减少 try-catch ,这样做才叫优雅!

功能介绍

IMPORT
  • ExcelHandle 核心处理器
  • ExcelWorkbookManage excel所有工作表管理
  • ExcelInitConfig 配置文件初始化
  • AbstractFileParser 文件转换类
alanpoi import有何优势?
  • 用户不需要额外引入poi等繁琐的jar
  • 毫秒级解析大文件,支持一键解析多sheet页签,不需要自己按照一定的格式循环匹配解析所有数据
  • 不管你的系统多么复杂,有多少个导入,alanpoi全部支持,而且准确返回你需要的对象,减轻开发者工作量
  • 目前外界业务越来越复杂,对各个功能要求也越来越严格,当然导入也不例外,alanpoi支持错误一键回写到excel,对应到每一行
  • alanpoi灵活可扩展,提供了ExcelConsumeInterface接口,可继承它,实现valid、error、end三个方法编写自己的业务
    • valid: 方法参数返回excel所有数据,用户可进行自我校验
    • error: 导入错误会回调
    • end: 方法参数返回校验成功的数据,valid校验失败的数据不会返回,用户可以自己操作持久化或者其他业务

怎么使用alanpoi实现导入

项目中使用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependency>
    <groupId>com.alanpoi</groupId>
    <artifactId>alanpoi-analysis</artifactId>
    <version>1.3.0</version>
</dependency>

简单一句话:一配置一继承一调用

一配置

在项目resources目录中新建excel-config.xml文件,cosume中配置自己的消费类路径,继承ExcelConsumeInterface接口,sheet中的vo是把当前sheet序列化的对象路径,column中当然就是配置vo中的属性了。

其中name可选字段,填了就是按照这个匹配excel列名,不填就是按照offset顺序;导入包含多个sheet就配置多个

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<?xml version = "1.0" encoding = "GB2312"?>
<exg name="excelId" version="1.0" file-type="excel">
  <excel id="ACCOUNT" consume="com.xxx.FinAccountImportHandler">
     <sheet index="0" row-start="1" column-start="0"
            vo="com.xxx.vo.FinAccountImportVO">
         <column name="公司/供应商编号" offset="1">companyCode</column>
         <column name="公司/供应商名称" offset="2">companyName</column>
         <column name="银行账号" offset="3">bankAccount</column>
         <column name="开户银行" offset="4">bankName</column>
     </sheet>
 </excel>
</exg>
一继承

consume类继承ExcelConsumeInterface接口,实现方法

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * when error will 调用
 *
 * @param excelError
 */
void error(ExcelError excelError);

/**
 * custom valid data
 *
 * @param workbookId
 * @param sheetDataList
 */
void validData(String workbookId, List<ExcelSheetData> sheetDataList, Map<Serializable, Object> excelParam);

/**
 * @param sheetDataList return success data
 */
void end(List<ExcelSheetData> sheetDataList, Map<Serializable, Object> excelParam);
一调用

用户调用ExcelExportUtil类的customImportData即可,参数excelId就是excel-conifg.xml中配置的id

Export

描叙

能够用一行代码实现绝不用第二行,如果一行不行,那就再加一行!

模式

注解模式导出:

  • ExcelSheet注解: 用于导入类上,可制定sheet名,列头的颜色、字体、高度、宽度
  • ExcelColum注解: 用于导入类的属性上,可指定列头的名称,单元格的样式
  • DateFormat注解: 用于导入类的属性上, 可以按照指定格式输出到excel,默认"yyyy/MM/dd"
  • NumFormat注解: 用于导入类的属性上,可以按照指定格式输出到excel,默认"00.00"

样例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@ExcelSheet(name = "测试", backColor = AlanColors.GREEN, font = "宋体", fontSize = 25)
@Data
public class ExportVO {
    @ExcelColumn(name = "名称", width = 32, link = "${url}")
    private String name;

    @ExcelColumn(name = "值")
    private String value;

    @ExcelColumn(name = "金额")
    @NumFormat(value = "0000.00##")
    private BigDecimal amount;

    @ExcelColumn(name = "时间格式化")
    @DateFormat(value = "yyyy-MM-dd hh:mm:ss")
    private Date dateTime;

    @DateFormat
    @ExcelColumn(name = "日期格式化")
    private java.sql.Date date;
    
    @ExcelColumn(isExist = false)
    private String url;
}
使用

方式一. 直接导出到浏览器

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ExcelExportUtil.export(Colletion<?>,Class,HttpServletRequest,HttpServletResponse,fileName);

方式二. 调用getWorkbook获取工作表,自行处理workbook

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ExcelExportUtil.getWorkbook(Collection<?> singleSheetData, Class<?> c)
高级使用

示例一:导出指定列(动态导出列)

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<ExportVO> list = new ArrayList<>();
for (int i = 0; i < 500; i++) {
    ExportVO exportVO = new ExportVO();
    exportVO.setName("name" + i);
    exportVO.setValue(new BigDecimal(123.11 + i * 0.09));
    exportVO.setAmount(new BigDecimal(6666.666 + i * 10));
    exportVO.setDate(new Date(132324343 + i * 100));
    exportVO.setDateTime(new java.util.Date());
    list.add(exportVO);
}
List<String> colList = new ArrayList<>();
//按照顺序仅导出add的列
colList.add("name");
colList.add("value");
//调用获取workbook对象;也可以直接调用exportSpecifyCol方法导出到浏览器
Workbook workbook = ExcelExportUtil.getWorkbookSpecifyCol(list, ExportVO.class, colList);

示例二:多sheet页签导出

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
List<ExportVO> list = new ArrayList<>();
List<Export2VO> list2 = new ArrayList<>();
for (int i = 0; i < 500; i++) {
    ExportVO exportVO = new ExportVO();
    exportVO.setName("name" + i);
    exportVO.setValue(new BigDecimal(123.11 + i * 0.09));
    exportVO.setAmount(new BigDecimal(6666.666 + i * 10));
    exportVO.setDate(new Date(132324343 + i * 100));
    exportVO.setDateTime(new java.util.Date());
    list.add(exportVO);
    Export2VO export2VO = new Export2VO();
    export2VO.setName("name" + i);
    export2VO.setValue("value" + i);
    export2VO.setAmount(new BigDecimal(6666.666 + i * 10));
    export2VO.setDate(new Date(132324343 + i * 100));
    export2VO.setDateTime(new java.util.Date());
    list2.add(export2VO);
}
Map<Class<?>, Collection<?>> map = new HashMap<>();
map.put(ExportVO.class, list);
map.put(Export2VO.class, list2);
//调用获取workbook对象;也可以直接调用exportByMultiSheet方法导出到浏览器
Workbook workbook = ExcelExportUtil.getWorkbookByMultiSheet(map);

代码已经开源,地址:

https://github.com/alan-et/alanpoi/tree/develop/alanpoi-analysis

来源:blog.csdn.net/weixin_43225813/

article/details/108995011

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-06-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 好好学java 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
1 条评论
热度
最新
您好,链接访问不到
您好,链接访问不到
回复回复点赞举报
推荐阅读
react-react-dom v6 知识整合
1. BrowserRouter / HashRouter 相当于容器(类似router-view),用于指定路由的模式
用户9914333
2022/12/14
6.6K0
react-react-dom v6 知识整合
react 中router v6 与 v5 区别
react-router-dom 更新到v6 , 本文分享下v6 与 v5 的一些区别
用户9914333
2022/07/22
2.9K0
React Router V6详解
SAP全称是【single-page application】,中文译为单页面应用。它是网站应用的一种模型,可以动态重写当前的页面来与用户交互,而不需要重新加载整个页面。相对于传统的 Web 应用程序,单页应用做到了前后端分离,即后端只负责处理数据提供接口,而页面逻辑和页面渲染都交由前端处理。前端发展到现在,单页应用的使用已经很广泛,目前时兴的 React、Vue、Angular 等前端框架均采用了 SPA 原则。
xiangzhihong
2023/01/06
8.2K0
145. 精读《React Router v6》
React Router v6 alpha 版本发布了,本周通过 A Sneak Peek at React Router v6 这篇文章分析一下带来的改变。
黄子毅
2022/03/14
1.4K0
React-Router V6 使用详解
2.去除Switch中的<Redirect>,用react-router-dom中的Redirect 替代,或者用 <Navigate> 实现
程序狗
2021/12/17
4K0
「React进阶」react-router v6 通关指南
不知不觉 react-router 已经到了 v6 版本了,可能很多同学发现,v6相比之前的 v5 有着翻天覆地的变化,因为最近接触到了 React 的新项目,用到了 v6 版本的 react-router,亲身体验发现这还是我认识的 router 吗 ?从 api 到原理都有较大的改动,所以今天就和大家一起看一下新版路由的变化。
用户6835371
2022/03/31
5.7K0
「React进阶」react-router v6 通关指南
React-Router v6
当然,还有更酸爽的操作,直接在路由里定义<Route>的<Route>,然后用接下来的一个新API:Outlet
biaoblog.cn 个人博客
2022/08/11
2K0
React-Router v6
React框架 Router
​ 1.明确好界面中的导航区、展示区 ​ 2.导航区的a标签改为Link标签 ​ <Link to="/xxxxx">Demo</Link> ​ 3.展示区写Route标签进行路径的匹配 ​ <Route path='/xxxx' component={Demo}/> ​ 4.<App>的最外侧包裹了一个<BrowserRouter>或<HashRouter>
郭顺发
2023/07/17
2770
react-router-dom使用指南(最新V6)
注意:BrowserRouter组件最好放在最顶层所有组件之外,这样能确保内部组件使用 Link 做路由跳转时不出错
江一铭
2022/09/23
4.7K0
08-React路由6.3.0(高亮, 嵌套, 参数传递... )
语法的变化: component={About} 改为了 element={About}
彼岸舞
2022/08/24
1.5K0
React Router 邦邦两拳🥊 🥊
这是我参与11月更文挑战的第16天,活动详情查看:2021最后一次更文挑战」 简介
用户4793865
2023/01/12
3.7K0
使用React Router v6 进行身份验证完全指南
React Router v6是React应用程序的一个流行且功能强大的路由库。它提供了一种声明式的、基于组件的路由方法,并能处理URL参数、重定向和加载数据等常见任务。
前端修罗场
2022/07/29
15.3K1
React Router 路由
https://react-router.docschina.org/ 分三个版本: web native anywhere
P轴
2022/11/18
8070
React Router初学者入门指南(2023版)
如果你对React Router还不熟悉,你可能习惯使用普通的链接(a标签)在你的应用程序中进行导航。然而,当你想在导航时保留应用程序的当前状态时,就会出现问题。不幸的是,普通的链接通常会触发页面刷新来显示组件,从而破坏用户体验。这就是React Router的用武之地。
前端达人
2023/10/27
1.2K0
React Router初学者入门指南(2023版)
react进阶用法完全指南
React调用回调函数,正确设置this指向的三种方法 通过bind this.increment = this.increment.bind(this); 通过箭头函数 <button onClick={this.multi}>点我*10</button> multi = () => { this.setState({ count: this.state.count * 10 }) } 箭头函数包裹 <button onClick={() => {this.muti2(
xiaofeng123aa
2022/09/26
6.1K0
React-Router-基本使用
路由维护了 URL 地址和组件的映射关系, 通过这个映射关系, 我们就可以根据不同的 URL 地址,去渲染不同的组件。
杨不易呀
2023/09/30
3270
大爱并发模式!React Router 路由跳转最佳实践的秘密
在 Next.js 大热之前,React Router 是 React 生态中,最流行的路由库。也是我最喜爱的路由库。不过随着版本的迭代,React Router 变得越来越庞大了。他的复杂度已经快要比得上一个框架了。
用户6901603
2024/06/07
6040
大爱并发模式!React Router 路由跳转最佳实践的秘密
react-router-middleware-plus开源啦 | 基于react-router v6的零成本式路由权限解决方案
你还在为自行适配react-router v6版本的权限步骤繁杂,多重鉴权逻辑嵌套而烦恼吗?
胡哥有话说
2022/11/22
1.8K1
react-router-middleware-plus开源啦 | 基于react-router v6的零成本式路由权限解决方案
react-router6.x路由配置及导航
通过useSearchParams可以获取链接上的id useSearchParams文档
明知山
2022/05/05
1.6K0
react-router6.x路由配置及导航
干货!我是如何在React-Router 6.10最新版本实现约定式路由的
最近在学习react-router v6.10+,由于新项目又要配置路由,长期配置路由这种重复性工作真是非常xx。而我有幸曾接触过小程序开发和和NextJS,一向对于这种约定式路由非常向往,所以寻思了一下,能否自己手搓一个?
源心锁
2023/04/27
4.6K0
干货!我是如何在React-Router 6.10最新版本实现约定式路由的
相关推荐
react-react-dom v6 知识整合
更多 >
LV.2
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档