POI SXSSFWorkbook mac下查看清理poifiles生成的临时文件

2023-10-09 20:20

本文主要是介绍POI SXSSFWorkbook mac下查看清理poifiles生成的临时文件,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

POI SXSSFWorkbook mac下查看poifiles生成的临时文件

  • 问题描述:
  • 解决方案:

问题描述:

在使用SXSSFWorkbook作为excel导出方法使用时(poi-ooxml-3.14.jar),当导出的文件过大(这里使用了100万条测试数据,生成的excel文件大小为29.8M,临时xml文件为622M),这个时候xml文件不会自动删除,导致占用了磁盘空间,在生产环境时,当临时文件夹满了之后就无法正常导出。


解决方案:

1、通过代码手动删除poi生成的临时xml文件
public static void deleteSXSSFTempFiles(SXSSFWorkbook workbook)throws NoSuchFieldException, IllegalAccessException {int numberOfSheets = workbook.getNumberOfSheets();// iterate through all sheets (each sheet as a temp file)for (int i = 0; i < numberOfSheets; i++) {Sheet sheetAt = workbook.getSheetAt(i);// delete only if the sheet is written by streaif (sheetAt instanceof SXSSFSheet) {SheetDataWriter sdw = (SheetDataWriter) getPrivateAttribute(sheetAt, "_writer");File f = (File) getPrivateAttribute(sdw, "_fd");try {f.delete();} catch (Exception ex) {// could not delete the fileex.printStackTrace();}}}}public static Object getPrivateAttribute(Object containingClass,String fieldToGet) throws NoSuchFieldException,IllegalAccessException {// get the field of the containingClass instanceField declaredField = containingClass.getClass().getDeclaredField(fieldToGet);// set it as accessibledeclaredField.setAccessible(true);// access itObject get = declaredField.get(containingClass);// return it!return get;}

2、输出 java.io.tmpdir 找到mac临时文件夹

public static boolean writeExcel_xlsx(String[] title,List<Object[]> dataList, OutputStream os){boolean b = true;int exportSize = 1048576;SXSSFWorkbook workbook = null;try{if (dataList != null && dataList.size() > exportSize){throw new Exception("导出数据大于导出限制数量:" + exportSize);}// 声明一个Excel工作薄workbook = new SXSSFWorkbook();SXSSFSheet sheet = workbook.createSheet();int columnIndex = 0;int rowIndex = 0;SXSSFRow row = null;// 设置表头row = sheet.createRow(rowIndex);// Excel头部样式CellStyle cellStyleHead = workbook.createCellStyle();cellStyleHead.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);cellStyleHead.setFillForegroundColor(IndexedColors.SKY_BLUE.getIndex());cellStyleHead.setBorderTop(HSSFCellStyle.SOLID_FOREGROUND);cellStyleHead.setBorderLeft(HSSFCellStyle.SOLID_FOREGROUND);cellStyleHead.setBorderRight(HSSFCellStyle.SOLID_FOREGROUND);cellStyleHead.setBorderBottom(HSSFCellStyle.SOLID_FOREGROUND);Font fontHead = workbook.createFont();fontHead.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 加粗fontHead.setFontHeightInPoints((short) 9);// 9号字体fontHead.setFontName("宋体");// 宋体cellStyleHead.setFont(fontHead);// 使用模板创建Excel表头for (String str:title){SXSSFCell cell = row.createCell(columnIndex);XSSFRichTextString richText = new XSSFRichTextString(str);cell.setCellValue(richText);// 指定头部样式cell.setCellStyle(cellStyleHead);columnIndex++;}// 数据单元格样式CellStyle bodyStyle = workbook.createCellStyle();// 边框bodyStyle.setBorderTop(HSSFCellStyle.SOLID_FOREGROUND);bodyStyle.setBorderLeft(HSSFCellStyle.SOLID_FOREGROUND);bodyStyle.setBorderRight(HSSFCellStyle.SOLID_FOREGROUND);bodyStyle.setBorderBottom(HSSFCellStyle.SOLID_FOREGROUND);// 宋体9号Font font = workbook.createFont();font.setFontHeightInPoints((short) 9);font.setFontName("宋体");bodyStyle.setFont(font);// 填充数据for (Object[] obj: dataList){rowIndex++;// 数据行从第二行开始,索引下标1row = sheet.createRow(rowIndex);for(int i =0;i<obj.length;i++){// 全部以文体的方式导出SXSSFCell cell = row.createCell(i);cell.setCellType(HSSFCell.CELL_TYPE_STRING);if(!StringUtils.isNull(obj[i])){cell.setCellValue(obj[i].toString());                        //设置单元格的值}// 指定数据体样式cell.setCellStyle(bodyStyle);sheet.setColumnWidth(i, 4000);}}System.out.println(System.getProperty("java.io.tmpdir"));// 导出excelworkbook.write(os);ExcelUtils.deleteSXSSFTempFiles(workbook);}catch (Exception e){e.printStackTrace();b = false;}finally{if (os != null){try{workbook.close();os.close();}catch (IOException e){e.printStackTrace();}}}return b;}

结果:
临时文件夹打印地址:/var/folders/55/cqv2kjns0b9cx62y3b5p91340000gn/T/
我们进入到mac的临时文件夹,找到poifiles文件夹,导出结束后poi生产的临时xml文件被成功清理,如果不调用 ExcelUtils.deleteSXSSFTempFiles(workbook);,会产生600M的临时文件不会被立即清理。

在这里插入图片描述

这篇关于POI SXSSFWorkbook mac下查看清理poifiles生成的临时文件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/175330

相关文章

Windows的CMD窗口如何查看并杀死nginx进程

《Windows的CMD窗口如何查看并杀死nginx进程》:本文主要介绍Windows的CMD窗口如何查看并杀死nginx进程问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录Windows的CMD窗口查看并杀死nginx进程开启nginx查看nginx进程停止nginx服务

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

python如何生成指定文件大小

《python如何生成指定文件大小》:本文主要介绍python如何生成指定文件大小的实现方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python生成指定文件大小方法一(速度最快)方法二(中等速度)方法三(生成可读文本文件–较慢)方法四(使用内存映射高效生成

如何确定哪些软件是Mac系统自带的? Mac系统内置应用查看技巧

《如何确定哪些软件是Mac系统自带的?Mac系统内置应用查看技巧》如何确定哪些软件是Mac系统自带的?mac系统中有很多自带的应用,想要看看哪些是系统自带,该怎么查看呢?下面我们就来看看Mac系统内... 在MAC电脑上,可以使用以下方法来确定哪些软件是系统自带的:1.应用程序文件夹打开应用程序文件夹

使用Python实现Windows系统垃圾清理

《使用Python实现Windows系统垃圾清理》Windows自带的磁盘清理工具功能有限,无法深度清理各类垃圾文件,所以本文为大家介绍了如何使用Python+PyQt5开发一个Windows系统垃圾... 目录一、开发背景与工具概述1.1 为什么需要专业清理工具1.2 工具设计理念二、工具核心功能解析2.

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

Nacos日志与Raft的数据清理指南

《Nacos日志与Raft的数据清理指南》随着运行时间的增长,Nacos的日志文件(logs/)和Raft持久化数据(data/protocol/raft/)可能会占用大量磁盘空间,影响系统稳定性,本... 目录引言1. Nacos 日志文件(logs/ 目录)清理1.1 日志文件的作用1.2 是否可以删除

Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法

《Linux查看系统盘和SSD盘的容量、型号及挂载信息的方法》在Linux系统中,管理磁盘设备和分区是日常运维工作的重要部分,而lsblk命令是一个强大的工具,它用于列出系统中的块设备(blockde... 目录1. 查看所有磁盘的物理信息方法 1:使用 lsblk(推荐)方法 2:使用 fdisk -l(

MySQL查看表的最后一个ID的常见方法

《MySQL查看表的最后一个ID的常见方法》在使用MySQL数据库时,我们经常会遇到需要查看表中最后一个id值的场景,无论是为了调试、数据分析还是其他用途,了解如何快速获取最后一个id都是非常实用的技... 目录背景介绍方法一:使用MAX()函数示例代码解释适用场景方法二:按id降序排序并取第一条示例代码解

Mac备忘录怎么导出/备份和云同步? Mac备忘录使用技巧

《Mac备忘录怎么导出/备份和云同步?Mac备忘录使用技巧》备忘录作为iOS里简单而又不可或缺的一个系统应用,上手容易,可以满足我们日常生活中各种记录的需求,今天我们就来看看Mac备忘录的导出、... 「备忘录」是 MAC 上的一款常用应用,它可以帮助我们捕捉灵感、记录待办事项或保存重要信息。为了便于在不同