使用Apache POI和EasyExcel生成Excel文件(一)

358 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第二十三天,点击查看活动详情


之前研究过生成Excel的方式,可以通过手动创建XSSFWorkbook并且通过循环列表数据插入数据的方式,也可以使用开源工具EasyExcel进行Excel的读写操作。

首先介绍的是第一种,通过Apache poi来通过代码生成Excel文件

Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能。

简单创建一个只有循环数据和标题的Excel表格

  1. 创建一个新的工作薄

如果是创建扩展名为.xls的文件,则使用

HSSFWorkbook wb = new HSSFWorkbook();

如果是创建扩展名为.xlsx的文件,则使用

XSSFWorkbook wb = new XSSFWorkbook();
  1. 创建一个新的Sheet
XSSFSheet sheet = wb.createSheet("sheet1");
  1. 循环存放标题数据的list,将标题数据放入Excel的第一行中

传参示例如:

LinkedHashMap<String, String> linkedHashMap = new LinkedHashMap<>();
linkedHashMap.put("typeName", "类型名称");

生成excel第一行数据:

//生成第一行数据
XSSFRow row = sheet.createRow(rowNum);
XSSFCell cell = null;
// 创建n个Excel的单元格 (n列)
Set<Entry<String, String>> entrySet = linkedHashMap.entrySet();
int k = 0;
for (Entry<String, String> entry : entrySet) {
    sheet.setColumnWidth(k, 4500);// 设置单元格宽度
    String value = entry.getValue();
    cell = row.createCell(k);// 创建第 i+1列
    cell.setCellValue(value); // 设置列里的标题
    k++;
}
  1. 循环存放值数据的list列表,将它放在标题行的下方
// 第二行开始 循环列表对象里的数据
for (int i = 0; i < list2.size(); i++) {
    XSSFRow row2 = sheet.createRow(size + i + 1);
    //获取当前循环的列表对象
    T mdl = list2.get(i);
    Class<? extends Object> clazz = mdl.getClass();
    //获取标题Map数据的所有key
    Set<String> keySet = linkedHashMap.keySet();
    int j = 0;
    for (String key : keySet) {
        String getMethodName;

        //首字母是否大写
        if (fixMethodName) {
            //生成参数名对应的get方法
            getMethodName = "get" + CopyPropertiesUtils.firstLetterToUpperCase(key);
        } else {
            getMethodName = "get" + key;
        }

        //通过反射调用对象的内部方法获取数据
        Method getMethod = clazz.getMethod(getMethodName);
        getMethod.setAccessible(true);
        Object obj = getMethod.invoke(mdl);
        cell = row2.createCell(j);
        //特殊格式的数据做特殊处理
        if (null == obj) {
            cell.setCellValue("");
        } else if (obj instanceof Integer) {
            cell.setCellValue(((Integer) obj).intValue());
        } else if (obj instanceof String) {
            cell.setCellValue((String) obj);
        } else if (obj instanceof Date) {
            String dateString = formatter.format((Date) obj);
            cell.setCellValue(dateString);
        } else if (obj instanceof Boolean) {
            cell.setCellValue(obj.toString());
        } else if (obj instanceof Double) {
            Double dObj = ((Double) obj).doubleValue();
            NumberFormat nf = new DecimalFormat("0.00");
            cell.setCellType(CellType.STRING);
            cell.setCellValue(nf.format(dObj));
        } else {
            cell.setCellValue(obj.toString());
        }
        j++;
    }

以上为简单使用poi生成一个Excel文件的方式,之后讲述一下复杂的Excel文件生成,比如Excel中要插入图片,图片下方继续插入图片等。