首页 > 其他分享 >【Excel工作流】使用excel导出列表数据

【Excel工作流】使用excel导出列表数据

时间:2024-11-21 14:43:48浏览次数:3  
标签:++ Excel excel 表头 headers 字段 导出 workbook

/**
 * 导出 Excel 数据
 *
 * @param sheetName  表格名称
 * @param headers    表头列表
 * @param fieldNames 字段名称映射
 * @param data       数据列表
 * @param <T>        数据类型
 * @return Excel 数据字节流
 * @throws IOException 异常
 */
public static <T> byte[] exportToExcel(String sheetName, List<String> headers, Map<String, String> fieldNames, List<T> data) throws IOException {
    // 创建一个新的 Excel 工作簿对象(XSSFWorkbook 支持生成 .xlsx 格式的 Excel 文件)
    Workbook workbook = new XSSFWorkbook();

    // 创建一个新的 Sheet,指定表格名称
    Sheet sheet = workbook.createSheet(sheetName);

    // 创建表头行,第一行作为表头
    Row headerRow = sheet.createRow(0);  // 第 0 行是表头
    // 将每个列头的内容放入第一行对应的单元格
    for (int i = 0; i < headers.size(); i++) {
        headerRow.createCell(i).setCellValue(headers.get(i));  // 创建单元格并设置列名(标题)
    }

    // 填充数据部分
    int rowNum = 1;  // 从第 1 行开始填充数据,跳过表头
    for (T record : data) {
        // 对于每一条记录,创建一行数据
        Row row = sheet.createRow(rowNum++);  // 为每一条记录创建一行

        int cellNum = 0;  // 每一行的单元格索引
        // 遍历字段映射,将每个字段的值填充到对应的单元格
        for (Map.Entry<String, String> entry : fieldNames.entrySet()) {
            try {
                // 获取字段名称(Map 中的 key)对应的字段对象
                Field field = record.getClass().getDeclaredField(entry.getKey());
                field.setAccessible(true);  // 设置字段可访问,即使是私有字段也能访问

                // 获取当前字段的值
                Object value = field.get(record);

                // 如果字段值不为空,则写入该值,否则写入空字符串
                row.createCell(cellNum++).setCellValue(value != null ? value.toString() : "");
            } catch (NoSuchFieldException | IllegalAccessException e) {
                // 如果找不到字段或访问字段时出错,打印错误并写空白
                e.printStackTrace();
                row.createCell(cellNum++).setCellValue("");  // 如果字段没有找到或者获取失败,写空白
            }
        }
    }

    // 将工作簿写入字节流并返回
    try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
        // 将工作簿内容写入字节流
        workbook.write(bos);

        // 返回字节数组,表示生成的 Excel 文件内容
        return bos.toByteArray();
    } finally {
        // 确保工作簿在结束时关闭,释放资源
        workbook.close();
    }
}

代码注释说明:

1. 创建 WorkbookSheet
Workbook workbook = new XSSFWorkbook();
Sheet sheet = workbook.createSheet(sheetName);
  • XSSFWorkbook 用于创建 .xlsx 格式的工作簿,支持 Excel 2007 及以后的版本。
  • createSheet(sheetName) 创建一个新的工作表,表格名称由 sheetName 参数指定。
2. 创建表头行并填充表头数据
Row headerRow = sheet.createRow(0);
for (int i = 0; i < headers.size(); i++) {
    headerRow.createCell(i).setCellValue(headers.get(i));
}
  • 使用 createRow(0) 创建表头行,行号为 0。
  • 遍历 headers 列表,将表头列名写入第一行的对应单元格。
3. 填充数据部分
int rowNum = 1;
for (T record : data) {
    Row row = sheet.createRow(rowNum++);
    int cellNum = 0;
    for (Map.Entry<String, String> entry : fieldNames.entrySet()) {
        Field field = record.getClass().getDeclaredField(entry.getKey());
        field.setAccessible(true);
        Object value = field.get(record);
        row.createCell(cellNum++).setCellValue(value != null ? value.toString() : "");
    }
}
  • 从第 1 行开始填充数据(rowNum = 1),跳过表头行。
  • 对每一条 record 数据:
    • 使用反射获取记录对象中对应字段的值。
    • 如果字段值存在,写入单元格;如果为空,则写空字符串。
4. 处理异常情况
catch (NoSuchFieldException | IllegalAccessException e) {
    e.printStackTrace();
    row.createCell(cellNum++).setCellValue("");  // 如果字段没有找到或者获取失败,写空白
}
  • 如果反射过程发生错误(如字段不存在或无权限访问),捕获异常并写入空白。
5. 写入字节流并返回
try (ByteArrayOutputStream bos = new ByteArrayOutputStream()) {
    workbook.write(bos);
    return bos.toByteArray();
}
  • 使用 ByteArrayOutputStream 将工作簿内容写入内存字节流。
  • 返回生成的 Excel 文件字节流。
6. 关闭资源
finally {
    workbook.close();  // 确保工作簿在结束时关闭,释放资源
}
  • 确保 workbook 关闭,释放资源,避免内存泄漏。

7. 如何使用这个工具类?

假设我们有一个类 IncomeBillHeaderVo,它有不同的字段,我们可以通过工具类进行 Excel 导出。

示例使用代码:
public class IncomeBillHeaderVo {
    private Long id;
    private String documentCode;
    private Date documentDate;
    private String contactUnit;
    private Integer businessType;
    private String remark;

    // Getters and Setters
}

// 控制层或者服务层使用
public byte[] exportIncomeBillHeaders(List<IncomeBillHeaderVo> data) throws IOException {
    // 定义表头
    List<String> headers = List.of("序号", "单据编号", "单据日期", "往来单位", "业务类型", "备注");

    // 定义字段映射
    Map<String, String> fieldNames = Map.of(
            "id", "序号",
            "documentCode", "单据编号",
            "documentDate", "单据日期",
            "contactUnit", "往来单位",
            "businessType", "业务类型",
            "remark", "备注"
    );

    // 调用工具类生成 Excel 文件的字节流
    return ExcelExportUtil.exportToExcel("收款单数据", headers, fieldNames, data);
}

8. 功能总结:

  • 通用性强:通过传递不同的字段和表头,能够导出各种类型的数据。
  • 反射机制:使得工具类支持不同的数据类型,无需为每个不同的数据类型编写单独的导出方法。
  • 字段与表头分离:字段与表头分开定义,易于维护和调整。

9. 可扩展性:

  • 可以进一步扩展支持更多的 Excel 格式,如 .xls,通过增加对 HSSFWorkbook 的支持。
  • 可以增加对 Excel 样式的支持(如字体、颜色、单元格格式等)。

标签:++,Excel,excel,表头,headers,字段,导出,workbook
From: https://blog.csdn.net/weixin_57722696/article/details/143945763

相关文章

  • 通过月亮树跨境选品工具分析亚马逊类目,用EXCEL制作气泡图、散点图做数据分析
    背景新手在选品的时候,面临数据维度多、分析困难、工具昂贵且需学习的问题。能不能通过这样的图表快速了解类目以及产品概况?这个教程让你通过月亮树选品工具,配合Excel制作气泡图、散点图,捋清楚从类目分析到选品的数据分析流程。帮助新手快速、直观地分析类目及产品概况,提高......
  • EXCEL导入—设计与思考
    作者:京东物流叶方伟EXCEL导入—设计与思考一、案例信息与设计1.1、案例需求与背景B2BTC同城二期有一个Excel导入的功能,单次数据量小于一千,使用频次不高。但涉及到多个字段组成唯一约束,即每条数据操作时要根据唯一性组合字段来操作,要确保数据表中的数据不违反唯一性。每条数......
  • 使用眼精星票证识别系统将行驶证转为结构化Excel教程
    在现代办公环境中,高效处理各类文件和数据至关重要。对于行驶证等证件信息的提取和整理,眼精星票证识别系统提供了一个快速、准确的解决方案。以下是如何使用该系统将行驶证信息转化为结构化Excel文件的详细操作步骤。一、下载安装眼精星票证识别系统来百度APP畅享高清图片......
  • 使用python快速合并文件夹内excel数据
    数据分析的时候文件太多,一个一个合并效率太慢?有没有方便的方法快速合并他们本文作者使用jupyternotebook采用以下代码实现excel数据合并功能importpandasaspdimportos#设置文件夹路径folder_path='D:\\你自己的路径'#找到所有Excel文件excel_files=[file......
  • 影刀rpa的使用--数据写入excel表格
    从上一篇的取出数据续写的 对数据来源存疑的可以参考上一篇1、打开\新建excel选择建好的excel文件  取消可视化当然自动化创建也可以 但是这样更简单 方便理解2、写入内容至excel工作表这里习惯按行写入 各位按需要选择起始列名可以设置ABCDE……等写入方......
  • EasyExcel 非注解方式设置列宽行高的几种实现方式
    publicstatic<T>voidexportDownBoxExcel(StringfileName,StringsheetName,Class<T>t,StringtitleName,List<List<String>>headers,HttpServletResponseresponse,Map<Integer,List<String>>selectMap,List<T>dat......
  • QNAP QuMagie相册元数据导出,一键搞定!
    在某些情况下,例如硬盘故障,多媒体数据库损坏导致辛辛苦苦做了几天的人脸命名识别和相册都被重置了,迫切的需要将QuMagie中的元数据导出进行备份,随着新版本qumagie的更新,该功能也是支持了。本教程将详细介绍在QuMagie2.4.0及更高版本中如何进行文件的导入和导出操作。从QuM......
  • fastadmin-PHP-导出少量数据PhpOffice以及百万级别数据csv压缩
    在进行数据导出的时候,少量的数据可以使用phpexcel,但大量的数据用phpexcel就很消耗资源了。在使用fastadmin做数据导出的时候,相关的代码请参考:https://blog.csdn.net/bingyu709/article/details/141949034我自己这边因为数据量会很大,所以代码层做了一个数量的划分,少于50000走phpe......
  • Vue+ElementUI 导出为PDF文件
    在ElementUI中导出PDF通常涉及将页面上的DOM元素转换为PDF格式的文件。这一过程可以通过结合使用 html2canvas 和 jsPDF 这两个JavaScript库来实现。步骤:1、安装依赖在项目中安装html2canvas和jsPDF这两个库。可以通过npm进行安装:npminstallhtml2canvasjspdf2、创建......
  • labview使用报表工具从数据库导出数据
    之前写了一篇labview从数据库导出数据到excel电子表格,但是是基于调用excel的activeX控件,有时候会有一些bug,就比如我工作机就无法显示方法,后面大哥指点才知道没有的原因是excel安装不完整。像我的工作机就没有这个选项。就需要选择类。这里看系统里面组件服务下的DCOM配置,看是......