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

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

mac中资源库在哪? macOS资源库文件夹详解

《mac中资源库在哪?macOS资源库文件夹详解》经常使用Mac电脑的用户会发现,找不到Mac电脑的资源库,我们怎么打开资源库并使用呢?下面我们就来看看macOS资源库文件夹详解... 在 MACOS 系统中,「资源库」文件夹是用来存放操作系统和 App 设置的核心位置。虽然平时我们很少直接跟它打交道,但了

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python如何使用seleniumwire接管Chrome查看控制台中参数

《Python如何使用seleniumwire接管Chrome查看控制台中参数》文章介绍了如何使用Python的seleniumwire库来接管Chrome浏览器,并通过控制台查看接口参数,本文给大家... 1、cmd打开控制台,启动谷歌并制定端口号,找不到文件的加环境变量chrome.exe --rem

Debian如何查看系统版本? 7种轻松查看Debian版本信息的实用方法

《Debian如何查看系统版本?7种轻松查看Debian版本信息的实用方法》Debian是一个广泛使用的Linux发行版,用户有时需要查看其版本信息以进行系统管理、故障排除或兼容性检查,在Debia... 作为最受欢迎的 linux 发行版之一,Debian 的版本信息在日常使用和系统维护中起着至关重要的作

macOS怎么轻松更换App图标? Mac电脑图标更换指南

《macOS怎么轻松更换App图标?Mac电脑图标更换指南》想要给你的Mac电脑按照自己的喜好来更换App图标?其实非常简单,只需要两步就能搞定,下面我来详细讲解一下... 虽然 MACOS 的个性化定制选项已经「缩水」,不如早期版本那么丰富,www.chinasem.cn但我们仍然可以按照自己的喜好来更换

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

mac安装redis全过程

《mac安装redis全过程》文章内容主要介绍了如何从官网下载指定版本的Redis,以及如何在自定义目录下安装和启动Redis,还提到了如何修改Redis的密码和配置文件,以及使用RedisInsig... 目录MAC安装Redis安装启动redis 配置redis 常用命令总结mac安装redis官网下

Java汇编源码如何查看环境搭建

《Java汇编源码如何查看环境搭建》:本文主要介绍如何在IntelliJIDEA开发环境中搭建字节码和汇编环境,以便更好地进行代码调优和JVM学习,首先,介绍了如何配置IntelliJIDEA以方... 目录一、简介二、在IDEA开发环境中搭建汇编环境2.1 在IDEA中搭建字节码查看环境2.1.1 搭建步