package
com.example.demo.core.utils;
import
com.example.demo.model.ExcelData;
import
org.apache.poi.ss.usermodel.*;
import
org.apache.poi.ss.usermodel.Font;
import
org.apache.poi.xssf.usermodel.XSSFCellStyle;
import
org.apache.poi.xssf.usermodel.XSSFColor;
import
org.apache.poi.xssf.usermodel.XSSFSheet;
import
org.apache.poi.xssf.usermodel.XSSFWorkbook;
import
org.apache.poi.xssf.usermodel.extensions.XSSFCellBorder.BorderSide;
import
javax.servlet.http.HttpServletResponse;
import
java.awt.Color;
import
java.io.File;
import
java.io.FileOutputStream;
import
java.io.OutputStream;
import
java.net.URLEncoder;
import
java.util.List;
public
class
ExcelUtils {
/**
* 使用浏览器选择路径下载
* @param response
* @param fileName
* @param data
* @throws Exception
*/
public
static
void
exportExcel(HttpServletResponse response, String fileName, ExcelData data)
throws
Exception {
// 告诉浏览器用什么软件可以打开此文件
response.setHeader(
"content-Type"
,
"application/vnd.ms-excel"
);
// 下载文件的默认名称
response.setHeader(
"Content-Disposition"
,
"attachment;filename="
+ URLEncoder.encode(fileName +
".xls"
,
"utf-8"
));
exportExcel(data, response.getOutputStream());
}
public
static
int
generateExcel(ExcelData excelData, String path)
throws
Exception {
File f =
new
File(path);
FileOutputStream out =
new
FileOutputStream(f);
return
exportExcel(excelData, out);
}
private
static
int
exportExcel(ExcelData data, OutputStream out)
throws
Exception {
XSSFWorkbook wb =
new
XSSFWorkbook();
int
rowIndex =
0
;
try
{
String sheetName = data.getName();
if
(
null
== sheetName) {
sheetName =
"Sheet1"
;
}
XSSFSheet sheet = wb.createSheet(sheetName);
rowIndex = writeExcel(wb, sheet, data);
wb.write(out);
}
catch
(Exception e) {
e.printStackTrace();
}
finally
{
//此处需要关闭 wb 变量
out.close();
}
return
rowIndex;
}
/**
* 表不显示字段
* @param wb
* @param sheet
* @param data
* @return
*/
// private static int writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {
// int rowIndex = 0;
// writeTitlesToExcel(wb, sheet, data.getTitles());
// rowIndex = writeRowsToExcel(wb, sheet, data.getRows(), rowIndex);
// autoSizeColumns(sheet, data.getTitles().size() + 1);
// return rowIndex;
// }
/**
* 表显示字段
* @param wb
* @param sheet
* @param data
* @return
*/
private
static
int
writeExcel(XSSFWorkbook wb, Sheet sheet, ExcelData data) {
int
rowIndex =
0
;
rowIndex = writeTitlesToExcel(wb, sheet, data.getTitles());
rowIndex = writeRowsToExcel(wb, sheet, data.getRows(), rowIndex);
autoSizeColumns(sheet, data.getTitles().size() +
1
);
return
rowIndex;
}
/**
* 设置表头
*
* @param wb
* @param sheet
* @param titles
* @return
*/
private
static
int
writeTitlesToExcel(XSSFWorkbook wb, Sheet sheet, List titles) {
int
rowIndex =
0
;
int
colIndex =
0
;
Font titleFont = wb.createFont();
//设置字体
titleFont.setFontName(
"simsun"
);
//设置粗体
titleFont.setBoldweight(Short.MAX_VALUE);
//设置字号
titleFont.setFontHeightInPoints((
short
)
14
);
//设置颜色
titleFont.setColor(IndexedColors.BLACK.index);
XSSFCellStyle titleStyle = wb.createCellStyle();
//水平居中
titleStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
//垂直居中
titleStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
//设置图案颜色
titleStyle.setFillForegroundColor(
new
XSSFColor(
new
Color(
182
,
184
,
192
)));
//设置图案样式
titleStyle.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);
titleStyle.setFont(titleFont);
setBorder(titleStyle, BorderStyle.THIN,
new
XSSFColor(
new
Color(
0
,
0
,
0
)));
Row titleRow = sheet.createRow(rowIndex);
titleRow.setHeightInPoints(
25
);
colIndex =
0
;
for
(String field : titles) {
Cell cell = titleRow.createCell(colIndex);
cell.setCellValue(field);
cell.setCellStyle(titleStyle);
colIndex++;
}
rowIndex++;
return
rowIndex;
}
/**
* 设置内容
*
* @param wb
* @param sheet
* @param rows
* @param rowIndex
* @return
*/
private
static
int
writeRowsToExcel(XSSFWorkbook wb, Sheet sheet, List> rows,
int
rowIndex) {
int
colIndex;
Font dataFont = wb.createFont();
dataFont.setFontName(
"simsun"
);
dataFont.setFontHeightInPoints((
short
)
14
);
dataFont.setColor(IndexedColors.BLACK.index);
XSSFCellStyle dataStyle = wb.createCellStyle();
dataStyle.setAlignment(XSSFCellStyle.ALIGN_CENTER);
dataStyle.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);
dataStyle.setFont(dataFont);
setBorder(dataStyle, BorderStyle.THIN,
new
XSSFColor(
new
Color(
0
,
0
,
0
)));
for
(List rowData : rows) {
Row dataRow = sheet.createRow(rowIndex);
dataRow.setHeightInPoints(
25
);
colIndex =
0
;
for
(Object cellData : rowData) {
Cell cell = dataRow.createCell(colIndex);
if
(cellData !=
null
) {
cell.setCellValue(cellData.toString());
}
else
{
cell.setCellValue(
""
);
}
cell.setCellStyle(dataStyle);
colIndex++;
}
rowIndex++;
}
return
rowIndex;
}
/**
* 自动调整列宽
*
* @param sheet
* @param columnNumber
*/
private
static
void
autoSizeColumns(Sheet sheet,
int
columnNumber) {
for
(
int
i =
0
; i < columnNumber; i++) {
int
orgWidth = sheet.getColumnWidth(i);
sheet.autoSizeColumn(i,
true
);
int
newWidth = (
int
) (sheet.getColumnWidth(i) +
100
);
if
(newWidth > orgWidth) {
sheet.setColumnWidth(i, newWidth);
}
else
{
sheet.setColumnWidth(i, orgWidth);
}
}
}
/**
* 设置边框
*
* @param style
* @param border
* @param color
*/
private
static
void
setBorder(XSSFCellStyle style, BorderStyle border, XSSFColor color) {
style.setBorderTop(border);
style.setBorderLeft(border);
style.setBorderRight(border);
style.setBorderBottom(border);
style.setBorderColor(BorderSide.TOP, color);
style.setBorderColor(BorderSide.LEFT, color);
style.setBorderColor(BorderSide.RIGHT, color);
style.setBorderColor(BorderSide.BOTTOM, color);
}
}