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

相关文章

Java编译生成多个.class文件的原理和作用

《Java编译生成多个.class文件的原理和作用》作为一名经验丰富的开发者,在Java项目中执行编译后,可能会发现一个.java源文件有时会产生多个.class文件,从技术实现层面详细剖析这一现象... 目录一、内部类机制与.class文件生成成员内部类(常规内部类)局部内部类(方法内部类)匿名内部类二、

使用Jackson进行JSON生成与解析的新手指南

《使用Jackson进行JSON生成与解析的新手指南》这篇文章主要为大家详细介绍了如何使用Jackson进行JSON生成与解析处理,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录1. 核心依赖2. 基础用法2.1 对象转 jsON(序列化)2.2 JSON 转对象(反序列化)3.

java中使用POI生成Excel并导出过程

《java中使用POI生成Excel并导出过程》:本文主要介绍java中使用POI生成Excel并导出过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录需求说明及实现方式需求完成通用代码版本1版本2结果展示type参数为atype参数为b总结注:本文章中代码均为

在java中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

mysql如何查看当前连接数

《mysql如何查看当前连接数》:本文主要介绍mysql如何查看当前连接数问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql查看当前连接数查看mysql数据库允许最大连接数总结mysql查看当前连接数查看当前连接数SHOW STATUS LIKE

Java利用poi实现word表格转excel

《Java利用poi实现word表格转excel》这篇文章主要为大家详细介绍了Java如何利用poi实现word表格转excel,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 一、每行对象类需要针对不同的表格进行对应的创建。package org.example.wordToEx

查看Oracle数据库中UNDO表空间的使用情况(最新推荐)

《查看Oracle数据库中UNDO表空间的使用情况(最新推荐)》Oracle数据库中查看UNDO表空间使用情况的4种方法:DBA_TABLESPACES和DBA_DATA_FILES提供基本信息,V$... 目录1. 通过 DBjavascriptA_TABLESPACES 和 DBA_DATA_FILES

Python如何查看数据的类型

《Python如何查看数据的类型》:本文主要介绍Python如何查看数据的类型方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录python查看数据的类型1. 使用 type()2. 使用 isinstance()3. 检查对象的 __class__ 属性4.

Python解析器安装指南分享(Mac/Windows/Linux)

《Python解析器安装指南分享(Mac/Windows/Linux)》:本文主要介绍Python解析器安装指南(Mac/Windows/Linux),具有很好的参考价值,希望对大家有所帮助,如有... 目NMNkN录1js. 安装包下载1.1 python 下载官网2.核心安装方式3. MACOS 系统安

C/C++随机数生成的五种方法

《C/C++随机数生成的五种方法》C++作为一种古老的编程语言,其随机数生成的方法已经经历了多次的变革,早期的C++版本使用的是rand()函数和RAND_MAX常量,这种方法虽然简单,但并不总是提供... 目录C/C++ 随机数生成方法1. 使用 rand() 和 srand()2. 使用 <random