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();
}
目录
相关文章
|
人工智能 自然语言处理 Java
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
FastExcel 是一款基于 Java 的高性能 Excel 处理工具,专注于优化大规模数据处理,提供简洁易用的 API 和流式操作能力,支持从 EasyExcel 无缝迁移。
3560 65
FastExcel:开源的 JAVA 解析 Excel 工具,集成 AI 通过自然语言处理 Excel 文件,完全兼容 EasyExcel
|
Java BI API
Java Excel报表生成:JXLS库的高效应用
在Java应用开发中,经常需要将数据导出到Excel文件中,以便于数据的分析和共享。JXLS库是一个强大的工具,它基于Apache POI,提供了一种简单而高效的方式来生成Excel报表。本文将详细介绍JXLS库的使用方法和技巧,帮助你快速掌握Java中的Excel导出功能。
635 6
|
Java API Apache
|
Java API Apache
Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
【10月更文挑战第29天】Java编程如何读取Word文档里的Excel表格,并在保存文本内容时保留表格的样式?
1114 5
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
1072 4
|
缓存 easyexcel Java
Java EasyExcel 导出报内存溢出如何解决
大家好,我是V哥。使用EasyExcel进行大数据量导出时容易导致内存溢出,特别是在导出百万级别的数据时。以下是V哥整理的解决该问题的一些常见方法,包括分批写入、设置合适的JVM内存、减少数据对象的复杂性、关闭自动列宽设置、使用Stream导出以及选择合适的数据导出工具。此外,还介绍了使用Apache POI的SXSSFWorkbook实现百万级别数据量的导出案例,帮助大家更好地应对大数据导出的挑战。欢迎一起讨论!
2111 1
|
前端开发 JavaScript Java
导出excel的两个方式:前端vue+XLSX 导出excel,vue+后端POI 导出excel,并进行分析、比较
这篇文章介绍了使用前端Vue框架结合XLSX库和后端结合Apache POI库导出Excel文件的两种方法,并对比分析了它们的优缺点。
3015 0
|
Java Apache
Apache POI java对excel表格进行操作(读、写) 有代码!!!
文章提供了使用Apache POI库在Java中创建和读取Excel文件的详细代码示例,包括写入数据到Excel和从Excel读取数据的方法。
2055 0
|
Java Android开发
WSDL2Java操作指南
1. 安装JDK1.5, 配置系统环境变量:     下载安装JDK后, 设置环境变量:     JAVA_HOME=C:\Program Files\Java\jdk1.5.0_02     Path=%Path%;%JAVA_HOME%\bin(这里的%Path%指你系统已经有的一系列配置)     CLASSPATH=%JAVA_HOME%\lib  2. 下载axis,
1583 0
|
6月前
|
JSON 网络协议 安全
【Java】(10)进程与线程的关系、Tread类;讲解基本线程安全、网络编程内容;JSON序列化与反序列化
几乎所有的操作系统都支持进程的概念,进程是处于运行过程中的程序,并且具有一定的独立功能,进程是系统进行资源分配和调度的一个独立单位一般而言,进程包含如下三个特征。独立性动态性并发性。
295 1

推荐镜像

更多