java导出数据为可下载的excel
作者:互联网
最近的项目里需要导出数据为excel,赶紧点亮技能,顺便在博客园记录一下w
参考来源 ,结合大佬的代码,根据自己的需求改了改,增加了几个功能:
- 工具类增加可变参数,可以传入不同的数据
- 创建注释类,用于通过反射获取表头,不用一个个对照实体类属性顺序添加。
另外我运行时,如果这个接口有返回值,接口里的response.setContentType("application/x-xls"); 这行会报无法转换返回值类型的错误,目前还没找到解决方法,但删掉这行似乎也没影响,诶嘿。
导入包:
<!-- excel生成 -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.2</version>
</dependency>
工具类:
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.lang.reflect.Field;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
public class ExcelUtil {
/**
* 生成Excel表格
* @param sheetName sheet名称
* @param titleList 表头列表
* @param data 数据列表
* @return HSSFWorkbook对象
* */
public static HSSFWorkbook createExcel(String sheetName,
List<String> titleList, List... data) throws IllegalAccessException {
//创建HSSFWorkbook对象
HSSFWorkbook wb = new HSSFWorkbook();
//创建sheet对象
HSSFSheet sheet=wb.createSheet(sheetName);
//在sheet里创建第一行,这里即是表头
HSSFRow rowTitle=sheet.createRow(0);
//写入表头的每一个列
for (int i = 0; i < titleList.size(); i++) {
//创建单元格
rowTitle.createCell(i).setCellValue(titleList.get(i));
}
//写入每一行的记录
int col = 1;
for (List dataList : data){
System.out.println(dataList);
for (Object o : dataList) {
//创建新的一行,递增
HSSFRow rowData = sheet.createRow(col);
col += 1;
//通过反射,获取POJO对象
Class cl = o.getClass();
//获取类的所有字段
Field[] fields = cl.getDeclaredFields();
for (int j = 0; j < fields.length; j++) {
//设置字段可见,否则会报错,禁止访问
fields[j].setAccessible(true);
//创建单元格
Object obj = fields[j].get(o);
if (obj == null)
continue;
if (obj instanceof Date) {
rowData.createCell(j).setCellValue(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").format(obj));
} else {
rowData.createCell(j).setCellValue(String.valueOf(obj));
}
}
}
}
return wb;
}
}
用于通过反射获取信息的注释类
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
@Retention(RetentionPolicy.RUNTIME)
public @interface Desc {
String value();
}
实体类
public class Role{
@Desc("角色ID")
private Long roleId;
@Desc("角色名称")
private String roleName;
@Desc("备注")
private String remark;
}
接口方法
public void export(HttpServletResponse response){
try {
// Excel文件输出流
OutputStream output=response.getOutputStream();
String fileName = "结算清单详情表";
response.reset();
//中文名称要进行编码处理
response.setHeader("Content-disposition",
"attachment; filename="+new String(fileName.getBytes("GB2312"),"ISO8859-1")+".xls");
// 通过反射获取表头
List<String> titleList = new ArrayList<>();
Field[] fields = Role.class.getDeclaredFields();
for (Field field : fields){
Desc desc = AnnotationUtils.findAnnotation(field, Desc.class);
if (desc != null)
titleList.add(desc.value());
}
// 数据对象,这里就不从数据库读入了,直接模拟几个
List<Role> list = new ArrayList<>();
Role role1 = new Role();
role1.setRoleId(Long.valueOf(1));
role1.setRoleName("角色1");
role1.setRoleName("备注1");
list.add(role1);
Role role2 = new Role();
role2.setRoleId(Long.valueOf(2));
role2.setRoleName("角色2");
role2.setRoleName("备注2");
list.add(role2);
List<String> list2 = new ArrayList<>();
list2.add("测试两个角色");
HSSFWorkbook hSSFWorkbook = ExcelUtil.createExcel("sheet", titleList, list, list2)
hSSFWorkbook.write(output);
output.close();
}catch (IOException e){
log.error("系统错误:IOException");
}catch (IllegalAccessException e){
log.error("系统错误:IllegalAccessException");
}
}
标签:java,String,导出,excel,import,new,List,titleList 来源: https://www.cnblogs.com/yiyuzi/p/14814006.html