java中使用POI生成Excel并导出

时间:2025-03-17 18:19:12
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(); } } } } } }