Excel导出
Excel导出是比较常见的场景,以前都是直接用用公司的工具类,这次自己封装了一个。导出的文件的格式是xlsx的,
需要office2007才能打开。小编的上一篇解决下载中文名文件乱码的问题就是来自这个工具类。下面直接上代码
一、代码
(1)maven依赖
<!-- poi的jar包 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.15</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.15</version>
</dependency>
11
1
<!-- poi的jar包 -->
2
<dependency>
3
<groupId>org.apache.poi</groupId>
4
<artifactId>poi</artifactId>
5
<version>3.15</version>
6
</dependency>
7
<dependency>
8
<groupId>org.apache.poi</groupId>
9
<artifactId>poi-ooxml</artifactId>
10
<version>3.15</version>
11
</dependency>
(2)工具类代码
package com.tax.core.util;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletResponse;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFFont;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
/**
* Excel工具类
* @author ZENG.XIAO.YAN
* @date 2017年7月27日 下午3:02:22
* @version v1.0
*/
public class ExcelUtils {
/**
* 导出数据到Excel
* @param fileName 文件名,不包含后缀
* @param sheetName sheet名
* @param title 标题
* @param cellTitles 每一列的标题
* @param autoSizeColumnNum 需要自动调整列宽的列的编号(从0开始)的数组,该参数可以为null
* @param data 数据: 一行数据封装成一个ArrayList,最后将所有ArrayList封装到一个List
* @param response HttpServletResponse对象
* @throws Exception
*/
public static void exportExcel(String fileName, String sheetName, String title, String[] cellTitles,
int[] autoSizeColumnNum, List<ArrayList<Object>> data, HttpServletResponse response) throws Exception {
/** 创建空的工作簿 */
XSSFWorkbook workbook = new XSSFWorkbook();
/** 创建工作表 */
XSSFSheet sheet = workbook.createSheet(sheetName);
/** 第一行标题处理 */
// 合并单元格
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cellTitles.length-1));
XSSFRow row01 = sheet.createRow(0);
XSSFCell cell01 = row01.createCell(0);
// 设置单元格内容
cell01.setCellValue(title);
// 创建单元格样式
XSSFCellStyle cellStyle01 = createCellStyle(workbook,"Courier New",(short)18,true);
// 设置单元格样式
cell01.setCellStyle(cellStyle01);
/** 第二行列标题的处理 */
// 创建单元格样式
XSSFCellStyle cellStyle02 = createCellStyle(workbook,"Courier New",(short)13,true);
XSSFRow row02 = sheet.createRow(1);
// for循环创建单元格并赋值和设置样式
for (int i = 0; i < cellTitles.length; i++) {
XSSFCell titleCell = row02.createCell(i);
titleCell.setCellValue(cellTitles[i]);
titleCell.setCellStyle(cellStyle02);
}
/** 中间行的处理 */
// 创建单元格样式
XSSFCellStyle cellStyle03 = createCellStyle(workbook,null,(short)12,false);
// for循环处理
for (int i = 0; i < data.size(); i++) {
XSSFRow row = sheet.createRow(i + 2);
for(int j = 0; j < data.get(i).size(); j++) {
XSSFCell cell = row.createCell(j);
Object value = data.get(i).get(j);
cell.setCellValue(value == null ? "" : value.toString());
cell.setCellStyle(cellStyle03);
}
}
/** 设置自动调整列宽 */
// 某些情况下,有的列内容太长需要自动调整列宽
for (int i = 0; i < autoSizeColumnNum.length; i++) {
sheet.autoSizeColumn(autoSizeColumnNum[i]);
}
/** 下载时文件名为中文:乱码解决 */
// 响应的过程:
// 服务器: utf-8|gbk --> iso8859-1 浏览器: iso8859-1 --> utf-8|gbk (firefox、chrome)
// 服务器: gbk --> iso8859-1 浏览器: iso8859-1 --> gbk (msie)
fileName = new String(fileName.getBytes("gbk"), "iso8859-1");
/** 设置下载的文件名 */
response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xlsx");
/** 向浏览器输出Excel文件 */
workbook.write(response.getOutputStream());
/** 关闭工作簿 */
workbook.close();
}
/**
* 创建单元格样式方法
* @param workbook 工作簿
* @param fontName 字体名字
* @param fontSize 字体大小
* @param isBlod 是否加粗
* @return 单元格样式XSSFCellStyle
*/
private static XSSFCellStyle createCellStyle(XSSFWorkbook workbook, String fontName, short fontSize,
boolean isBlod) {
// 通过工作簿创建样式
XSSFCellStyle cellStyle = workbook.createCellStyle();
// 设置水平和垂直居中
cellStyle.setAlignment(HorizontalAlignment.CENTER);
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
// 通过工作簿创建字体
XSSFFont font = workbook.createFont();
// 设置字体
if (null != fontName && !"".equals(fontName)) {
font.setFontName(fontName);
}
// 设置字体大小
font.setFontHeightInPoints(fontSize);
// 设置字体是否加粗
font.setBold(isBlod);
// 把字体set到样式中
cellStyle.setFont(font);
return cellStyle;
}
}
x
1
package com.tax.core.util;
2
import java.util.ArrayList;
3
import java.util.List;
4
import javax.servlet.http.HttpServletResponse;
5
import org.apache.poi.ss.usermodel.HorizontalAlignment;
6
import org.apache.poi.ss.usermodel.VerticalAlignment;
7
import org.apache.poi.ss.util.CellRangeAddress;
8
import org.apache.poi.xssf.usermodel.XSSFCell;
9
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
10
import org.apache.poi.xssf.usermodel.XSSFFont;
11
import org.apache.poi.xssf.usermodel.XSSFRow;
12
import org.apache.poi.xssf.usermodel.XSSFSheet;
13
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
14
15
/**
16
* Excel工具类
17
* @author ZENG.XIAO.YAN
18
* @date 2017年7月27日 下午3:02:22
19
* @version v1.0
20
*/
21
public class ExcelUtils {
22
23
/**
24
* 导出数据到Excel
25
* @param fileName 文件名,不包含后缀
26
* @param sheetName sheet名
27
* @param title 标题
28
* @param cellTitles 每一列的标题
29
* @param autoSizeColumnNum 需要自动调整列宽的列的编号(从0开始)的数组,该参数可以为null
30
* @param data 数据: 一行数据封装成一个ArrayList,最后将所有ArrayList封装到一个List
31
* @param response HttpServletResponse对象
32
* @throws Exception
33
*/
34
public static void exportExcel(String fileName, String sheetName, String title, String[] cellTitles,
35
int[] autoSizeColumnNum, List<ArrayList<Object>> data, HttpServletResponse response) throws Exception {
36
37
/** 创建空的工作簿 */
38
XSSFWorkbook workbook = new XSSFWorkbook();
39
/** 创建工作表 */
40
XSSFSheet sheet = workbook.createSheet(sheetName);
41
42
/** 第一行标题处理 */
43
// 合并单元格
44
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, cellTitles.length-1));
45
XSSFRow row01 = sheet.createRow(0);
46
XSSFCell cell01 = row01.createCell(0);
47
// 设置单元格内容
48
cell01.setCellValue(title);
49
// 创建单元格样式
50
XSSFCellStyle cellStyle01 = createCellStyle(workbook,"Courier New",(short)18,true);
51
// 设置单元格样式
52
cell01.setCellStyle(cellStyle01);
53
54
/** 第二行列标题的处理 */
55
// 创建单元格样式
56
XSSFCellStyle cellStyle02 = createCellStyle(workbook,"Courier New",(short)13,true);
57
XSSFRow row02 = sheet.createRow(1);
58
// for循环创建单元格并赋值和设置样式
59
for (int i = 0; i < cellTitles.length; i++) {
60
XSSFCell titleCell = row02.createCell(i);
61
titleCell.setCellValue(cellTitles[i]);
62
titleCell.setCellStyle(cellStyle02);
63
}
64
65
/** 中间行的处理 */
66
// 创建单元格样式
67
XSSFCellStyle cellStyle03 = createCellStyle(workbook,null,(short)12,false);
68
// for循环处理
69
for (int i = 0; i < data.size(); i++) {
70
XSSFRow row = sheet.createRow(i + 2);
71
for(int j = 0; j < data.get(i).size(); j++) {
72
XSSFCell cell = row.createCell(j);
73
Object value = data.get(i).get(j);
74
cell.setCellValue(value == null ? "" : value.toString());
75
cell.setCellStyle(cellStyle03);
76
}
77
}
78
79
/** 设置自动调整列宽 */
80
// 某些情况下,有的列内容太长需要自动调整列宽
81
for (int i = 0; i < autoSizeColumnNum.length; i++) {
82
sheet.autoSizeColumn(autoSizeColumnNum[i]);
83
}
84
/** 下载时文件名为中文:乱码解决 */
85
// 响应的过程:
86
// 服务器: utf-8|gbk --> iso8859-1 浏览器: iso8859-1 --> utf-8|gbk (firefox、chrome)
87
// 服务器: gbk --> iso8859-1 浏览器: iso8859-1 --> gbk (msie)
88
fileName = new String(fileName.getBytes("gbk"), "iso8859-1");
89
/** 设置下载的文件名 */
90
response.setHeader("content-disposition", "attachment;filename=" + fileName + ".xlsx");
91
/** 向浏览器输出Excel文件 */
92
workbook.write(response.getOutputStream());
93
/** 关闭工作簿 */
94
workbook.close();
95
}
96
97
98
/**
99
* 创建单元格样式方法
100
* @param workbook 工作簿
101
* @param fontName 字体名字
102
* @param fontSize 字体大小
103
* @param isBlod 是否加粗
104
* @return 单元格样式XSSFCellStyle
105
*/
106
private static XSSFCellStyle createCellStyle(XSSFWorkbook workbook, String fontName, short fontSize,
107
boolean isBlod) {
108
// 通过工作簿创建样式
109
XSSFCellStyle cellStyle = workbook.createCellStyle();
110
// 设置水平和垂直居中
111
cellStyle.setAlignment(HorizontalAlignment.CENTER);
112
cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
113
// 通过工作簿创建字体
114
XSSFFont font = workbook.createFont();
115
// 设置字体
116
if (null != fontName && !"".equals(fontName)) {
117
font.setFontName(fontName);
118
}
119
// 设置字体大小
120
font.setFontHeightInPoints(fontSize);
121
// 设置字体是否加粗
122
font.setBold(isBlod);
123
// 把字体set到样式中
124
cellStyle.setFont(font);
125
126
return cellStyle;
127
}
128
}
二、工具类在struts2中使用示例
![](https://images2018.cnblogs.com/blog/1222688/201807/1222688-20180711200416843-2143915129.png)
结果:
![](https://images2018.cnblogs.com/blog/1222688/201807/1222688-20180711200417270-680564211.png)
作者:zeng1994
出处:http://www.cnblogs.com/zeng1994/
本文版权归作者和博客园共有,欢迎转载!但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接!