Java poi 导出,新建(默认每次新建,覆盖之前)
废话不多说,直接干。
<!--添加 poi 依赖 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>ooxml-schemas</artifactId>
<version>1.3</version>
</dependency>
<dependency>
<groupId>org.docx4j</groupId>
<artifactId>docx4j-ImportXHTML</artifactId>
<version>3.0.0</version>
</dependency>
<!--添加Swagger依赖 -->
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.8.0</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.8.0</version>
</dependency>
看到这里大家应该很奇怪只是个导出,为什么还用到了swagger呢。(这是我自己根据当时项目现有东西做的。如果有更好的方法,希望大佬多吐槽下。 哈哈哈哈哈哈哈哈啊哈哈哈哈)
import io.swagger.annotations.ApiModelProperty;
import lombok.extern.slf4j.Slf4j;
import java.lang.reflect.Field;
import java.util.ArrayList;
import java.util.List;
/**
* <p>
* Excel
* </p>
*
* @author king
* @since 2020-07-24
*/
@Slf4j
public class AnnotationUtil {
/**
* 获取注释
* @param instance
* @return
*/
public static List<String> getAnnotation(Object instance){
List<String> list = new ArrayList<>();
Class<?> clazz = instance.getClass();
Field[] fields=clazz.getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
boolean annotationPresent = fields[i].isAnnotationPresent(ApiModelProperty.class);
if (annotationPresent) {
// 获取注解值
String name = fields[i].getAnnotation(ApiModelProperty.class).value();
list.add(name);
}
}
return list;
}
}
贴一直图,大概知道为什么用到swagger了把。通过反射,获取注解里的注释。
接下来就是最关键的导出了。
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.*;
import java.io.*;
import java.lang.reflect.Field;
import java.util.List;
/**
* <p>
* Excel
* </p>
*
* @author king
* @since 2020-07-24
*/
@Slf4j
public class ExcelUtil {
/**
*
* @param sheetName 工作表 可传可不传
* @param path Excel 路径
* @param obj 传入生成Excel的实体类,用于反射注释
* @param list 只能传入Object 类型的,数据依赖于反射获取,不用担心字段和数据不匹配。
*/
public static void createExcel (String sheetName,String path,Object obj,List<Object> list) {
//创建一个excel对象
HSSFWorkbook wb = new HSSFWorkbook();
if(null == sheetName){
sheetName = "sheet";
}
//创建sheet
HSSFSheet sheet = wb.createSheet(sheetName);
//创建新行
HSSFRow row = sheet.createRow(0);
// 字段样式
HSSFCellStyle fieldStyle = fieldStyle(wb);
// 数据样式
HSSFCellStyle style = cellStyle(wb);
// 创建头部栏 字段说明
List<String> annotationList = AnnotationUtil.getAnnotation(obj);
for (int i = 0; i < annotationList.size(); i++) {
String value = annotationList.get(i);
theAdaptive(i,value,sheet,row,fieldStyle);
}
// 写入数据
for (int j = 0; j < list.size(); j++) {
// 创建一行:从第二行开始,跳过属性列
Row rows = sheet.createRow(j + 1);
// 得到要插入的每一条记录
Class<?> cls =list.get(j).getClass();
//得到所有属性
Field[] fields = cls.getDeclaredFields();
for (int i=0;i<fields.length;i++){
Cell cell = rows.createCell(i);
try {
//得到属性
Field field = fields[i];
//打开私有访问
field.setAccessible(true);
//获取属性
String name = field.getName();
//获取属性值
Object value = field.get(list.get(j));
if(null == value){
value =" ";
}
cell.setCellValue(value.toString());
cell.setCellStyle(style);
} catch (IllegalAccessException e) {
e.printStackTrace();
}
}
}
//生成文件
FileOutputStream fStream = null;
try {
fStream = new FileOutputStream(path);
wb.write(fStream);
log.info("Congratulations on the success of the sand sculpture ---->>> SUCCESS --->>> your are a der der der ");
} catch (Exception e) {
String msg = e.getMessage();
log.error(msg);
}
}
/**
*
* @param i
* @param value
* @param sheet
* @param row
* @param fieldStyle
*/
public static void theAdaptive(int i,String value,HSSFSheet sheet,HSSFRow row,HSSFCellStyle fieldStyle){
int length = value.length();
// 自适应太麻烦,直接获取字段 * 900
sheet.setColumnWidth(i,length * 900);
// 设置高
row.setHeightInPoints(20);
HSSFCell cell = row.createCell(i);
cell.setCellValue(value);
cell.setCellStyle(fieldStyle);
}
/**
* 数据样式
* @param wb
* @return
*/
public static HSSFCellStyle cellStyle(HSSFWorkbook wb){
//设置样式
HSSFCellStyle style = wb.createCellStyle();
//水平居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//垂直居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 设置边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
// 字体设置
HSSFFont font = wb.createFont();
font.setFontName("仿宋");
font.setFontHeightInPoints((short) 11);
style.setFont(font);
return style;
}
/**
* 字段说明样式
* @param wb
* @return
*/
public static HSSFCellStyle fieldStyle(HSSFWorkbook wb){
// 样式
HSSFCellStyle style = wb.createCellStyle();
//水平居中
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
//垂直居中
style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 设置边框
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
// 字体设置
HSSFFont font = wb.createFont();
font.setFontName("仿宋");
font.setFontHeightInPoints((short) 12);
// 加粗
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 应用到当前的样式
style.setFont(font);
return style;
}
}
怎么样是不是很简单啊,只要不是太复杂的,一下搞定。 有什么好的建议,欢迎各位大佬吐槽留言。