java自定义填充excel并导出的方法代码实例

 更新时间:2024年12月23日 09:14:30   作者:奔波霸的伶俐虫  
这篇文章主要给大家介绍了关于java自定义填充excel并导出的相关资料,使用Java在Spring框架中实现一个接口,该接口可以将JSON数据导出为Excel文件,文章涵盖了从加载Excel模板、创建单元格样式到填充数据并返回响应的整个过程,需要的朋友可以参考下

首先在resources下面放一个excel模板

1. 方法签名和请求映射

@RequestMapping(value = "/ExportXls") public ResponseEntity<byte[]> rwzcExportXls(HttpServletRequest request, @RequestBody JSONArray jsonArray) throws IOException {
  • @RequestMapping(value = "/rwzcExportXls"):这个注解指定了HTTP请求的路径,当收到对/rwzcExportXls的请求时,调用rwzcExportXls方法。
  • ResponseEntity<byte[]>:该方法返回一个包含字节数组的响应实体,通常用于文件下载。
  • HttpServletRequest:用于获取请求信息。
  • @RequestBody JSONArray jsonArray:请求体中的JSON数组,将被解析为JSONArray对象。

2. 加载Excel模板

InputStream inputStream = getClass().getClassLoader().getResourceAsStream("templates\\yhb.xlsx"); 
if (inputStream == null) { throw new IOException("Template file not found"); } 
Workbook workbook = new XSSFWorkbook(inputStream); 
Sheet sheet = workbook.getSheetAt(0);
  • 使用ClassLoader加载名为yhzcb.xlsx的Excel模板文件。
  • 如果文件未找到,则抛出IOException
  • 创建一个Workbook对象(使用XSSFWorkbook,表示Excel 2007及以上版本),并获取第一个工作表。
  • 也可以这样加载模板
Resource resource =  new ClassPathResource(TEMPLATE_FILE_PATH);
        try (
                InputStream templateInputStream = resource.getInputStream();
                Workbook workbook = new XSSFWorkbook(templateInputStream);
 OutputStream os = response.getOutputStream();

        )

3. 创建单元格样式

CellStyle centerAlignStyle = workbook.createCellStyle(); 
centerAlignStyle.setAlignment(HorizontalAlignment.CENTER); 
centerAlignStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  • 创建居中对齐的单元格样式,设置水平和垂直对齐方式。
CellStyle borderStyle = workbook.createCellStyle(); 
borderStyle.cloneStyleFrom(centerAlignStyle); 
borderStyle.setBorderBottom(BorderStyle.THIN); 
borderStyle.setBorderTop(BorderStyle.THIN); 
borderStyle.setBorderLeft(BorderStyle.THIN); 
borderStyle.setBorderRight(BorderStyle.THIN);
  • 创建一个边框样式,首先复制居中样式,然后设置四个边框为细线。

4. 填充数据

int rowIndex = 4; 
for (int i = 0; i < jsonArray.size(); i++) 
{ com.alibaba.fastjson.JSONObject jsonObject = jsonArray.getJSONObject(i);
 String shipDistrict = (String) jsonObject.get("shiprict"); // ... (获取其他字段) 
Row row = sheet.createRow(rowIndex++); 
row.setHeightInPoints(34.9f); // 设置行高 
createCellWithStyle(row, 1, "", borderStyle); // ... (创建并填充其他单元格) }
  • 从第4行开始填充数据(假设前面有标题行)。
  • 循环遍历jsonArray,从每个JSONObject中提取字段,并在工作表中创建相应的行和单元格。
  • 使用辅助方法createCellWithStyle创建并设置单元格的值和样式。

5. 写入输出流并返回响应

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
workbook.write(outputStream); workbook.close();
  • 将工作簿写入ByteArrayOutputStream,然后关闭工作簿。
HttpHeaders headers = new HttpHeaders(); 
headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=da.xlsx"); 
return ResponseEntity.ok()
.headers(headers)
.contentType(MediaType.APPLICATION_OCTET_STREAM)
.body(outputStream.toByteArray());
  • 设置响应头,指示这是一个附件,并指定文件名为data.xlsx
  • 返回ResponseEntity,内容类型为application/octet-stream,并包含生成的Excel文件的字节数组。
  • 这可能会有异常提示

将 contentType里面改成下面即可

// 返回Excel文件
        return ResponseEntity.ok()
                .headers(headers)
                .contentType(MediaType.valueOf("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
                .body(outputStream.toByteArray());

6. 辅助方法

// 辅助方法:创建单元格并应用样式
    private void createCellWithStyle(Row row, int columnIndex, String value, CellStyle style) {
        Cell cell = row.createCell(columnIndex);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }
  • 该方法简化了单元格的创建过程,自动设置单元格的值和样式。

完整代码如下

@RequestMapping(value = "/ExportXls")
    public ResponseEntity<byte[]> rwzcExportXls(HttpServletRequest request,@RequestBody JSONArray jsonArray) throws IOException {
        // 读取模板
        // 使用ClassLoader加载模板
        InputStream inputStream = getClass().getClassLoader().getResourceAsStream("templates/excel/yb.xlsx");
        if (inputStream == null) {
            throw new IOException("Template file not found" );
        }
        Workbook workbook = new XSSFWorkbook(inputStream);
        Sheet sheet = workbook.getSheetAt(0); // 假设数据填充在第一个Sheet
        // 创建居中对齐的单元格样式
        CellStyle centerAlignStyle = workbook.createCellStyle();
        centerAlignStyle.setAlignment(HorizontalAlignment.CENTER);
        centerAlignStyle.setVerticalAlignment(VerticalAlignment.CENTER);

        // 创建边框样式
        CellStyle borderStyle = workbook.createCellStyle();
        borderStyle.cloneStyleFrom(centerAlignStyle); // 复制之前的居中样式
        borderStyle.setBorderBottom(BorderStyle.THIN);
        borderStyle.setBorderTop(BorderStyle.THIN);
        borderStyle.setBorderLeft(BorderStyle.THIN);
        borderStyle.setBorderRight(BorderStyle.THIN);

        // 从第4行开始填充数据(第一行是标题)
        int rowIndex = 4;
        for (int i = 0; i < jsonArray.size(); i++) {
            com.alibaba.fastjson.JSONObject jsonObject = jsonArray.getJSONObject(i);
            String shipDistrict = (String) jsonObject.get("shipDistrict");
            shipDistrict = shipDistrict.substring(0, 2)+"0000";
            SysDistrict district = sysDistrictService.getById(shipDistrict);
            String owname = (String) jsonObject.get("owneame");
            ***********************
            String shio = (String) jsonObject.get("shiNo");

            Row row = sheet.createRow(rowIndex++);
            row.setHeightInPoints(34.9f); // 设置行高为34.9磅
            createCellWithStyle(row, 1, "", borderStyle);
            createCellWithStyle(row, 2, "通信类", borderStyle);
            ********************************
            createCellWithStyle(row, 15, "", borderStyle);
            createCellWithStyle(row, 16, "", borderStyle);
            createCellWithStyle(row, 17, "", borderStyle);
            createCellWithStyle(row, 18, shiame, borderStyle);
            createCellWithStyle(row, 19, shNo, borderStyle);
            // 根据需要继续填充其他字段
        }
        // 写入到新的Excel文件
        //FileOutputStream fos = new FileOutputStream("D:\\opt");
        //workbook.write(fos);
         关闭流
        //fos.close();
        //workbook.close();
        //
        // 将工作簿写入输出流
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        workbook.write(outputStream);
        workbook.close();

        // 设置响应头
        HttpHeaders headers = new HttpHeaders();
        headers.add(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=da.xlsx");

        // 返回Excel文件
        return ResponseEntity.ok()
                .headers(headers)
                .contentType(MediaType.valueOf("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"))
                .body(outputStream.toByteArray());
    }


    // 辅助方法:创建单元格并应用样式
    private void createCellWithStyle(Row row, int columnIndex, String value, CellStyle style) {
        Cell cell = row.createCell(columnIndex);
        cell.setCellValue(value);
        cell.setCellStyle(style);
    }

总结 

到此这篇关于java自定义填充excel并导出的文章就介绍到这了,更多相关java自定义填充excel并导出内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot深入分析讲解监听器模式上

    SpringBoot深入分析讲解监听器模式上

    监听器模式,大家应该并不陌生,主要的组成要素包括了事件、监听器以及广播器;当事件发生时,广播器负责将事件传递给所有已知的监听器,而监听器会对自己感兴趣的事件进行处理
    2022-07-07
  • HandlerMapping之RequestMappingHandlerMapping作用详解

    HandlerMapping之RequestMappingHandlerMapping作用详解

    这篇文章主要介绍了HandlerMapping之RequestMappingHandlerMapping作用详解,HandlerMapping是用来寻找Handler的,并不与Handler的类型或者实现绑定,而是根据需要定义的,那么为什么要单独给@RequestMapping实现一个HandlerMapping,需要的朋友可以参考下
    2023-10-10
  • Java优化重复冗余代码的8种方式总结

    Java优化重复冗余代码的8种方式总结

    日常开发中,我们经常会遇到一些重复代码,最近小编优化了一些系统中的重复代码,用了好几种的方式,感觉挺有用的,所以本文给大家讲讲优化重复代码的几种方式
    2023-08-08
  • 关于Java中常见的负载均衡算法

    关于Java中常见的负载均衡算法

    这篇文章主要介绍了关于Java中常见的负载均衡算法,负载平衡是一种电子计算机技术,用来在多个计算机、网络连接、CPU、磁盘驱动器或其他资源中分配负载,以达到优化资源使用、最大化吞吐率、最小化响应时间、同时避免过载的目的,需要的朋友可以参考下
    2023-08-08
  • Spring Cloud Gateway层限流实现过程

    Spring Cloud Gateway层限流实现过程

    这篇文章主要介绍了Spring Cloud Gateway层限流实现过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-08-08
  • SpringBoot中@EnableAsync和@Async注解的使用小结

    SpringBoot中@EnableAsync和@Async注解的使用小结

    在SpringBoot中,可以通过@EnableAsync注解来启动异步方法调用的支持,通过@Async注解来标识异步方法,让方法能够在异步线程中执行,本文就来介绍一下,感兴趣的可以了解一下
    2023-11-11
  • java Spring AOP详解及简单实例

    java Spring AOP详解及简单实例

    这篇文章主要介绍了java Spring AOP详解及简单实例的相关资料,需要的朋友可以参考下
    2017-05-05
  • idea2019配置Tomcat9全过程

    idea2019配置Tomcat9全过程

    这篇文章主要介绍了idea2019配置Tomcat9全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-11-11
  • Spring使用注解方式处理事务

    Spring使用注解方式处理事务

    这篇文章主要为大家详细介绍了Spring使用注解方式处理事务,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2022-08-08
  • SpringBoot项目启动后再请求远程接口的解决方式

    SpringBoot项目启动后再请求远程接口的解决方式

    Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化Spring应用的创建、运行、调试、部署等,这篇文章主要介绍了SpringBoot项目启动后再请求远程接口的实现方式 ,需要的朋友可以参考下
    2023-02-02

最新评论