一、导入依赖

<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version>
</dependency>

二、自定义注解

@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExcelField {String value() default "未知列名";String className() default "";
}

三、创建实体类

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Teacher {@ExcelField("教师姓名")private String name;@ExcelField("性别")private String sex;@ExcelField("电话号")private String phone;@ExcelField("年龄")private Integer age;@ExcelField("工号")private String teacherNo;@ExcelField("下拉框")private List<String> ss;
}

四、编写Excel工具类

工具类实现

#使用 BiConsumer 返回类型 通过.accpet()方法进行传参
#可更改传参方式
public static BiConsumer<Object,String> getHSSFWorkbook( Class<?> c){return(list,name)-> {#具体实现}
1、创建工作簿以及sheet页
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet("基本数据");
//设置列宽度大小
sheet.setDefaultColumnWidth((short) 15);
//设置行高
sheet.setDefaultRowHeight((short) (15 * 20));
2、创建表头标题
int indexRow = 0;
int startIndex = 0;
HSSFCell headCell;
#从第0行开始,设置表头
HSSFRow hssfRow = sheet.createRow(indexRow++);
#通过映射得到实体类字段
Field[] fields = c.getDeclaredFields();
for (Field field : fields) {#通过映射得到表头名称ExcelField excelField = field.getAnnotation(ExcelField.class);if (excelField != null) {#设置第0行 第startIndex++列的表头headCell = hssfRow.createCell(startIndex++);//设置表头的样式setHeadStyle(headCell, wb);//设置单元格内容headCell.setCellValue(excelField.value());}
}
3、设置表内容
#创建行
HSSFRow hssfRowData;
#得到表内数据集合
List<Object> objects = null;
if (list instanceof List) {objects = (List) list;
}
for (int i = 0; i< Objects.requireNonNull(objects).size(); i++) {#从第 1 行开始插入数据hssfRowData = sheet.createRow(indexRow++);int temp = 0;HSSFCell hssfCell;#获取实体类中属性字段Field[] fieldDatas = objects.get(i).getClass().getDeclaredFields();for (int j=0;j<fieldDatas.length;j++) {#字段类型Type fieldType = fieldDatas[j].getType();#字段名称String fieldName = fieldDatas[j].getName();#对于List类型字段单独判断if ("java.util.List".equals(fieldType.getTypeName())) {#通过getFieldValueByFieldName方法 调用get方法的到字段值List<String> fieldValueByFieldName = (List<String>) getFieldValueByFieldName(fieldName, objects.get(i));#设置第几列为下拉框CellRangeAddressList region = new CellRangeAddressList(0,fieldValueByFieldName.size(), j, j);#将list集合转变为数组String [] wordTypes=fieldValueByFieldName.toArray(new String[fieldValueByFieldName.size()]);#创建数据验证DataValidationHelper validationHelper = sheet.getDataValidationHelper();#加载下拉列表值DataValidationConstraint validationConstraint = validationHelper.createExplicitListConstraint(wordTypes);#创建验证方式DataValidation dataValidation = validationHelper.createValidation(validationConstraint, region);#做兼容性if (dataValidation instanceof XSSFDataValidation) {dataValidation.setSuppressDropDownArrow(true);dataValidation.setShowErrorBox(true);} else {dataValidation.setSuppressDropDownArrow(false);}#将验证与工作簿绑定sheet.addValidationData(dataValidation);}else {#对于非List类型字段进行设置值#从第 0 列创建单元格开始hssfCell = hssfRowData.createCell(temp++);#得到对应的字段名 调用get方法 的到对应的字段值Object value = getFieldValueByFieldName(fieldDatas[j].getName(), objects.get(i));#设置样式setDataStyle(hssfCell, wb);#设置单元格值setValue(hssfCell, value);}}
}
4、导出excel
File file = new File(name);
FileOutputStream outputStream;
try {outputStream = new FileOutputStream(file);wb.write(outputStream);outputStream.flush();
} catch (IOException e) {e.printStackTrace();
}
5、所封装方法
  • setValue(HSSFCell hssfCell,Object value) 设置单元格值
/*** 设置表格内容的值* @param hssfCell 单元格对象* @param value 单元格的值*/
private static void setValue(HSSFCell hssfCell,Object value){if (value instanceof String) {hssfCell.setCellValue(value.toString());}else if (value instanceof Integer) {hssfCell.setCellValue((Integer) value);} else if (value instanceof Double) {hssfCell.setCellValue((Double) value);} else if (value instanceof Boolean) {hssfCell.setCellValue((Boolean) value);} else if (value instanceof Float) {hssfCell.setCellValue((Float) value);} else if (value instanceof Short) {hssfCell.setCellValue((Short) value);}else if (value instanceof Long) {hssfCell.setCellValue((Long) value);} else if (value instanceof Character) {hssfCell.setCellValue((Character) value);}
}
  • setDataStyle(HSSFCell hssfCell,HSSFWorkbook wb) 设置样式
/*** 设置数据项单元格样式的样式* @param hssfCell 单元格对象* @param wb Excel对象*/
private static void setDataStyle(HSSFCell hssfCell,HSSFWorkbook wb){HSSFCellStyle style=wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);Font font=wb.createFont();font.setFontName("宋体");font.setFontHeightInPoints((short)11);style.setFont(font);hssfCell.setCellStyle(style);
}
  • getFieldValueByFieldName(String fieldName, Object object) 通过相应的字段名调用get方法
/*** 通过属性名字,调用相应的Get方法获取属性值** @param object* @param fieldName 属性名字* @return*/
public static Object getFieldValueByFieldName(String fieldName, Object object) {Class<?> c = object.getClass();try {//设置对象的访问权限,保证对private的属性的访问String s = fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);Method method = c.getMethod("get" + s);return method.invoke(object);} catch (Exception e) {return null;}
}
  • setHeadStyle(HSSFCell hssfCell, HSSFWorkbook wb) 设置表头样式
    /*** 设置表头单元格样式*/private static void setHeadStyle(HSSFCell hssfCell, HSSFWorkbook wb) {HSSFCellStyle style = wb.createCellStyle();style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);Font font = wb.createFont();font.setFontName("宋体");font.setFontHeightInPoints((short) 12);style.setFont(font);//设置字体//设置背景色
/*      style.setFillForegroundColor((short) 13);style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);*/hssfCell.setCellStyle(style);}

五、测试

public static void main(String[] args) {List<Teacher> list=new ArrayList<>();List<String> stringList=new ArrayList<>();stringList.add("delete");stringList.add("modify");String filePath="poi.xlsx";list.add(new Teacher("张三","男","190789799099",20,"88098900989890",stringList));list.add(new Teacher("李四","男","190789799099",24,"88777779898880",stringList));ExcelUtil.getHSSFWorkbook(Teacher.class).accept(list,filePath);
}

以上导出时,excel中存在下拉框列,使用以上方法进行下拉框导出存在长度限制问题,当下拉框中数据超过80个时则不会显示。

六、下拉框优化

1、创建文本簿,设置表头数据

XSSFWorkbook wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("基本数据");
XSSFSheet hiddenSheet = wb.createSheet("selectHidden");
int indexRow = 0;
int titleIndex = 0;
XSSFCell headCell;
XSSFRow hssfRow = sheet.createRow(indexRow++);
Field[] fields = Teacher.class.getDeclaredFields();
for (Field field : fields) {ExcelField excelField = field.getAnnotation(ExcelField.class);if (excelField != null) {headCell = hssfRow.createCell(titleIndex++);//设置单元格内容setValue(headCell, excelField.value());}
}

2、设置excel数据

XSSFCell xssfCell;
for (Teacher teacher : list) {hssfRow = sheet.createRow(indexRow++);int temp = 0;Field[] declaredFields = teacher.getClass().getDeclaredFields();for (Field field : declaredFields) {String name = field.getName();List<String> list1 = new ArrayList<>();Object obj = getValue(name, teacher);if (obj instanceof ArrayList) {for (Object o : (List<?>) obj) {list1.add((String) o);}test(list1, STR, 5, 5, wb, sheet, 0, hiddenSheet);} else {xssfCell = hssfRow.createCell(temp++);setValue(xssfCell, obj);}}
}

3、导出excel

public static void test(List<?> stringList, String str, int start, int end,XSSFWorkbook wb, XSSFSheet sheet, int index, XSSFSheet hiddenSheet){Object[] wordTypes = stringList.toArray(new Object[0]);XSSFCell cell;XSSFRow row;for (int k = 0; k < wordTypes.length; k++) {if (hiddenSheet.getRow(k)!=null){row=hiddenSheet.getRow(k);}else {row=hiddenSheet.createRow(k);}cell = row.createCell(index);setValue(cell, wordTypes[k]);}wb.setSheetHidden(wb.getSheetIndex(hiddenSheet), true);CellRangeAddressList addressList = new CellRangeAddressList(0, wordTypes.length, start, end);DataValidationHelper helper = sheet.getDataValidationHelper();DataValidationConstraint constraint = helper.createFormulaListConstraint(hiddenSheet.getSheetName() + str + wordTypes.length);DataValidation validation = helper.createValidation(constraint, addressList);if (validation instanceof XSSFDataValidation) {validation.setSuppressDropDownArrow(true);validation.setShowErrorBox(true);} else {validation.setSuppressDropDownArrow(false);}sheet.addValidationData(validation);
}

springBoot使用poi导出Excel相关推荐

  1. Springboot利用poi导出excel下载

    Springboot利用poi导出excel下载 因为项目中之前的做法是用反射获取属性,所以demo中也是用的反射,我看网上很多文章都是存入一个List中,不知道这两种哪种更何合适一点,或者有什么更好 ...

  2. Springboot整合Poi导出excel(简单版)

    一. 问题引入 博客专栏: Springboot整合Poi导出excel(简单版) Springboot整合Poi导出excel(注解版) 总所周知Springboot是一个功能强大的微服务框架,集成 ...

  3. Springboot整合Poi导出excel(注解版)

    简介 博客专栏: Springboot整合Poi导出excel(简单版) Springboot整合Poi导出excel(注解版) 上文提到通过poi简单导出Excel后,很多读者反应需要解决导出自适应 ...

  4. springboot中使用poi导出excel文件(亲测实现了第一个功能)

    1.POI简介 Jakarta POI 是一套用于访问微软格式文档的Java API. 组件HWPF用于操作Word的; 组件HSSF用于操作Excel格式文件. 2.常用组件 HSSFWorkboo ...

  5. springboot使用jxls导出excel___(万能通用模板)--- SpringBoot导入、导出Excel文件___SpringBoot整合EasyExcel模板导出Excel

    springboot使用jxls导出excel 实现思路: 首先在springBoot(或者SpringCloud)项目的默认templates目录放入提前定义好的Excel模板,然后在具体的导出接口 ...

  6. Java:使用POI导出Excel文件后打开文件提示因为文件格式或文件扩展名无效而无法打开

    使用POI导出Excel文件后打开文件提示因为文件格式或文件扩展名无效而无法打开 问题 方案 问题 在SpringBoot项目中,使用POI导出查询结果至Excel文件中,成功导出后打开Excel文件 ...

  7. POI 导出excel带小数点的数字格式显示不对解决方法

    POI 导出excel带小数点的数字格式显示不对解决方法 参考文章: (1)POI 导出excel带小数点的数字格式显示不对解决方法 (2)https://www.cnblogs.com/firstd ...

  8. cpu java poi 导出_java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从前,我是一个前端程序猿,怀着对打通 ...

  9. @excel注解_java bean 一对多,多对一 poi导出excel表格

    最近造了个poi导出 excel轮子 特点 java bean 一对多.多对一关系合并单元行 支持图片导出 Bean 一对多关系合并行 代码 public class User { @Excel(na ...

最新文章

  1. 清华首个AI虚拟学生“华智冰”首次露正脸唱歌,颜值与智慧并存
  2. python expect模块_成为顶级黑客--python绝技 阅读笔记(五)
  3. 44. Wildcard Matching 通配符匹配
  4. c# MEF框架(三 导出类的方法和属性)
  5. linux查看tomcat启动内存溢出,Linux下 Tomcat内存溢出
  6. igzo屏幕优点与缺点_手机贴膜怎么选?选对了可以省个屏幕钱
  7. sklearn机器学习之特征工程
  8. 电脑c语言翻译器,C语言window--在线翻译器.doc-资源下载人人文库网
  9. 计算机系统类型64位,详细教你怎么看电脑是32位还是64位
  10. Win10 设置系统还原点
  11. php如何调用protected,PHP中类作用域protected实例详解
  12. mysql 按照条件计数_Mysql按条件计数的几种方法
  13. GAN(Generative Adversarial Nets)详细分析
  14. 【详细】TMS软件十大品牌推荐!
  15. 介绍.NET Core
  16. QT程序到arm板(s5pv210)的移植之旅
  17. R语言中的线性判别分析
  18. 80老翁谈人生(168):北京大学欠老翁的情,欠老翁的债
  19. wifi的sta + ap模式
  20. 1.Object.create() 是什么

热门文章

  1. chromedriver驱动 谷歌浏览器版本89.0.4389.82
  2. 如何测量二极管的正负极
  3. Thinkphp5添加谷歌双重验证
  4. python怎么把照片转成卡通_如何把照片变成手绘动漫化?
  5. 互联网日报 | 瑞幸咖啡同意支付1.8亿美元达成和解;国产游戏海外收入首破千亿;滴滴试水信用支付...
  6. 组合计数——车的放置(逆元)+数三角形+序列统计(lucas定理)
  7. 今日头条街拍图片爬取
  8. 编译程序、解释程序、汇编程序和编译、解释的概念
  9. 被割裂的数据思维(古代战争中的应用)
  10. IDEA中一直Update indexing问题