该样例实现了:

1、EasyExcel和原生poi实现了添加序号列

2、单Sheet和多Sheet页导出

3、设置好的打印样式,导出即符合打印版式。

1、引入EasyExcel Maven依赖

<!-- excel导入导出 -->
<dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.2.10</version>
</dependency>

2、给实体类添加导出注解,以及配置导出样式注解

import java.io.Serializable;
import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.FillPatternType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import com.alibaba.excel.annotation.ExcelIgnore;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.alibaba.excel.annotation.write.style.ContentFontStyle;
import com.alibaba.excel.annotation.write.style.ContentStyle;
import com.alibaba.excel.annotation.write.style.HeadFontStyle;
import com.alibaba.excel.annotation.write.style.HeadRowHeight;
import com.alibaba.excel.annotation.write.style.HeadStyle;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
//设置Excel head高度
@HeadRowHeight(30)
//设置Excel head样式
@HeadStyle(wrapped = true,fillPatternType = FillPatternType.NO_FILL,borderTop = BorderStyle.THIN,borderBottom = BorderStyle.THIN,borderLeft = BorderStyle.THIN,borderRight = BorderStyle.THIN,topBorderColor = 8,bottomBorderColor = 8,leftBorderColor = 8,rightBorderColor = 8,verticalAlignment = VerticalAlignment.CENTER,horizontalAlignment = HorizontalAlignment.CENTER)
//设置Excel head字体
@HeadFontStyle(fontName = "宋体",fontHeightInPoints = 12,bold = true)
//设置Excel默认列宽
@ColumnWidth(14)
//设置Excel 正文内容样式
@ContentStyle(wrapped = true,borderTop = BorderStyle.THIN,borderBottom = BorderStyle.THIN,borderLeft = BorderStyle.THIN,borderRight = BorderStyle.THIN,topBorderColor = 8,bottomBorderColor = 8,leftBorderColor = 8,rightBorderColor = 8,verticalAlignment = VerticalAlignment.CENTER,horizontalAlignment = HorizontalAlignment.CENTER)
//设置Excel 正文字体样式
@ContentFontStyle(fontName = "宋体",fontHeightInPoints = 12)
@TableName(value = "t_test")
public class Test implements Serializable {private static final long serialVersionUID = 1L;@ExcelIgnore@TableId(value = "id",type = IdType.AUTO)private Integer id;//这里再次设置列宽会覆盖上面设置的默认列宽@ColumnWidth(20)@ExcelProperty(value = {"测试1标题"},index=1)@TableField(value = "column1")private String column1;@ExcelProperty(value = {"测试2标题"},index=2)@TableField(value = "column2")private String column2;@ExcelProperty(value = {"测试3标题"},index=3)@TableField(value = "column3")private String column3;@ExcelProperty(value = {"测试4标题"},index=4)@TableField(value = "column4")private String column4;@ExcelProperty(value = {"测试5标题"},index = 5)@TableField(value = "column5")private String column5;@ExcelProperty(value = {"测试6标题"},index = 6)@TableField(value = "column6")private String column6;@ExcelProperty(value = {"测试7标题"},index = 7)@TableField(value = "column7")private String column7;@ExcelProperty(value = {"测试8标题"},index = 8)@TableField(value = "column8")private String column8;}

3.设置序号列样式


import org.apache.poi.ss.usermodel.BorderStyle;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;/*** 列样式工具* 1.该工具实现设置了表格头的样式和表格内容的样式* 2.该工具类设置的样式建议和Test实体类中的样式相同* 3.该工具类设置的样式就是为了给自定义序号列使用**/
public class CellStyleUtil {public static CellStyle getHeaderStyle(Workbook book) {CellStyle cellStyle = book.createCellStyle();//设置水平居中cellStyle.setAlignment(HorizontalAlignment.CENTER);//设置垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置内容超出自动换行cellStyle.setWrapText(true);//设置边框为细边框,并且颜色为黑色cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setTopBorderColor((short)8);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBottomBorderColor((short)8);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setLeftBorderColor((short)8);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setRightBorderColor((short)8);//设置字体为宋体,字体加粗,字体大小为12Font font = book.createFont();font.setBold(true);font.setFontName("宋体");font.setFontHeightInPoints((short)12);cellStyle.setFont(font);return cellStyle;}public static CellStyle getContentStyle(Workbook book) {CellStyle cellStyle = book.createCellStyle();//设置水平居中cellStyle.setAlignment(HorizontalAlignment.CENTER);//设置垂直居中cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);//设置内容超出自动换行cellStyle.setWrapText(true);//设置边框为细边框,并且颜色为黑色cellStyle.setBorderTop(BorderStyle.THIN);cellStyle.setTopBorderColor((short)8);cellStyle.setBorderBottom(BorderStyle.THIN);cellStyle.setBottomBorderColor((short)8);cellStyle.setBorderLeft(BorderStyle.THIN);cellStyle.setLeftBorderColor((short)8);cellStyle.setBorderRight(BorderStyle.THIN);cellStyle.setRightBorderColor((short)8);//设置字体为宋体,字体不加粗,字体大小为12Font font = book.createFont();font.setBold(false);font.setFontName("宋体");font.setFontHeightInPoints((short)12);cellStyle.setFont(font);return cellStyle;}
}

4.自定义添加导出“序号”列,需自定义一个类并实现EasyExcel的RowWriteHandler接口


import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Workbook;
import com.alibaba.excel.write.handler.RowWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
/*** 自定义EasyExcel Row**/
public class CustomRowWriteHandler implements RowWriteHandler{private CellStyle headerStyle;private CellStyle contentStyle;@Overridepublic void beforeRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Integer rowIndex,Integer relativeRowIndex, Boolean isHead) {}/*** 行创建后执行此方法*/@Overridepublic void afterRowCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Integer relativeRowIndex, Boolean isHead) {//创建一个单元格Cell cell = row.createCell(0);//给表格头样式赋值if (headerStyle == null) {Workbook workbook = writeSheetHolder.getSheet().getWorkbook();headerStyle = CellStyleUtil.getHeaderStyle(workbook);}//给表格内容样式赋值if (contentStyle == null) {Workbook workbook = writeSheetHolder.getSheet().getWorkbook();contentStyle = CellStyleUtil.getContentStyle(workbook);}//设置列宽0列8个字符宽度(poi的列宽是通过字符个数来确定的,一个列宽为一个字符的1/256)writeSheetHolder.getSheet().setColumnWidth(0, 8 * 256);if (row.getRowNum() == 0) {cell.setCellValue("序号");cell.setCellStyle(headerStyle);}else {cell.setCellValue(relativeRowIndex+1);cell.setCellStyle(contentStyle);}}@Overridepublic void afterRowDispose(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row,Integer relativeRowIndex, Boolean isHead) {}}

5、给导出Excel添加打印样式

import org.apache.poi.ss.usermodel.PrintSetup;
import org.apache.poi.ss.usermodel.Sheet;
import com.alibaba.excel.write.handler.SheetWriteHandler;
import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
/*** 自定义EasyExcel Sheet**/
public class CustomSheetWriteHandler implements SheetWriteHandler{@Overridepublic void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {}@Overridepublic void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {//得到SheetSheet sheet = writeSheetHolder.getSheet();//设置将所有列调整为一页sheet.setFitToPage(true);//设置打印内容水平居中显示sheet.setHorizontallyCenter(true);//设置打印页面边距sheet.setMargin(Sheet.TopMargin, 0.3);sheet.setMargin(Sheet.BottomMargin, 0.5);sheet.setMargin(Sheet.LeftMargin, 0.3);sheet.setMargin(Sheet.RightMargin, 0.3);//打印设置对象PrintSetup print = sheet.getPrintSetup();//并缩减打印输出只有一页宽print.setFitHeight((short)0);//设置竖屏打印(false),横屏打印(true)print.setLandscape(false);//设置A4纸打印print.setPaperSize(PrintSetup.A4_PAPERSIZE);}
}

6、导出Controller代码

import java.io.IOException;
import java.net.URLEncoder;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.support.ExcelTypeEnum;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.frame.common.easyExcel.CustomRowWriteHandler;
import com.frame.common.easyExcel.CustomSheetWriteHandler;
import com.frame.system.entity.Test;
import com.frame.system.service.ITestService;
import io.swagger.annotations.Api;@Api(tags = {"测试操作接口:TestController"})
@RestController
@RequestMapping("/test")
public class TestController {@Autowiredprivate ITestService testService;/*** 单Sheet页导出* @param test* @param req* @param res*/@PostMapping("excel")public void export(Test test,HttpServletRequest req,HttpServletResponse res) {try {String fileName = URLEncoder.encode("测试", "UTF-8").replaceAll("\\+", "%20");List<Test> list = this.testService.list();res.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");res.setCharacterEncoding("utf-8");res.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//这里需要注册自己定义的处理器CustomSheetWriteHandler,CustomRowWriteHandler,否则不起作用EasyExcel.write(res.getOutputStream(), Test.class).excelType(ExcelTypeEnum.XLSX).registerWriteHandler(new CustomSheetWriteHandler()).registerWriteHandler(new CustomRowWriteHandler()).sheet(fileName).doWrite(list);} catch (IOException e) {e.printStackTrace();}}/*** 多Sheet页导出* @param test* @param req* @param res*/@PostMapping("excelSheets")public void exportSheets(Test test,HttpServletRequest req,HttpServletResponse res) {ExcelWriter excelWriter = null;try {String fileName = URLEncoder.encode("测试1", "UTF-8");res.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");res.setCharacterEncoding("utf-8");res.setHeader("Content-disposition", "attachment;filename*=utf-8''" + fileName + ".xlsx");//这里需要注册自己定义的处理器CustomSheetWriteHandler,CustomRowWriteHandler,否则不起作用excelWriter = EasyExcel.write(res.getOutputStream(), Test.class).excelType(ExcelTypeEnum.XLSX).registerWriteHandler(new CustomSheetWriteHandler()).registerWriteHandler(new CustomRowWriteHandler()).build();for(int i=1;i<5;i++) {IPage<Test> page = new Page<>(i,2000);List<Test> list = this.testService.page(page).getRecords();WriteSheet writeSheet = EasyExcel.writerSheet(i, "测试"+i+"sheet").build();excelWriter.write(list, writeSheet);}} catch (IOException e) {e.printStackTrace();}finally {if(null != excelWriter) {excelWriter.finish();}}}
}

提示:

EasyExcel 中提供了几个接口,分别是:

1、SheetWriteHandler 可实现自己的Sheet页逻辑

2、RowWriteHandler 可实现自己的Row逻辑

3、CellWriteHandler 可实现自己的Cell逻辑

其它方面可多看看EasyExcel:源码,EasyExcel本质上也是引用的POI 工具,如果还不满足需求,可直接导入POI Maven依赖,进行原生编写。

EasyExcel 导出 excel(二)添加序号列,设置excel打印样式,导出即可打印相关推荐

  1. mysql自定义序号_MySQL数据库之在mysql中给查询的结果添加序号列

    本文主要向大家介绍了MySQL数据库之在mysql中给查询的结果添加序号列 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一:第一种: select   (@i:=@i+1)  ...

  2. MySQL给查询结果添加序号列的书写格式

    一.给查询结果添加序号列的方法 1.方法一 set @counter=0; SELECT @counter:=@counter+1 as rank,t.s_score FROM score t 2.方 ...

  3. mysql怎么给数据加序号_MySQL数据库之在mysql中给查询的结果添加序号列

    本文主要向大家介绍了MySQL数据库之在mysql中给查询的结果添加序号列 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 一:第一种: select   (@i:=@i+1)  ...

  4. ASP.NET repeater添加序号列的方法

    ASP.NET repeater添加序号列的方法 1.<itemtemplate> <tr><td> <%# Container.ItemIndex + 1% ...

  5. SQL SERVER 添加序号列

    原文地址为: SQL SERVER 添加序号列 select ROW_NUMBER() OVER(ORDER BY Convey_Fee desc) as z, rank() OVER(ORDER B ...

  6. 如何给查询出的SQL记录添加序号列

    --给查询出的SQL记录添加序号列,解决方法有以下两种--第一:这种方法是根据字段名1进行分组排队.select ROW_NUMBER() OVER (partition by 字段名1 ORDER ...

  7. GridView添加序号列

    在GridView控件第0列添加序号列: <asp:BoundField HeaderText="序号" ><ItemStyle HorizontalAlign= ...

  8. html表格里的超链接点不了,Excel如何添加和取消超链接 Excel超链接打不开是怎么回事...

    很多用户在制作excel表格的时候都会添加一些超链接,在制作完成后发布到网页,阅读者可以通过超链接打开指引的网页或者文件,超链接对制作excel表格的用户有非常大的帮助,虽然添加超链接的步骤非常简单, ...

  9. java设置excel行间距_java用POI设置Excel的列宽

    需求:将某个excel中的某一列列宽设置为35(该数值是Excel中显示的列宽值). poi中设置列宽的方法为: HSSFSheet.setColumnWidth(int columnIndex, i ...

最新文章

  1. Java开发必会的Linux命令
  2. 【核心API开发】Spark入门教程[3]
  3. 前端数据的加密和解密--对象解密的坑
  4. 达标率用计算机怎么算,达标率怎么算
  5. MySQL时间戳与日期格式的相互转换
  6. 《科学:无尽的前沿》分享会在京举办,助力中国企业打造“科研的应许之地”
  7. 如何绘制逻辑图 — 7.逻辑的表达:业务逻辑
  8. git统计当前项目代码行数
  9. 闲聊libhybris
  10. 20200709每日一句
  11. mysql2008 密钥_怎么查看sql server 2008密钥
  12. 支付宝小程序:报错 insufficient-isv-permissions 错误原因: ISV权限不足解决方案
  13. 【VRP问题】基于模拟退火算法求解带时间窗的车辆路径规划问题VRPTW
  14. 百度网盘怎么设置提取码 百度网盘自定义提取码方法
  15. 最长单调递增子序列问题 设计一个O(n2)复杂度的算法,找出由n个数组成的序列的最长单调递增子序列
  16. 学术论文写作 | (7)NLP学术论文写作方法和技巧
  17. 机器学习实战(Machine Learning in Action)学习笔记————02.k-邻近算法(KNN)
  18. java cryptography_Java密码体系结构简介:Java Cryptography Architecture (JCA) Reference Guide...
  19. 小程序模板平台怎么选?
  20. 全球霸榜的Dell EMC VxRail,靠什么赢得超融合客户认可?

热门文章

  1. 首款国产8K 50P小型化广播级摄像机惊喜亮相冬季冰雪体育盛会
  2. 什么是骨传导耳机,骨传导耳机有什么优缺点
  3. CAD“左手键”快捷命令表,大大提高绘图效率
  4. GitHub如何征服了Google、微软及一切
  5. ubantu下QT连接数据库mysql
  6. 有必要说一说即将到来的春招(经历+重要性+如何准备)
  7. PHPUnit袖珍指南 第六章 装置器
  8. java 导出压缩文件,里面文件名字乱码的问题(麒麟系统,linux)
  9. 如何优雅的修改 Kubernetes Master 节点 IP?可没你想象中那么简单!
  10. 三个有用的Switch命令:spanning-tree portfast、switchport host、smartport