七库下载 手游攻略 手游攻略 spring boot文件导出,springboot导出表格

spring boot文件导出,springboot导出表格

时间:2024-04-09 01:31:05 来源:头条 浏览:0

背景:较老的项目主要使用POI框架来导入导出Excel数据,但经常出现OOM的情况,导致整个服务无法使用。之后逐渐迁移到EasyExcel,但简直难以使用。

EasyExcel是阿里巴巴开源插件之一,主要是由于POI框架使用复杂、配合SAX解析模式工作困难、数据量大时容易出现OOM、POI并发执行等原因造成的。解决错误问题。主要解决方案:解压并加载文件,逐行加载,丢弃样式字体等非必要数据,以减少内存占用。

今天的文章我们将基于SpringBoot实现EasyExcel集成。这样其实方便大家直接使用。

SpringBoot项目集成依靠集成创建一个基本的SpringBoot项目。例如,这里使用SpringBoot 2.7.2版本。

org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-test test 将EasyExcel集成到SpringBoot中非常方便,只需引入相应的pom依赖即可。将EasyExcel 依赖项添加到上述依赖项中。

com.alibaba easyexcel 2.2.11EasyExcel目前最新稳定版本2.2.11。如果您想查看开源项目或最新版本,可以在GitHub 上找到:https://github.com/alibaba/easyexcel。

为了方便和简化代码的编写,这里也引入了Lombok的依赖,并且在后续的代码中也使用了相应的注解。

org.projectlombok lombok 1.18.22 正式开始编写业务相关代码。如果您想直接获取完整源码,可以通过阅读本文并参考源码并在公众号“程序新视野”回复“1007”来获取完整源码。

实现实体类涉及创建一个其成员为成员的实体类,并在该实体类中填充基本的个人信息。

@Datapublic class Member { /** * EasyExcel 用法:导出时忽略该字段*/@ExcelIgnore private Integer id; @ExcelProperty('username') @ColumnWidth(20) private String username; /** * EasyExcel 用法:格式化日期*/@ColumnWidth(20) @ExcelProperty('Birthdate') @DateTimeFormat('yyyy-MM-dd') private Datebirthday; /** * EasyExcel 使用自定义转换器。 */@ColumnWidth(10 ) @ExcelProperty(value='gender', Converter=GenderConverter.class) private Integer Gender;} 为了尽可能多地演示EasyExcel 的相关功能,在类中使用了EasyExcel 的一些常用注解。

@ExcelIgnore:忽略该字段;@ExcelProperty('Username'):设置列名为“用户名”;@ColumnWidth(20):设置表格列宽为20;@DateTimeFormat('yyyy-MM-dd'):按照指定格式格式化日期; @ExcelProperty(value='Gender', Converter=GenderConverter.class):自定义内容转换器,类似枚举实现,'男',转换为“女”。数值“0”或“1”。 GenderConverter转换器的代码实现如下。

public class GenderConverterimplements Converter { private static Final String MAN='Male'; private static Final String WOMAN='Female'; @Override public Class supportJavaTypeKey() { //实体类的对象属性类型return Integer.class; } @Override public CellDataTypeEnum supportExcelTypeKey() { //Excel 中对应的CellData 属性类型return CellDataTypeEnum.STRING; } @Override public Integer ConvertToJavaData(CellData cellData, ExcelContentProperty ExcelContentProperty, GlobalConfiguration globalConfiguration) { //从单元格字符串中读取数据。 ); //确定Excel中的值,并将其转换为期望值if (MAN.equals(gender)) { return 0; } else if (WOMAN.equals(gender)) { return 1; } return null ; } @ Override public CellData ConvertToExcelData(Integer integer, ExcelContentProperty ExcelContentProperty, GlobalConfiguration globalConfiguration) { //标识实体类中检索到的值,将其转换为Excel 期望的值,并将其封装为CellData 对象if (integer==null) { return new CellData(''); } else if (integer==0) { return new CellData(MAN); } else if (integer==1) { return new CellData(WOMAN); } return new CellData('') ; } }如果版本不同,convertToJavaData和convertToExcelData方法参数会不同,对应的值获取方式也会不同,所以使用时请注意版本。

实现业务逻辑是为了促进验证功能。 DAO 层逻辑不再实现。数据直接通过服务层进行封装。首先我们看一下导出功能的业务类实现。

MemberService 实现定义了MemberService 接口。

public Interface MemberService { /** * 获取所有成员信息* @return 成员信息列表*/List getAllMember();} 定义MemberServiceImpl实现类。

@Service('memberService')public class MemberServiceImplements MemberService { @Override public List getAllMember() { //在此构建测试数据。具体的业务场景可以从数据库等中检索。 List list=new ArrayList();Member member=new Member(); member.setUsername('张三'); member.setBirthday(getDate(1990, 10, 11)); member.setGender(0); list.add (member); Member member1=new Member(); member1.setUsername('王红'); member1.setBirthday(getDate(1999, 3, 29)); member1.setGender(1); list.add(member1); Member member2=new Member(); member2.setUsername('李四'); member2.setBirthday(getDate(2000, 2, 9)); member2.setGender(0); list.add(member2); return list; } private Date getDate(intyear, intmonth,intday) { Calendar Calendar=Calendar.getInstance(); Calendar.set(year,month,day); return Calendar.getTime(); }} 该数据是模拟静态数据并返回成员列表。

在控制器层实现了一个简单的导出实现。

/** * 常规导出方法*/@RequestMapping('/export1') public void exportMembers1(HttpServletResponse response) throws IOException { List Members=memberService.getAllMember(); //设置文本自省response.setContentType ('application/vnd . ms-excel'); //设置字符编码response.setCharacterEncoding('utf-8'); //设置响应头response.setHeader('Content-disposition', 'attachment;filename=demo.xlsx'); EasyExcel .write(response.getOutputStream(), Member.class).sheet('member list').doWrite(members); } 这个实现方法非常简单明了,只需使用EasyExcel 的write 方法处理查询到的数据即可将其写入表格。

通过访问浏览器中的相应链接下载以下Excel 内容。

轻松导出

如果需要对导出的Excel 执行任何格式设置,则应使用导出策略实施。

自定义导入实现在EasyExcel 执行write 方法后获取ExcelWriterBuilder 类。可以通过该类的registerWriteHandler方法来设置一些处理策略。

这里,我们首先实现通用格式化策略工具类CommonCellStyleStrategy。

public class CommonCellStyleStrategy { /** * 设置单元格样式(仅示例) * * @return style Strategy */public static HorizontalCellStyleStrategy gethorizontalCellStyleStrategy() { //标题策略WriteCellStyle headerCellStyle=new WriteCellStyle( ); //水平对齐和居中标题headerCellStyle.set HorizontalAlignment(horizontalAlignment.CENTER); //背景颜色headerCellStyle.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex()); WriteFont headerFont=new WriteFont( ); headerFont.setFontHeightInPoints((short) 15); headerCellStyle.setWriteFont (headerFont) ; //自动换行headerCellStyle.setWrapped(Boolean.FALSE); //内容策略WriteCellStyle contentCellStyle=new WriteCellStyle(); //允许为data 设置数据格式。这里49 表示允许所有设置contentCellStyle.setDataFormat( (short) 49); //要设置背景颜色:FillPatternType 必须指定为FillPatternType.SOLID_FOREGROUND。否则,背景颜色将不可见。表头默认为FillPatternType,所以不需要指定contentCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND); contentCellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERC ENT. getIndex()); //设置内容左对齐contentCellStyle.setHorizontal Alignment( HorizontalAlignment.LEFT); //设置字体WriteFont contentFont=new WriteFont() ; contentFont.setFontHeightInPoints((short) 12); contentCellStyle.setWriteFont(contentFont); //设置自动换行contentCellStyle.setWrapped(Boolean.FALSE); //设置边框样式和颜色contentCellStyle.setBorderLeft(BorderStyle.MEDIUM); contentCellStyle .setBorderTop(BorderStyle.MEDIUM); contentCellStyle.setBorderRight(BorderStyle.MEDIUM); contentCellStyle .contentCellStyle.setLeftBorderColor(IndexedColors.YELLOW.getIndex()); contentCellStyle.setRightBorderColor( IndexedColors.ORANGE.getIndex()); //将格式添加到单元格样式策略return newhorizontalCellStyleStrategy(headerCellStyle, contentCellStyle); }} 此类的一个示例设置Excel 的基本格式。

接下来,让我们实现CellWriteHandler 实现类,以对单元格内容进行细粒度控制。

/** * 实现CellWriteHandler接口,用于精确控制单元格样式* * @author sec * @version 1.0 * @date 2022/7/31 **/public class CustomCellWriteHandlerimplements CellWriteHandler { /** * 创建单元格之前的操作*/@覆盖public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer integer, Integer integer1, Boolean aBoolean) { } /** * 创建单元格后的操作*/@Override public void afterCellCreate (WriteSheetHolder writeSheetHolder) , WriteTableHolder writeTableHolder , Cell cell, Head head, Integer integer, Boolean aBoolean) { } /** * 单元格内容转换后的操作*/@Override public void afterCellDataConverted(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, CellData cellData, Cell cell, Head head, Integer integer, Boolean aBoolean) { } /** * 单元格处理后的操作(值被写入) */@Override public void afterCellDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, List list , Cell cell, Head head, Integer integer, Boolean isHead ) { //设置超链接if (isHead cell.getRowIndex()==0 cell.getColumnIndex()==0) { CreationHelper helper=writeSheetHolder.getSheet( ).getWorkbook().getCreationHelper( ); Hyperlink hyperlink=helper.createHyperlink (HyperlinkType. URL); hyperlink.setAddress('https://github.com/alibaba/easyexcel'); cell.setHyperlink(hyperlink); } //Cell 正确设置格式boolean bool=isHead cell.getRowIndex()==1; if ( bool) { //获取工作簿Workbook workbook=writeSheetHolder.getSheet().getWorkbook(); CellStyle cellStyle=workbook.createCellStyle (); 字体cellFont=workbook.createFont(); cellFont.setBold(Boolean.TRUE); cellFont.setFontHeightInPoints( (短) 14); cellFont.setColor(IndexedColors.SEA_GREEN.getIndex()); cellStyle.setFont(cellFont) ; cell.setCellStyle(cellStyle); } }} 这里,超链接是单元格标题。

上面定义的两种策略可以让你在导出Excel时使用以上两种策略。

/** * 基于策略和拦截器导出*/@RequestMapping('/export2') public void exportMembers2(HttpServletResponse response) throws IOException { List Members=memberService.getAllMember(); //设置文本自省响应.setContentType(' application /vnd.ms-excel'); //设置字符编码response.setCharacterEncoding('utf-8'); //设置响应头response.setHeader('Content-disposition' , 'attachment;filename=demo.xlsx ) ' ); EasyExcel.write(response.getOutputStream(), Member.class).sheet('成员列表') //注册通用格式Strategy.registerWriteHandler(CommonCellStyleStrategy.gethorizo ntalCellStyleStrategy()) //设置自定义格式Strategy.registerWriteHandler(new CustomCellWriteHandler()) .doWrite(members); }通过浏览器访问上述界面时,导出的Excel格式为:Masu.

格式化Excel

可以看到导出的Excel已经带有一定的格式了。标题“用户名”还包含相应的超链接。对于其他更复杂的控件,策略类中提供了更多控件。

结果导入同步检索实现了所谓结果导入同步检索。这意味着当执行导入操作时,导入的内容会被解析并封装在结果列表中并返回给业务,业务代码会集中处理该内容。列表中的数据。

首先我们看一下如何实现同步导入。

/** * 从Excel 导入成员列表*/@RequestMapping(value='/import1', method=RequestMethod.POST) @ResponseBody public void importMemberList(@RequestPart('file') MultipartFile file) throws IOException { List list=EasyExcel .read(file.getInputStream()) .head(Member.class) .sheet() .doReadSync(); for (Member member : list) { System.out.println(member); } }上述代码中: 注意最终调用doReadSync() 方法。

这里,我们直接使用PostMan来发出相应的文件上传请求。

邮递员导入

当您运行导入请求时,您将看到相应的解析对象被打印到控制台。

会员(id=null, 用户名=张三, 生日=星期日, 1990 年11 月11 日00:00:00 CST, 性别=0) 会员(id=null, 用户名=王红, 生日=4 月29 日, 星期四00:00:00 CST 1999 , 性别=1) member ( id=null, username=Li Si,birthday=Thu Mar 09 00:00:00 CST 2000,gender=0)表示上传成功,解析成功。

通过监听实现导入在上面的例子中,是通过同步获取结果列表的方式来实现导入的,但是也可以通过监听的方式来实现导入。这种格式可以让你同时达到业务逻辑解析和处理的效果。

定义一个监听器。

public class MemberExcelListener extends AnalysisEventListener { @Override public void invoke(Member member, AnalysisContext AnalysisContext) { //做一些事情System.out.println('readMember=' + member); //做一些事情} @Override public void doAfterAllAnalysed( AnalysisContext AnalysisContext ) { //Do Something System.out.println('读取Excel已完成'); //Do Something }} MemberExcelListener对每条数据进行相应的业务逻辑处理即可。

对外接口实现如下:

/** * 根据监听模式从Excel导入成员列表*/@RequestMapping(value='/import2', method=RequestMethod.POST) @ResponseBody public void importMemberList2(@RequestPart('file') MultipartFile file ) throws IOException { //方式一:同步读取,返回解析结果,比如返回一个List,然后对对应的数据进行密集处理。 //方法2:与doReadSync()方法相比,doRead()方法在以下情况下被调用:就是用MemberExcelListener对数据进行一一处理; //这里以方法2为例EasyExcel.read(file.getInputStream(), Member.class, new MemberExcelListener()).sheet()。 doRead(); } 这里使用的doRead()方法用于执行读操作。使用PostMan再次上传Excel,输出日志如下。

read member=member(id=null, username=张三,birthday=星期日,11月11日00:00:00 CST 1990,性别=0) read member=member(id=null,username=张三,birthday=星期四)4月29日00:00:00 CST 1999,gender=1) Read member=member(id=null, username=李四,birthday=Thursday March 9th 00:00:00 CST 2000,gender=0) Excel读取完成,表明分析成功。分析过程中的业务逻辑处理。

总结本文基于集成EasyExcel的SpringBoot实现,介绍了EasyExcel在现实中的具体应用。您可以根据需要进行调整。同时可以基于自定义转换器、自定义策略、自定义监听器等灵活应用于不同场景。我希望这篇文章对您有所帮助。

标题:spring boot文件导出,springboot导出表格
链接:https://www.7kxz.com/news/gl/20374.html
版权:文章转载自网络,如有侵权,请联系删除!
资讯推荐
更多
天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学

天地劫幽城再临归真4-5攻略:第四章归真4-5八回合图文通关教学[多图],天地劫幽城再临归真4-5怎么样八回合内通

2024-04-09
航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全

航海王热血航线艾尼路怎么玩?艾尼路加点连招攻略大全[多图],航海王热血航线艾尼路怎么加点?艾尼路怎么连招?关

2024-04-09
坎公骑冠剑国际服怎么玩?国际服新手攻略

坎公骑冠剑国际服怎么玩?国际服新手攻略[多图],坎公骑冠剑国际服的玩法是什么样的?关于游戏中的一些新手玩法

2024-04-09
王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略

王者荣耀鸿运6+1地狱之眼怎么抽?鸿运抽奖地狱之眼概率获取攻略[多图],王者荣耀鸿运抽奖活动的奖池中还有传说

2024-04-09