java中使用POI生成Excel并导出
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.lzj.anno.ExcelExport;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.xssf.usermodel.*;
import org.springframework.util.StringUtils;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.*;
/**
* <p>
*
* </p>
*
* @author:雷子杰
* @date:2023/7/6
*/
public class PoiExcelUtil {
/**
* 获取标题字体
* @param xssfWorkbook
* @return
*/
public static XSSFFont getTitleFont(XSSFWorkbook xssfWorkbook){
//创建标题字体
XSSFFont titleFont = xssfWorkbook.createFont();
titleFont.setBold(true);//加粗
titleFont.setFontName("微软雅黑");
titleFont.setFontHeightInPoints((short) 12);//字体大小
return titleFont;
}
/**
* 获取通用字体
* @param xssfWorkbook
* @return
*/
public static XSSFFont getCommonFont(XSSFWorkbook xssfWorkbook){
//创建通用字体
XSSFFont commonFont = xssfWorkbook.createFont();
commonFont.setBold(false);//加粗
commonFont.setFontName("微软雅黑");
commonFont.setFontHeightInPoints((short) 12);//字体大小
return commonFont;
}
/**
* 获取标题单元格样式
* @param xssfWorkbook
* @param xssfFont
* @return
*/
public static CellStyle getTitleCellStyle(XSSFWorkbook xssfWorkbook , XSSFFont xssfFont){
// 创建标题行单元格样式
CellStyle titleCellStyle = xssfWorkbook.createCellStyle();
titleCellStyle.setBorderTop(CellStyle.BORDER_THIN);//框线
titleCellStyle.setBorderBottom(CellStyle.BORDER_THIN);
titleCellStyle.setBorderLeft(CellStyle.BORDER_THIN);
titleCellStyle.setBorderRight(CellStyle.BORDER_THIN);
titleCellStyle.setAlignment(CellStyle.ALIGN_CENTER);//水平对齐方式
titleCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);//垂直对齐方式
titleCellStyle.setFont(xssfFont);//字体样式
titleCellStyle.setFillForegroundColor(HSSFColor.GREY_25_PERCENT.index);//单元格前景色
titleCellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);//填充单元格
return titleCellStyle;
}
/**
* 获取通用单元格样式
* @param xssfWorkbook
* @param xssfFont
* @return
*/
public static CellStyle getCommonCellStyle(XSSFWorkbook xssfWorkbook, XSSFFont xssfFont){
//创建通用行单元格样式
CellStyle commonCellStyle = xssfWorkbook.createCellStyle();
commonCellStyle.setBorderTop(CellStyle.BORDER_THIN);
commonCellStyle.setBorderBottom(CellStyle.BORDER_THIN);
commonCellStyle.setBorderLeft(CellStyle.BORDER_THIN);
commonCellStyle.setBorderRight(CellStyle.BORDER_THIN);
commonCellStyle.setAlignment(CellStyle.ALIGN_CENTER);
commonCellStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
commonCellStyle.setFont(xssfFont);
commonCellStyle.setWrapText(true);//自动换行
return commonCellStyle;
}
/**
* 写入单个单元格数据
* @param row 行对象
* @param xssfSheet sheet对象
* @param value 单元格的值
* @param cellStyle 单元格样式
* @param rowHeight 行高
* @param columnWidth 列宽
*/
public static void writeCellData(XSSFRow row, XSSFSheet xssfSheet , Object value ,CellStyle cellStyle,Integer currentColumn,Float rowHeight,Integer columnWidth){
//创建单元格,传入值,设置单元格样式
XSSFCell cell = row.createCell(currentColumn);
cell.setCellValue(value == null ? "" : value.toString());
cell.setCellStyle(cellStyle);
//设置行高度
row.setHeightInPoints(rowHeight);
//设置列的宽度
xssfSheet.setColumnWidth(currentColumn,columnWidth);
}
/**
*
* @param row 行对象
* @param xssfSheet sheet对象
* @param cellStyle 单元格样式
* @param fields 反射获取得到的实体对象的全部属性
* @param currentColumn 当前列
* @param rowHeight 行高
* @param columnWidth 列宽
* @param type 类型
*/
public static void writeTitleCellData(XSSFRow row,XSSFSheet xssfSheet,CellStyle cellStyle,Field[] fields,Integer currentColumn,Float rowHeight,Integer columnWidth,String type){
//创建标题行
// 遍历每个字段
for (Field field : fields) {
// 检查字段是否带有ExcelExport注解
if (field.isAnnotationPresent(ExcelExport.class)) {
// 获取Explanation注解实例
ExcelExport explanation = field.getAnnotation(ExcelExport.class);
//判断是否是需要写入的数据类型
String[] typeArray = explanation.type();
Set<String> set = new HashSet<>(Arrays.asList(typeArray));
if (!set.contains(type)){
continue;
}
// 获取注解中的解释
String value = explanation.value();
//判断value是否是json格式数据
boolean isJson = true;
try{
Object parse = JSON.parse(value);
}catch (Exception e){
isJson = false;
}
if (isJson == true){//如果是json格式数据,则给他对应对应类型的值
JSONObject jsonObject = JSON.parseObject(value);
value = jsonObject.getString(type);
}
//写入单元格数据
PoiExcelUtil.writeCellData(row,xssfSheet,value,cellStyle,currentColumn,rowHeight,columnWidth);
//当前列+1
currentColumn++;
}
}
}
/**
* 将集合数据全部写入单元格
* @param list 需要写入excel的集合数据
* @param currentRow 当前行
* @param currentColumn 当前列
* @param row 行对象
* @param xssfSheet sheet对象
* @param cellStyle 单元格样式
* @param fields 反射获取得到的实体对象的全部属性
* @param rowHeight 行高
* @param columnWidth 列宽
* @param type 类型
* @param <T>
*/
public static <T> void writeCommonRowCellData(List<T> list,Integer currentRow ,Integer currentColumn, XSSFRow row,XSSFSheet xssfSheet,CellStyle cellStyle,Field[] fields,Float rowHeight,Integer columnWidth,String type){
//创建数据行
for (T obj : list) {
//每次循环时重置列
currentColumn = 0;
//当前行+1
currentRow++;
//创建行
row = xssfSheet.createRow(currentRow);
for (Field field : fields) {
// 检查字段是否带有ExcelExport注解
if (field.isAnnotationPresent(ExcelExport.class)) {
try {
//解除private限制
field.setAccessible(true);
// 获取Explanation注解实例
ExcelExport explanation = field.getAnnotation(ExcelExport.class);
//判断是否是需要写入的数据类型
String[] typeArray = explanation.type();
Set<String> set = new HashSet<>(Arrays.asList(typeArray));
if (!set.contains(type)){
continue;
}
// 获取属性的值
Object value = field.get(obj);
//日期类型格式化
if (value != null && field.getType() == Date.class){
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
value = sdf.format(value);
}
//获取对应字典
String dict = explanation.dict();
if (!StringUtils.isEmpty(dict) && value != null){
List<String> parseArray = JSON.parseArray(dict, String.class);
for (String item : parseArray) {
JSONObject jsonObject = JSON.parseObject(item);
if(value == null ? false : jsonObject.getString("value").equals(value.toString()) ){
value = jsonObject.getString("label");
break;
}
}
}
//写入单元格数据
PoiExcelUtil.writeCellData(row,xssfSheet,value,cellStyle,currentColumn,rowHeight,columnWidth);
//当前列+1
currentColumn++;
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
}
}
}