Java Apache POI 操作 Excel 导出

简介: 版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82655653 ...
版权声明:本文首发 http://asing1elife.com ,转载请注明出处。 https://blog.csdn.net/asing1elife/article/details/82655653

Java Apache POI 操作 Excel 导出

Java 可以通过 Apache POI 操作 Excel 的导入导出
Apache POI 是一套操作 Microsoft Office 套件的开源 Java API

更多精彩

JAR 包依赖及介绍

  1. 请参见 Java Apache POI 操作 Excel 导入

实现步骤

创建 Excel 实体类,用于同一接收导出数据

  1. headers 用于存储导出数据时规定的表格头部内容
  2. cells 是一个在 List 中嵌套 List 的结构
    • 外层的 List 表示行数据
    • 内层的 List 表示列数据
    • 结合起来也就是有多少行多少列的数据
  3. 如果导出的内容存在多个 sheet ,只需要使用一个 Map ,通过 key-value 的形式包装 Excel 实体类即可
    • 例如 Map<String, Excel> excels ,Map 中的 key 就是 sheet 的名称
public class Excel {
    // 表头
    private List<String> headers = Lists.newArrayList();

    // 内容
    private List<List<String>> cells = Lists.newArrayList();

    // 省略 Getter/Setter 方法
}

举一个上述实体类使用的例子

  1. 传入的数据本身就很复杂,需要导出的数据也存在多个 sheet
private Map<String, Excel> wrapFeedbackQuestions(Map<String, ArrayList<FeedbackQuestion>> feedbackQuestionMap) {
    Map<String, Excel> excels = Maps.newHashMap();

    if (feedbackQuestionMap.isEmpty()) {
        throw new TSharkException("统计数据转换异常,请咨询管理员");
    }

    List<String> divide = Lists.newArrayList();

    feedbackQuestionMap.forEach((k, v) -> {
        Excel excel = new Excel();
        excel.addHeader("题目");
        excel.addHeader("小计");

        v.forEach(feedbackQuestion -> {
            // 按照约定格式每行添加数据
            List<String> row = Lists.newArrayList();
            row.add(feedbackQuestion.getContent());
            row.add(feedbackQuestion.getCount().toString());

            excel.addCell(row);
        });

        excels.put(k, excel);
    });

    return excels;
}

构建 ExcelExportUtil 工具类

  1. Map<String, Excel> excel 是通过上述操作构建好的数据结构
  2. String filePath 是生成 Excel 后,存放文件的地址
  3. initHeaderStyle()initCellStyle() 是对表格样式的初始化,在后续步骤中提供
  4. formatLongValue() 是为了防止单元格内容过长,而设置的超过一定量长度添加换行符
public static String export(Map<String, Excel> excel, String filePath) {
    HSSFWorkbook workbook = new HSSFWorkbook();

    // 表头样式
    HSSFCellStyle headerStyle = initHeaderStyle(workbook);

    // 单元格样式
    HSSFCellStyle cellStyle = initCellStyle(workbook);

    excel.forEach((key, value) -> {
        HSSFSheet sheet = workbook.createSheet(key);

        List<String> headers = value.getHeaders();
        List<List<String>> cells = value.getCells();

        // 表头包装
        HSSFRow headerRow = sheet.createRow(0);
        for (int i = 0; i < headers.size(); i++) {
            HSSFCell cell = headerRow.createCell(i);
            cell.setCellValue(headers.get(i));
            cell.setCellStyle(headerStyle);
        }

        // 内容包装
        for (int j = 0; j < cells.size(); j++) {
            HSSFRow row = sheet.createRow(j + 1);

            List<String> child = cells.get(j);
            for (int k = 0; k < child.size(); k++) {
                HSSFCell cell = row.createCell(k);
                cell.setCellValue(formatLongValue(child.get(k)));
                cell.setCellStyle(cellStyle);
            }
        }

        // 自动撑开列宽
        sheet.autoSizeColumn((short) 0);
        sheet.autoSizeColumn((short) 1);
    });

    // 保存文件并返回名称
    String fileName = FileUtil.getRandomFileNameByDate();

    try {
        String fullFileName = filePath + fileName + FILE_SUFFIX;

        FileOutputStream stream = new FileOutputStream(fullFileName);
        workbook.write(stream);
        stream.flush();
    } catch (Exception e) {
        logger.error("Excel导出失败,", e);
    }

    return fileName;
}

initHeaderStyle() 初始化表头样式

  1. 对表头单元格的字体、颜色、背景做一些自定义操作
private static HSSFCellStyle initHeaderStyle(HSSFWorkbook workbook) {
    // 表头字体
    HSSFFont font = workbook.createFont();
    font.setFontHeightInPoints((short) 15);
    font.setColor(HSSFColor.WHITE.index);

    // 表头样式
    HSSFCellStyle headerStyle = workbook.createCellStyle();
    headerStyle.setFont(font);
    headerStyle.setWrapText(true);
    headerStyle.setFillBackgroundColor(HSSFColor.GREEN.index);
    headerStyle.setFillForegroundColor(HSSFColor.GREEN.index);
    // 需要设置此项,单元格背景色才会生效
    headerStyle.setFillPattern(CellStyle.SOLID_FOREGROUND);

    return headerStyle;
}

initCellStyle 初始化单元格样式

private static HSSFCellStyle initCellStyle(HSSFWorkbook workbook) {
    // 单元格字体
    HSSFFont font = workbook.createFont();
    font.setFontHeightInPoints((short) 15);

    // 单元格样式
    HSSFCellStyle cellStyle = workbook.createCellStyle();
    cellStyle.setFont(font);
    cellStyle.setWrapText(true);

    return cellStyle;
}

formatLongValue 格式化超长内容

  1. 需要单元格启用 setWrapText = true 才会生效
private static String formatLongValue(String value) {
    // 长度限制
    int limit = 50;

    // 没有达到限制直接返回
    if (value.length() < 50) {
        return value;
    }

    StringBuilder stringBuilder = new StringBuilder();

    // 设置长度限制的正则匹配
    Pattern p = Pattern.compile("(.{" + limit + "}|.*)");
    Matcher m = p.matcher(value);

    while (m.find()) {
        String group = m.group();

        // 字符不存在则跳过
        if (group == null || group.trim().equals("")) {
            continue;
        }

        // 超过限制添加换行符
        stringBuilder.append(group);
        stringBuilder.append("\n");
    }

    return stringBuilder.toString();
}
目录
相关文章
|
2月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
2天前
|
存储 Java
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
java的Excel导出,数组与业务字典匹配并去掉最后一个逗号
17 2
|
27天前
|
存储 Java Apache
|
1月前
|
easyexcel Java 关系型数据库
阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
该文章主要介绍了在Java应用中如何使用EasyExcel技术完成对Excel文件的导入和导出操作,包括环境搭建、基本概念、快速入门、进阶操作和综合应用等内容,并提供了相关代码示例和注意事项。
 阿里巴巴-EasyExcel 基于Java的简单、省内存的读写Excel
|
19天前
|
Java Apache Maven
Java中使用poi+poi-tl实现根据模板导出word文档
这个过程不仅简化了文档生成的工作,而且保证了生成文档的一致性与准确性,特别适合于那些需要生成大量文档的自动化场景。通过以上步骤,Java开发人员可以实现高效、可靠的Word文档导出功能。
68 0
|
1月前
|
easyexcel Java API
Apache POI、EasyPoi、EasyExcel 三种区别,如何选择
Apache POI、EasyPoi、EasyExcel 三种区别,如何选择
218 0
|
2月前
|
Java 数据安全/隐私保护
Java无模版导出Excel 0基础教程
经常写数据导出到EXCEL,没有模板的情况下使用POI技术。以此作为记录,以后方便使用。 2 工具类 样式工具: 处理工具Java接口 水印工具 导出Excel工具类 3 测试代码 与实际复杂业务不同 在此我们只做模拟 Controller Service 4 导出测试 使用Postman进行接口测试,没接触过Postman的小伙伴可以看我这篇博客Postman导出excel文件保存为文件可以看到导出很成功,包括水印 sheet页名称自适应宽度。还有一些高亮……等功能可以直接搜索使用
Java无模版导出Excel 0基础教程
|
2月前
|
Java BI 数据处理
如何在Java中实现Excel操作
如何在Java中实现Excel操作
|
2月前
|
easyexcel Java Apache
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
EasyExcel导入的时候报错Caused by: java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/File
188 0
|
25天前
|
存储 消息中间件 Java
Apache Flink 实践问题之原生TM UI日志问题如何解决
Apache Flink 实践问题之原生TM UI日志问题如何解决
31 1

推荐镜像

更多