java 自定义填充excel并导出

news/2024/10/12 21:05:00/

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

1. 方法签名和请求映射

java">@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模板

java">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及以上版本),并获取第一个工作表。
  • 也可以这样加载模板
java">Resource resource =  new ClassPathResource(TEMPLATE_FILE_PATH);try (InputStream templateInputStream = resource.getInputStream();Workbook workbook = new XSSFWorkbook(templateInputStream);OutputStream os = response.getOutputStream();)

3. 创建单元格样式

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

4. 填充数据

java">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. 写入输出流并返回响应

java">ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
workbook.write(outputStream); workbook.close();
  • 将工作簿写入ByteArrayOutputStream,然后关闭工作簿。
java">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里面改成下面即可

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

6. 辅助方法

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

完整代码如下

 

java">@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);}

以上仅供学习参考!!!


http://www.ppmy.cn/news/1538025.html

相关文章

智汇云舟亮相WAFI世界农业科技创新大会,并参编数字农业产业图谱

10月10日&#xff0c;2024WAFI世界农业科技创新大会农食行业创新与投资峰会在北京金海湖国际会展中心举行。中国农业大学MBA教育中心主任、教授付文阁、平谷区委常委、统战部部长刘堃、华为公共事业军团数字政府首席专家刘丹、荷兰瓦赫宁根大学前校长Aalt Dijkhuizen、牧原食品…

OpenCV-风格迁移

文章目录 一、原理二、关键步骤三、实现方法四、可选参数五、示例代码六、总结 OpenCV中的风格迁移是一种计算机视觉技术&#xff0c;它允许用户将一种图像的风格转移到另一幅图像上&#xff0c;从而创造出具有独特美学效果的新图像。这种技术在艺术、设计和娱乐等领域有着广泛…

以证候本体数据库量化病-证-方关联度

本报讯&#xff08;记者张梦雪&#xff09;日前&#xff0c;国际权威期刊《科学通报》刊登了中国中医科学院中药研究所与北京交通大学医学智能研究所科研团队联合研究成果《面向精准医学的中医证侯本体及“病-证-方”网络关联定量计算平台》&#xff0c;该平台包括国际首个证侯…

【瑞昱RTL8763E】音频

1 音乐播放控制 1.1 播放列表更新 文件系统在sd卡中保存header.bin及name.bin两份文件用于歌曲名称的存储。为方便应用层进行歌曲显示及列表管理&#xff0c;可将这两个bin文件信息读取并保存到nor flash中。需要播放指定名称的歌曲时&#xff0c;将对于歌曲名称传递给文件系…

在 MariaDB 中创建一个新的数据库实例

1. 登录 MariaDB 首先&#xff0c;使用 mysql 命令登录到 MariaDB&#xff1a; sudo mysql -u root -p 系统会提示你输入 MariaDB root 用户的密码。输入密码后&#xff0c;你将进入 MariaDB 命令行界面。 2. 创建数据库 在 MariaDB 命令行界面中&#xff0c;运行以下命令来…

【包教包会】2D图片实现3D透视效果(支持3.x、支持原生、可合批)

将去年写的SpriteFlipper从2.x升级到3.x。 如果需要2.x版本或需要了解算法思路&#xff0c;请移步&#xff1a;https://blog.csdn.net/weixin_42714632/article/details/136745051 优化功能&#xff1a;可同时绕X轴和Y轴旋转&#xff0c;两者效果会叠加。 完美适配Web、原生…

英特尔新旗舰 CPU 将运行更凉爽、更高效,适合 PC 游戏

英特尔终于解决了台式机 CPU 发热和耗电的问题。英特尔的新旗舰 Core Ultra 200S 系列处理器将于 10 月 24 日上市&#xff0c;该系列专注于每瓦性能&#xff0c;比之前的第 14 代芯片运行更凉爽、更高效。这些代号为 Arrow Lake S 的处理器也是英特尔首款内置 NPU&#xff08;…

C++题 十进制转二进制

文章目录 1. 使用C20 std::format2. 使用 std::bitset 类3. 手动实现十进制到二进制的转换反过来&#xff0c;手动二进制到十进制 VisualStudio2022使用C&#xff0c;进行十进制到二进制的转换&#xff0c;常见的实现方式 1. 使用C20 std::format 需要将VisualStudio默认的标准…