Spring Boot Excel 文件导出
目标:
实现Excel文件的直接导出下载,后续开发不需要开发很多代码,直接继承已经写好的代码,增加一个 配置就可以直接导出。
实现:
1、抽象类 ExcelView 继承 webmvc 的 AbstractXlsxStreamingView 抽象类, AbstractXlsxStreamingView 是webmvc继承了最顶层View接口,是可以直接大量数据导出的不会造成内存泄漏问题,即 SXSSFWorkbook 解决了内存问题, 导出只支持xlsx类型文件。
抽象类代码 ExcelView :
public abstract class ExcelView extends AbstractXlsxStreamingView {
private static final Logger logger = LoggerFactory.getLogger( ExcelView.class);
/**
* 获取导出文件名
*
* @return
*/
abstract protected String getFileName();
/**
* 获取表单名称
*
* @return
*/
abstract protected String getSheetName();
/**
* 获取标题栏名称
*
* @return
*/
abstract protected String[] get s();
/**
* 获取列宽
*
* @return
*/
abstract protected short[] getColumnWidths();
/**
* 构造内容单元格
*
* @param sheet
*/
abstract protected void buildContentCells(Sheet sheet);
@Override
protected void buildExcelDocument(
Map<String, > model, Workbook workbook, HttpServletRequest request, HttpServletResponse response)
throws Exception {
// 构造标题单元格 SXSSFWorkbook
Sheet sheet = build Cells(workbook);
// 构造内容单元格
buildContentCells(sheet);
// 设置响应头
setResponseHead(request, response);
}
/**
* 设置响应头
*
* @param response
* @throws IOException
*/
protected void setResponseHead(HttpServletRequest request,
HttpServletResponse response) throws IOException {
// 文件名
String fileName = getFileName();
String userAgent = request.getHeader(\"user-agent\").toLowerCase();
logger.info(\"客户端请求头内容:\");
logger.info(\"user-agent\\t值: {}\", userAgent);
if (userAgent != null) {
if (userAgent.contains(\"firefox\")) {
// firefox有默认的备用字符集是西欧字符集
fileName = new String(fileName.getBytes(\"UTF-8\"), \"ISO8859-1\");
} else if (userAgent.contains(\"webkit\") && (userAgent.contains(\"chrome\") || userAgent.contains(\"safari\"))) {
// webkit核心的浏览器,主流的有chrome,safari,360
fileName = new String(fileName.getBytes(\"UTF-8\"), \"ISO8859-1\");
} else {
// 新老版本的IE都可直接用URL编码工具编码后输出正确的名称,无乱码
fileName = URLEncoder.encode(fileName, \"UTF-8\");
}
}
//响应头信息
response.setCharacterEncoding(\"UTF-8\");
response.setContentType(\"application/ms-excel; charset=UTF-8\");
response.setHeader(\"Content-disposition\", \"attachment; filename=\" + fileName + \".xlsx\");
}
/**
* 构造标题单元格
*
* @param
* @return
*/
protected Sheet build Cells(Workbook workbook) {
// 表单名称
String sheetName = getSheetName();
// 标题名称
String[] s = get s();
// 列宽
short[] colWidths = getColumnWidths();
// 创建表格
Sheet sheet = workbook.createSheet(sheetName);
// 标题单元格样式
CellStyle Style = getHeadStyle(workbook);
// 默认内容单元格样式
CellStyle contentStyle = getBodyStyle(workbook);
// 标题行
Row Row = sheet.createRow(0);
// 创建标题行单元格
for (int i = 0; i < s.length; i++) {
// 标题单元格
Cell cell = Row.createCell((short) i);
cell.setCellType(CellType.STRING);
cell.setCellValue(new XSSFRichTextString( s[i]));
cell.setCellStyle( Style);
// 设置列宽
sheet.setColumnWidth((short) i, (short) (colWidths[i] * 256));
// 设置列默认样式
sheet.setDefaultColumnStyle((short) i, contentStyle);
}
return sheet;
}
/**
* 设置表头的单元格样式
*/
public CellStyle getHeadStyle(Workbook workbook) {
// 创建单元格样式
CellStyle cellStyle = workbook.createCellStyle();
// 设置单元格的背景颜色为淡蓝色
cellStyle.setFillForegroundColor(IndexedColors.PALE_BLUE.index);
// 设置填充字体的样式
cellStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 设置单元格居中对齐
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 设置单元格垂直居中对齐
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 创建单元格内容显示不下时自动换行
cellStyle.setWrapText(true);
// 设置单元格字体样式
Font font = workbook.createFont();
// 字号
font.setFontHeightInPoints((short) 12);
// 加粗
font.setBold(true);
// 将字体填充到表格中去
cellStyle.setFont(font);
// 设置单元格边框为细线条(上下左右)
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
return cellStyle;
}
/**
* 设置表体的单元格样式
*/
public CellStyle getBodyStyle(Workbook workbook) {
// 创建单元格样式
CellStyle cellStyle = workbook.createCellStyle();
// 设置单元格居中对齐
cellStyle.setAlignment(HorizontalAlignment.CENTER);
// 设置单元格居中对齐
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 创建单元格内容不显示自动换行
cellStyle.setWrapText(true);
//设置单元格字体样式字体
Font font = workbook.createFont();
// 字号
font.setFontHeightInPoints((short) 10);
// 将字体添加到表格中去
cellStyle.setFont(font);
// 设置单元格边框为细线条
cellStyle.setBorderLeft(BorderStyle.THIN);
cellStyle.setBorderBottom(BorderStyle.THIN);
cellStyle.setBorderRight(BorderStyle.THIN);
cellStyle.setBorderTop(BorderStyle.THIN);
return cellStyle;
}
}
Excel导出实现 1: 可以直接继承 ExcelView 实现定义的方法 eg:
public class CheckExcelView extends ExcelView {
private List<T> vo;
public CheckExcelView(List<T> vo) {
this.vo= vo;
}
@Override
protected String getFileName() {
String time = DateUtils.getLocalFullDateTime14();
return \"导出文件\" + time;
}
@Override
protected String getSheetName() {
return \"报表\";
}
@Override
protected String[] get s() {
return new String[] { \"申请时间\"};
}
@Override
protected short[] getColumnWidths() {
return new short[] { 20};
}
@Override
protected void buildContentCells(Sheet sheet) {
DecimalFormat df = new DecimalFormat(\"0.00\");
int rowNum = 1;
for (T o : vO) {
Row crow = sheet.createRow(rowNum++);
crow.createCell(0).setCellValue(o.getApplicationDate()));
}
}
}
导出实现 2: 配置导出
1、需要定义 的配置 export-config.
<? version=\"1.0\" encoding=\"UTF-8\"?>
<configuration>
<table id=\"demo\" name=\"测试\">
<columns>
<column id=\"name\" name=\"名称\" width=\"40\"></column>
</columns>
</table>
</configuration>
2、 解析配置
@Root
public class Export {
@ElementList(entry = \"table\", inline = true)
private List<Table> table;
public List<Table> getTable() {
return table;
}
public void setTable(List<Table> table) {
this.table = table;
}
public static class Table {
@Attribute
private String id;
@Attribute
private String name;
@ElementList(entry = \"column\")
private List<Column> columns;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public List<Column> getColumns() {
return columns;
}
public void setColumns(List<Column> columns) {
this.columns = columns;
}
}
public static class Column {
@Attribute
private String id;
@Attribute
private String name;
@Attribute
private short width;
@Attribute(required = false)
private String mapping;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getMapping() {
return mapping;
}
public void setMapping(String mapping) {
this.mapping = mapping;
}
public short getWidth() {
return width;
}
public void setWidth(short width) {
this.width = width;
}
}
}
3、解析 方法配置
@Service
public class IExportService {
private Export tables;
private Map<String, Export.Table> tableMap;
@SuppressWarnings(\"rawtypes\")
@PostConstruct
public void init() throws Exception {
InputStream inputStream = this.getClass().getClassLoader().getResourceAsStream(\"export-config. \");
Serializer serializer = new Persister();
tables = serializer.read(Export.class, inputStream);
tableMap = new HashMap<>();
for (Export.Table table : tables.getTable()) {
tableMap.put(table.getId(), table);
}
}
public Export.Table getTable(String key) {
return tableMap.get(key);
}
}
4、导出基础 ExcelExportView 代码实现
public class ExcelExportView extends ExcelView {
private String[] s;
private short[] columnWidths;
List<Map<String, >> results;
private Export.Table table;
private IExportService iExportService;
@Override
protected String getFileName() {
return table.getName();
}
@Override
protected String getSheetName() {
return table.getName();
}
@Override
protected String[] get s() {
return this. s;
}
@Override
protected short[] getColumnWidths() {
return this.columnWidths;
}
public ExcelExportView() {
this.iExportService = ApplicationContextProvider.getBean(IExportService.class);
}
@Override
protected void buildContentCells(Sheet sheet) {
int dataIndex = 1;
if(CollectionUtils.isEmpty(results)){
return;
}
for (Map<String, > data : results) {
Row row = sheet.createRow(dataIndex++);
for (int i = 0; i < table.getColumns().size(); i++) {
Export.Column column = table.getColumns().get(i);
Cell cell = row.createCell(i);
value = data.get(column.getId());
if (value == null) {
value = \"\";
}
cell.setCellValue(new XSSFRichTextString(value.toString()));
}
}
}
public void exportExcel(String key, List<Map<String, >> results) {
this.table = iExportService.getTable(key);
if (null == table) {
return;
}
this.results = results;
this. s = new String[table.getColumns().size()];
this.columnWidths = new short[table.getColumns().size()];
for (int i = 0; i < table.getColumns().size(); i++) {
Export.Column column = table.getColumns().get(i);
s[i] = column.getName();
columnWidths[i] = column.getWidth();
}
}
}
最后:导出Controller代码实现
@RequestMapping(path = \"/export\", method = RequestMethod.GET, produces = \"application/octet-stream;charset=UTF-8\")
public @ResponseBody
ModelAndView export(){
Long loginComId = loginContext.getCompany().getId();
List<T> list = new ArrayList<>();
ExcelExportView exportView = new ExcelExportView();
exportView.exportExcel(\" 中表的ID\", BeanUtils. ToMapList(list));
return new ModelAndView(exportView);
<em id=\"__mceDel\"><em id=\"__mceDel\">}</em></em>
总结
以上所述是小编给大家介绍的Spring Boot Excel文件导出下载实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!
继续阅读与本文标签相同的文章
上一篇 :
攻击生物识别验证,可以分哪几步?
-
DBengine 排名第一,云数据库 InfluxDB 版正式商业化!
2026-05-19栏目: 教程
-
阿里有个超神秘的组织,CEO们来了都要翻牌 | 开发者必读(056期)
2026-05-19栏目: 教程
-
云原生计算重塑企业IT架构 - 分布式应用架构
2026-05-19栏目: 教程
-
阿里云创新大会再出发,一些变化即将发生
2026-05-19栏目: 教程
-
阿里云的包年包月、按量付费、抢占式实例计费方式是什么,如何选择
2026-05-19栏目: 教程
