编程语言
首页 > 编程语言> > java导出数据为可下载的excel

java导出数据为可下载的excel

作者:互联网

最近的项目里需要导出数据为excel,赶紧点亮技能,顺便在博客园记录一下w

参考来源 ,结合大佬的代码,根据自己的需求改了改,增加了几个功能:

  1. 工具类增加可变参数,可以传入不同的数据
  2. 创建注释类,用于通过反射获取表头,不用一个个对照实体类属性顺序添加。

另外我运行时,如果这个接口有返回值,接口里的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