使用POI组件导出Excel文件

在使用Java进行日常开发的时候,经常需要导出一些文件。其中Excel文件是最常见的一种导出格式,Java中可导出Excel的组件有很多种,这儿我详细介绍其中一种——POI

POI

POI由Apache公司开发,可到Apache官网直接下载POI的压缩包
POI压缩包下载
在这里插入图片描述
下载后解压,将我们需要的jar包放进我们项目的lib文件中,即可在项目中使用POI组件的功能

导出Excel

进行Excel表格式设置
设置标题行开始位置,表头行开始位置等

    /***
     * 标题行开始位置
     */
    private static final int TITLE_START_POSITION = 0;

    /***
     * 时间行开始位置
     */
    private static final int DATEHEAD_START_POSITION = 1;

    /***
     * 表头行开始位置
     */
    private static final int HEAD_START_POSITION = 2;

    /***
     * 文本行开始位置
     */
    private static final int CONTENT_START_POSITION = 3;

生成Excel表标题

  /**
     * 生成标题(第零行创建)
     * @param titleMap 对象属性名称->表头显示名称
     * @param sheetName sheet名称
     */
    private static void createTitleRow(Map<String, String> titleMap, String sheetName) {
        CellRangeAddress titleRange = new CellRangeAddress(0, 0, 0, titleMap.size() - 1);
        sheet.addMergedRegion(titleRange);
        HSSFRow titleRow = sheet.createRow(TITLE_START_POSITION);
        HSSFCell titleCell = titleRow.createCell(0);
        titleCell.setCellValue(sheetName);
    }

创建时间行
该部分是在Excel文件中设置一行来显示导出时间,可按需求保留或删除

    /**
     * 创建时间行(第一行创建)
     * @param titleMap 对象属性名称->表头显示名称
     */
    private static void createDateHeadRow(Map<String, String> titleMap) {
        CellRangeAddress dateRange = new CellRangeAddress(1, 1, 0, titleMap.size() - 1);
        sheet.addMergedRegion(dateRange);
        HSSFRow dateRow = sheet.createRow(DATEHEAD_START_POSITION);
        HSSFCell dateCell = dateRow.createCell(0);
        dateCell.setCellValue(new SimpleDateFormat("yyyy年MM月dd日").format(new Date()));
    }

创建表头行
这儿创建表头行是数据开始的行数

  /**
     * 创建表头行(第二行创建)
     * @param titleMap 对象属性名称->表头显示名称
     */
    private static void createHeadRow(Map<String, String> titleMap) {
        // 第1行创建
        HSSFRow headRow = sheet.createRow(HEAD_START_POSITION);
        int i = 0;
        for (String entry : titleMap.keySet()) {
            HSSFCell headCell = headRow.createCell(i);
            headCell.setCellValue(titleMap.get(entry));
            i++;
        }
    }

创建数据行
这个函数有两个参数:dataList和titleMap
dataList:实体类集合,集合中的每个实体类就是一行数据
titleMap:存储的列名,数据库字段名和中文的映射

    /**
     *
     * @param dataList 对象数据集合
     * @param titleMap 表头信息
     */
    private static void createContentRow(List<?> dataList, Map<String, String> titleMap) {
        try {
            int i=0;
            for (Object obj : dataList) {
                HSSFRow textRow = sheet.createRow(CONTENT_START_POSITION + i);
                int j = 0;
                for (String entry : titleMap.keySet()) {
                    String method = "get" + entry.substring(0, 1).toUpperCase() + entry.substring(1);
                    Method m = obj.getClass().getMethod(method, null);
                    String value =   m.invoke(obj, null).toString();
                    HSSFCell textcell = textRow.createCell(j);
                    textcell.setCellValue(value);
                    j++;
                }
                i++;
            }

        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }

导出示例
在这里插入图片描述

原创文章 12 获赞 51 访问量 5838

猜你喜欢

转载自blog.csdn.net/weixin_44582716/article/details/103350727