POI操作ExcelPOI操作Excel 内存一直增大直至溢出问题主要是针对写入内容操作.xlsx格式遇到问题:如果反复操作模板文件往工作表中写入数据会出现文件内存一直增大问题多次操作的话直至内存溢出。
(1)首先要配置myEclipse ------->run----->run Configurations----->Java Application ----对其下要用到的类进行配置---->Arguments在VM arguments 下写入-Xms512m -Xmx1048m -XX:PermSize=128m -XX:MaxPermSize=400m-Dcom.sun.management.jmxremote=true 点击apply 然后确定(2)这里根据能想到的方法进行了多次测试:<1>多次下载数据写入sheet1 每次写入数据之前清空sheet1中的所有行内容,之后再写入新数据即每次操作都是对sheet1的更新;能够清空内容但是内存大小还会一直增大初步认为是内容清空了行所占的占位符还在那表面是空了但是真实的大小还是存在,暂没有解决此问题示例代码/*for(int i = 0;;i++){XSSFRow row = sheet.getRow(i);if(row != null){sheet.removeRow(row);}else{break;}}*/<2>多次下载数据写入sheet1 每次写入前对工作区的工作表进行删除操作,删除sheet1 ,然后在新建sheet1,写入数据,确保每次数据都是最新暂没有解决此问题示例代码public void deleteSheet(String targetFile,String sheetName) {try {FileInputStream fis = new FileInputStream(targetFile);HSSFWorkbook wb = new HSSFWorkbook(fis);//删除Sheetwb.removeSheetAt(wb.getSheetIndex(sheetName));this.fileWrite(targetFile, wb);fis.close();} catch (Exception e) {e.printStackTrace();}}//新建public static void newSheet1(String filePath,String sheetName) throws Exception{ try {System.out.println("然后走的这里新建sheet1+++++++++++++++++++++++++++++");FileInputStream fis = new FileInputStream(filePath);XSSFWorkbook workbook2003 = new XSSFWorkbook(fis);//newSheetworkbook2003.createSheet(sheetName);fileWrite(filePath,workbook2003);fis.close();} catch (Exception e) {e.printStackTrace();}}<3> 考虑到是内容格式问题,通过代码设置了行高大小,行高起到了作用,内存增大问题没有解决示例代码public static void newSheet1Hig(String filePath) throws Exception{try {System.out.println("最后走的这里新设置sheet1的行高+++++++++++++++++++++++++++++");FileInputStream fis = new FileInputStream(filePath);XSSFWorkbook workbook2003 = new XSSFWorkbook(fis);XSSFSheet sheet = workbook2003.getSheet("Sheet1");int num=workbook2003.getSheet("Sheet1").getLastRowNum();System.out.println("行的值***********"+num);int hight=15*20;for (int i = 0; i < num; i++) {//System.out.println("行========================="+i);//System.out.println(sheet.getRow(i).getCell(0)+"\t"+sheet.getRow(i).getCell(1));sheet.getRow(i).setHeight((short)hight);}fileWrite(filePath,workbook2003);fis.close();} catch (Exception e) {e.printStackTrace();}}关闭流操作代码示例public static void fileWrite(String filePath,XSSFWorkbook wb) throws Exception{ FileOutputStream fileOut = new FileOutputStream(filePath);wb.write(fileOut);fileOut.flush();fileOut.close();}以上三种测试方法都是考虑到了流机制对数据的写入操作考虑到下载内容大小的问题其中拿多内容地址下载和少内容地址下载数据进行比较测试次数:循环100次(1)大内容:比如天猫网站上左旋肉碱的列表页数据 (60产品信息)反复测试内存一直增大增大幅度在没执行一次内存扩大约10k 直至几兆……(2)小内容:比如天猫网站上左旋肉碱的单个产品详情页反复测试内存大小变化基本可控前后10k左右变化基本不增长其中遇见这样一问题下载好数据后整个程序流程走完打开表格如果第一次去随意操作更改行高值或者其他小更改之后保存操作现在去看文件大小会发现现在的值会变成文件真实的大小比如说200k的文件反复执行后变成了2兆那么按这个操作后又变成了200k左右只是程序没能控制需要手动去操作模板文件像(2)小内容本身文件小的话第一次生成的数据可能会比真实模板文件要小如果再按那种方式去手动改变下表格中的值后保存会恢复真实的大小如:真实的文件180k 程序执行后变成160k左右经手动操作恢复真实大小180k左右像这两类情况如果用程序操作工作表格式没有生效手动去操作excel 文件的话反而恢复到了真实的文件大小考虑是格式问题有可能跟excel自身有关系以下内容是说Excel 自身问题第五点需注意EXCEL运行缓慢很多人在实际使用EXCEL过程中发生EXCEL文件不明原因的增大,打开计算都很缓慢的现象,有时甚至造成文件损坏,无法打开的情况,以下是我收集的造成文件虚增的原因及处理办法,对没有提到的其他情况和解决办法,欢迎大家给予补充:一、工作表中有大量的细小图片对象造成文件增大,这是最常见的文件虚胖原因。
可能的原因:(1)从网页上复制内容直接粘帖到工作表中,而没有使用选择性粘帖,(2)无意中点了绘图工具栏的直线或其他绘图对象,不知不觉中在文件中插入了小的直线或其他图形,由于很小,肉眼几乎无法看到,又通过单元格的复制产生了大量的小绘图对象(3)在工作表中插入了图片其他绘图对象,操作中又将其高度宽度设为0或很小的值,通过复制产生了大量的对象(4)在行或列的位置中插入了绘图对象,对象的属性为,大小位置随单元而变的(默认的),然后隐藏行或列,或设置行高或列宽为很小的值,从而使插入的对象不能看到(5)工作表中的对象设置了不可见属性(Visible=false)或对象的线条和填充色均设为与底色相同,使对象无法看到判断方法:(1)CTRL-G,定位,定位条件中选“对象”,确定后会显示很多被选择的小对象(这种方法在隐藏列或行中的对象并不能看到)(2)用VBA对对象进行计数,看看有多少个对象在工作表中,与你的工作表中需要的对象数量是否相符Sub countshapes() Dim n n = ActiveSheet.Shapes.Count MsgBox "本工作表共有" & n & "个对象" End Sub解决办法(1)如果确认工作表中没有你需要的对象或控件,用CTRL-G,定位,定位条件中选“对象”,确定后按DEL键删除,会删除工作表中所有的对象(2)用VBA删除,可以根据需要删除高度或宽度小于一定值的小对象,如Sub delshapes() Dim sp As Shape, n For Each sp In ActiveSheet.Shapes If sp.Width < 14.25 Or sp.Height < 14.25 Then '约小于0.5cm,根据需要设定 sp.Delete n = n + 1 End If Next sp MsgBox "共删除了" & n & "个对象" End Sub二、工作表中在很大的范围内设置了单元格的格式或者条件格式可能的原因:操作时选择在很大的区域设置或复制了单元格的格式或条件格式(并不是整行整列),而真正用的区域并不很多,造成工作表内容不多,文件却很大。
判断方法:工作表滚协条的拖动滑标很小,拖动滑标向下可以达到很大的行号或列标,滑标拖到最下或最右的位置显示的列标或行号就是实际设置了单元格格式的地址解决办法: 1、定位真正需要的行号下一行,按CTRL+SHIFT+下箭头,选择所有的多余行(也可以在名称框中输入行号如:2000:65536),编辑-清除-格式(或全部),同理清除可清除多余列的格式 2、如果需要在一行或一列的很大范围设置统一的单元格格式,可以选择整行或整列设置单元格格式,而不要只选择行列的一部分单独设置格式,再根据需要对行列的个别单元格设置单独的格式,对整行或整列甚至整个工作表设置单元格格式并不会造成文件虚增的问题,对A1:A65536设置单元格格式与对A1:A65535设置单元格格式文件太小是完全不同的 3、如果欲对已设置的不同格式的单元格设置整列或整行统一的格式,应选整行或整列,先清除单元格的格式或将单元格格式设为常规,再对整行或整列设置其他的单元格格式,直接设置有时可能并不能使文件减肥 4、对条件格式也可用编辑-定位,定位条件中选“条件格式”,然后在格式-条件格式中删除条件格式三、为很大的区域设置了数据有效性形成原因:与第二项基本相同,选择很大的区域设置了数据有效性,或将有有效性设置的单元格复制到很大的区域,尤其是在有效性设置中进行了“输入法”“输入信息”“出错警告”的设置,更具有隐蔽性,一般不易发现。