0
点赞
收藏
分享

微信扫一扫

java poi3.15操作对象导出为excel

夕颜合欢落 2022-01-18 阅读 29

因为程序版本的限制,最多只能用到poi3.15,所以用不了easyexcel。小类初衷。草率的写,也没有测试什么很大量数据的情况,有问题可以指出来哟。
由于程序的中心思想是解决导出excel,所以数据是单纯的对象属性不包括list等等。分为两个步骤,一个是注释,还有一个就是工具类操作。
我的程序是测试导成本地的,如果你要用来发给前端什么的也可以另外写输出。
注释定义:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Inherited
public @interface PoiExcel {
    String value();

    int index();
}

其中index表示该属性对应在excel中的列数,value表示列标题。

工具类定义:
包括以下几个部分
1.创建表头 createHeader
2.单条数据行的写入 writeDatas
3.多条数据的写入 getHSSFWorkbook
4.创建表头样式 getStringCenterStyle
5.main函数测试

public class ExcelUtil<T> {

    /**
     * 根据传入的对象创建HSSFWorkbook
     *
     * @param wb
     * @param dataList
     * @param <T>
     * @param pageSize 一页多少条
     * @return
     */
    public static <T> HSSFWorkbook getHSSFWorkbook(HSSFWorkbook wb, List<T> dataList, Class<T> clazz, int pageSize) {
        if (wb == null) {
            wb = new HSSFWorkbook();
        }
        if (dataList == null) {
            createHeader(wb, String.valueOf(0), clazz);
            return wb;
        }
        int j = 0;
        int maxRow = pageSize;//sheet.getLastRowNum();65535
        if (maxRow > 65535) {
            maxRow = 65535;
        }
        int dataSize = dataList.size();

        HSSFSheet sheet = null;
        for (int i = 0; i < dataSize; i++) {
            if (i % maxRow == 0) {
                sheet = createHeader(wb, String.valueOf(j++), clazz);
            }
            writeDatas(sheet, dataList.get(i), clazz, (i % maxRow + 1));
        }
        try {
            if(wb != null){
                wb.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
        return wb;
    }

    /**
     * 创建表格头
     * @param wb
     * @param sheetName
     * @param clazz
     * @param <T>
     * @return
     */
    public static <T> HSSFSheet createHeader(HSSFWorkbook wb, String sheetName, Class<T> clazz) {
        HSSFSheet sheet = wb.createSheet(sheetName);
        HSSFRow row = sheet.createRow(0);
        Field[] fields = clazz.getDeclaredFields();
        HSSFCell cell;
        HSSFCellStyle style = getStringCenterStyle(wb);
        for (Field field : fields) {
            PoiExcel poiExcel = field.getAnnotation(PoiExcel.class);
            cell = row.createCell(poiExcel.index());
            cell.setCellStyle(style);//设置单元格格式为"文本"
            cell.setCellType(CellType.STRING);
            cell.setCellValue(poiExcel.value());
        }
        return sheet;
    }

    /**
     * 行数据填写
     * @param sheet
     * @param data
     * @param clazz
     * @param rowNum
     * @param <T>
     */
    public static <T> void writeDatas(HSSFSheet sheet, T data, Class<T> clazz, int rowNum) {
        Field[] fields = clazz.getDeclaredFields();
        List<Field> fieldList = Arrays.asList(fields);
        HSSFRow row = sheet.createRow(rowNum);
        fieldList.stream().forEach(field -> {
            field.setAccessible(true);
            PoiExcel poiExcel = field.getAnnotation(PoiExcel.class);
            String fieldVal = "";
            try {
                fieldVal = (String) field.get(data);
            } catch (IllegalAccessException e) {
                e.printStackTrace();
            }
            row.createCell(poiExcel.index()).setCellValue(fieldVal);
        });
    }

	/**
     * 样式
     * @param wb
     * @return
     */
    public static HSSFCellStyle getStringCenterStyle(HSSFWorkbook wb) {
        HSSFCellStyle style = wb.createCellStyle();
        HSSFDataFormat format = wb.createDataFormat();
        style.setDataFormat(format.getFormat("@"));
        style.setAlignment(HorizontalAlignment.CENTER); // 创建一个居中格式
        return style;
    }



    /**
     * excel export usage
     * @param args
     */
    public static void main(String[] args) {
        List<TestEntity> a = new ArrayList<>();
        TestEntity a1 = new TestEntity();
        a1.setT1("1");
        a1.setT2("2");
        TestEntity a2 = new TestEntity();
        a2.setT1("1");
        a2.setT2("2");
        a.add(a1);
        a.add(a2);
        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook(null, a, TestEntity.class, 1);
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(new File("F://test.xls"));
            wb.write(fos);
            fos.flush();
            fos.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
举报

相关推荐

0 条评论