POI操作excel内存一直增大解决方法

合集下载

EXCEL数据过大后几种提速的办法

EXCEL数据过大后几种提速的办法

EXCEL数据过大后几种提速的办法,我试过可以解决一部分问题!现和大家分享一下.一个工作簿中,并没有多少数据,但文件却很大,运行速度较慢,有时几近无法忍受的地步。

针对这个问题,陆续也有不少朋友参与过讨论,也提出过一些解决方法,但还不完整。

现在我将比较完整地分析Excel工作簿体积膨胀的原因,以及常用的几种方法。

(建议读完全文,同时,强烈建议在按照本文所提到的一些方法进行操作之前要保留文件的备份)第一部分:如何给Excel工作簿减肥除了工作簿本身有宏病毒(关于如何识别宏病毒,本文的结束处有说明)外,有下列的几个原因可能导致工作簿异常膨胀一。

工作表中的格式过于复杂(如多种字体,多种颜色,条件格式等等)我们都知道,一个工作表有65536*256个单元格,这个非常大的一个范围。

我们在应用一些格式设置时,往往为了方便,直接在整行,或整列,或者在多行和多列中应用,这样其实是不妥当的。

我相信很少有人会用满整列,或者整行。

大量的没有用到的单元格被加上了一些格式后,Excel并不总是知道这个单元格是不需要用的,而往往在计算时会包括这些单元格。

另外,格式的多样性(包括字体,颜色等),势必是要造成Excel文件体积变大,这是不难理解的。

用尽量少的格式样式,如字体和颜色,毕竟Excel的优势不是在于文书,版面的展示(那是Word,PowerPoint等的强项)删除“空白”的单元格。

找到工作表中最右下角的单元格(请注意:除非你有自信,请不要过分依赖Excel 的"定位"=>"最后一个单元格"所给你的结果),我是说你可以手工找到这个单元格。

然后选中这个单元格右边所有的列,然后执行菜单命令:"编辑"=〉"清除"=〉"全部",接下来,选中这个单元格下面所有的行,同样执行菜单命令:"编辑"=〉"清除"=〉"全部",然后保存二。

EXCEL数据过大后几种提速的办法

EXCEL数据过大后几种提速的办法

EXCEL数据过大后几种提速的办法,我试过可以解决一部分问题!现和大家分享一下.一个工作簿中,并没有多少数据,但文件却很大,运行速度较慢,有时几近无法忍受的地步。

针对这个问题,陆续也有不少朋友参与过讨论,也提出过一些解决方法,但还不完整。

现在我将比较完整地分析Excel工作簿体积膨胀的原因,以及常用的几种方法。

(建议读完全文,同时,强烈建议在按照本文所提到的一些方法进行操作之前要保留文件的备份)第一部分:如何给Excel工作簿减肥除了工作簿本身有宏病毒(关于如何识别宏病毒,本文的结束处有说明)外,有下列的几个原因可能导致工作簿异常膨胀一。

工作表中的格式过于复杂(如多种字体,多种颜色,条件格式等等)我们都知道,一个工作表有65536*256个单元格,这个非常大的一个范围。

我们在应用一些格式设置时,往往为了方便,直接在整行,或整列,或者在多行和多列中应用,这样其实是不妥当的。

我相信很少有人会用满整列,或者整行。

大量的没有用到的单元格被加上了一些格式后,Excel并不总是知道这个单元格是不需要用的,而往往在计算时会包括这些单元格。

另外,格式的多样性(包括字体,颜色等),势必是要造成Excel文件体积变大,这是不难理解的。

用尽量少的格式样式,如字体和颜色,毕竟Excel的优势不是在于文书,版面的展示(那是Word,PowerPoint等的强项)删除“空白”的单元格。

找到工作表中最右下角的单元格(请注意:除非你有自信,请不要过分依赖Excel 的"定位"=>"最后一个单元格"所给你的结果),我是说你可以手工找到这个单元格。

然后选中这个单元格右边所有的列,然后执行菜单命令:"编辑"=〉"清除"=〉"全部",接下来,选中这个单元格下面所有的行,同样执行菜单命令:"编辑"=〉"清除"=〉"全部",然后保存二。

poi导出excel数据量过大

poi导出excel数据量过大

poi导出excel数据量过⼤问题:使⽤poi导出excel,数据量过⼤导致内存溢出解决思路:1、多sheet导出 2、⽣成多个excel打包下载 3、⽣成csv下载本⽂使⽤的是第⼆个思路,代码如下:poiUtil⼯具类package com.rratchet.scala.ms.util;import ermodel.*;import javax.servlet.http.HttpServletResponse;import java.io.*;import ermodel.HorizontalAlignment;import org.slf4j.Logger;import org.slf4j.LoggerFactory;/*** poi 公⽤⽅法*/public class PoiUtil {/*** 导出excel* @param sheetName* @param title* @param values* @param response* @param fileName* @param charsetName*/public static void exportExcel(String sheetName, String []title, String [][]values, HttpServletResponse response, String fileName,String charsetName){ // 第⼀步,创建⼀个HSSFWorkbook,对应⼀个Excel⽂件HSSFWorkbook wb= new HSSFWorkbook();createContent( wb,sheetName,title,values);//响应到客户端try {fileName = new String(fileName.getBytes(charsetName),"ISO8859-1");response.setContentType("application/octet-stream;charset="+charsetName);response.setHeader("Content-Disposition", "attachment;filename="+ fileName);response.addHeader("Pargam", "no-cache");response.addHeader("Cache-Control", "no-cache");OutputStream os = response.getOutputStream();wb.write(os);os.flush();os.close();} catch (Exception e) {e.printStackTrace();}}/*** 创建excel* @param sheetName sheet名* @param title 标题* @param values 内容* @param fileName ⽂件名* @param filePath ⽂件地址* @return excel保存路径* @throws Exception*/public static String createExcel(String sheetName, String []title, String [][]values,String fileName,String filePath){String resultPath=filePath+"/"+fileName;// 第⼀步,创建⼀个HSSFWorkbook,对应⼀个Excel⽂件HSSFWorkbook wb= new HSSFWorkbook();createContent( wb,sheetName,title,values);//判断是否存在⽬录. 不存在则创建isChartPathExist(filePath);//创建Excel⽂件isFileExist(filePath+"/"+fileName);try{FileOutputStream output=new FileOutputStream(filePath+"/"+fileName);wb.write(output);//写⼊磁盘output.close();}catch (Exception e){resultPath="";e.printStackTrace();}return resultPath;}/*** 创建excel内容* @param wb* @param sheetName* @param title* @param values*/private static void createContent(HSSFWorkbook wb, String sheetName, String []title, String [][]values){ // 第⼆步,在workbook中添加⼀个sheet,对应Excel⽂件中的sheetHSSFSheet sheet = wb.createSheet(sheetName);// 第三步,在sheet中添加表头第0⾏,注意⽼版本poi对Excel的⾏数列数有限制HSSFRow row = sheet.createRow(0);// 第四步,创建单元格,并设置值表头设置表头居中HSSFCellStyle style = wb.createCellStyle();// 创建⼀个居中格式style.setAlignment(HorizontalAlignment.CENTER);//声明列对象HSSFCell cell = null;//创建标题for(int i=0;i<title.length;i++){cell = row.createCell(i);cell.setCellValue(title[i]);cell.setCellStyle(style);}//创建内容for(int i=0;i<values.length;i++){row = sheet.createRow(i + 1);for(int j=0;j<values[i].length;j++){//将内容按顺序赋给对应的列对象row.createCell(j).setCellValue(values[i][j]);}}}/*** 判断⽂件夹是否存在,如果不存在则新建** @param dirPath ⽂件夹路径*/private static void isChartPathExist(String dirPath) {File file = new File(dirPath);if (!file.exists()) {file.mkdirs();}}/*** 判断⽂件是否存在,不存在则创建⽂件* @param dirPath*/public static void isFileExist(String dirPath){File file = new File(dirPath);if (!file.exists()) {try {file.createNewFile();} catch (IOException e) {e.printStackTrace();}}}}fileUtil⼯具类/*** 压缩⽂件(zip)* @param srcFiles* @param zippath* @throws Exception*/public static void Zip(List<File> srcFiles , String zippath)throws Exception {File file=new File(zippath);if(!file.exists()){file.createNewFile();}FileOutputStream out = new FileOutputStream(file);long start = System.currentTimeMillis();ZipOutputStream zos = null ;try {zos = new ZipOutputStream(out);for (File srcFile : srcFiles) {byte[] buf = new byte[4096 * 1024];zos.putNextEntry(new ZipEntry(srcFile.getName()));int len;FileInputStream in = new FileInputStream(srcFile);while ((len = in.read(buf)) != -1){zos.write(buf, 0, len);}zos.closeEntry();in.close();}long end = System.currentTimeMillis();System.out.println("压缩完成,耗时:" + (end - start) +" ms");} catch (Exception e) {throw new RuntimeException("zip error from ZipUtils",e);}finally{if(zos != null){try {zos.close();} catch (IOException e) {e.printStackTrace();}}}}/***获取路径下所有⽂件(递归遍历)* @param fileList* @param path* @throws Exception*/public static void getFiles(List<File>fileList, String path){try {File file = new File(path);if(file.isDirectory()){File []files = file.listFiles();for(File fileIndex:files){//如果这个⽂件是⽬录,则进⾏递归搜索if(fileIndex.isDirectory()){getFiles(fileList,fileIndex.getPath());}else {//如果⽂件是普通⽂件,则将⽂件句柄放⼊集合中fileList.add(fileIndex);}}}}catch (Exception e){e.printStackTrace();}}测试⽅法public static void main(String[] args) throws IOException {String filePath="D:/home/"+UUID.randomUUID().toString();String[] titles = {"上传时间", "连接时间"};for(int i=0;i<5;i++){String time = DateUtil.getDateyyyymmddFormat(new Date());//excel⽂件名String fileName = "连接记录_" + i + ".xls";//sheet名String sheetName = time;String[][] content = new String[20][2];for (int j = 0; j < 20; j++) {content[j][0] = "20190-05-29"+"_"+j;content[j][1] = "s"+j;}PoiUtil.createExcel(sheetName,titles, content, fileName, filePath); }List<File> list=new ArrayList<>();//递归获取⽂件夹下所有内容FileUtils.getFiles(list,filePath);try {FileUtils.Zip(list,"D:/home/测试.zip");//删除⽣成的excelFileUtils.deleteFolderAndFile(filePath); } catch (Exception e) {e.printStackTrace();}}。

EXCEL容量增大的原因及解决办法(补充常见OFFICE问题解决)

EXCEL容量增大的原因及解决办法(补充常见OFFICE问题解决)

EXCEL容量增大的原因及解决办法相信大家有时候会碰到过,一个EXCEL表格,本来只有几M。

经过日常输入数据,操作。

后面变成了几十M,甚至是几百M。

造成电脑的假死,操作慢,电脑反映慢的问题。

其实都是不正常的。

这边我就大家分享一下。

如何处理EXCEL容量增大。

首先排除病毒和软件问题(这个要注意)接下来就是操作引起的,某些用户由于操作习惯习惯ctrl+v进行复制,在复制的时候按了多次等操作也会导致这个情况。

一、工作表中有大量的细小图片对象造成文件增大,这是最常见的文件虚胖原因。

可能的原因:(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, nFor Each sp In ActiveSheet.ShapesIf sp.Width < 14.25 Or sp.Height < 14.25 Then '约小于0.5cm,根据需要设定sp.Deleten = n + 1End IfNext spMsgBox "共删除了" & n & "个对象"End Sub二、工作表中在很大的范围内设置了单元格的格式或者条件格式可能的原因:操作时选择在很大的区域设置或复制了单元格的格式或条件格式(并不是整行整列),而真正用的区域并不很多,造成工作表内容不多,文件却很大。

excel文件过大解决方法

excel文件过大解决方法

excel文件过大解决方法excel文件过大解决方法早上同事发了一个excel过来给我,可是我怎么都打开不了,去她那里试着打开,也是比平常所用的excel慢很多。

后来上网查了一下,才找到解决的办法。

现和朋友们分享一下。

很多人在实际使用excel过程中发生excel文件不明原因的增大,打开计算都很缓慢的现象,有时甚至造成文件损坏,无法打开的情况,以下是我收集的造成文件虚增的原因及处理办法。

一、工作表里有隐藏的对象(往往过大的excel文件都是因为存在这些隐含对象才会变的非常大。

)可以通过excel中的编辑-->定位-->定位条件中的"对象"来清除掉excel中的一些隐含对象。

清除对象后问题解决。

这些隐含对象的来源就是一些程序输出的excel文件所造成的,就是说你不是通过微软的excel程序来建立的excel文档。

(如:从网页上复制内容直接粘帖到工作表中,并不是说不可已复制网页,你可以使用选择性粘帖。

)操作中又通过复制产生了大量的对象。

二、工作表中在很大的范围内设置了单元格的格式或者条件格式我们都知道,一个工作表有65536*256个单元格,这个非常大的一个范围。

我们在应用一些格式设置时,往往为了方便,直接在整行,或整列,或者在多行和多列中应用,这样其实是不妥当的。

我相信很少有人会用满整列,或者整行。

大量的没有用到的单元格被加上了一些格式后,excel并不总是知道这个单元格是不需要用的,而往往在计算时会包括这些单元格。

另外,格式的多样性(包括字体,颜色等),势必是要造成excel文件体积变大,这是不难理解的。

删除“空白”的单元格。

找到工作表中最右下角的单元格("定位"=>"最后一个单元格"),然后选中这个单元格右边所有的列,然后执行菜单命令:"编辑"=〉"清除"=〉"全部",接下来,选中这个单元格下面所有的行,同样执行菜单命令:"编辑"=〉"清除"=〉"全部",然后保存三、工作表中插入的图片格式影响文件的大小选择适当的图片格式,在文档中引用的图片格式一般有三种,bmp、jpg、gif。

npoi 内存占用

npoi 内存占用

npoi 内存占用在计算机程序开发和数据处理领域,内存占用一直是一个重要的指标。

NPOI作为一款.NET平台下的Excel文件读写库,其内存占用情况备受关注。

本文旨在深入探讨NPOI的内存占用问题,分析其原因,并提出优化的方法。

一、NPOI内存占用情况分析NPOI在读写Excel文件时,需要将文件加载到内存中进行处理。

针对大型Excel文件和复杂的数据操作,内存占用往往是一个较为关键的问题。

在正常情况下,NPOI会将Excel文件解析成一个数据模型,并将所有数据存储在内存中。

这样的设计可以提高处理速度,并方便对数据进行操作和修改。

然而,过多的数据存储也会导致内存占用过高的问题。

二、NPOI内存占用过高的原因1. 数据模型存储方式NPOI默认情况下将Excel文件的所有数据存储在内存中的一个数据模型中,这样的设计虽然便于操作,但是对于大型文件来说,内存占用会非常高。

2. 未及时释放资源NPOI在进行数据读写操作时,需要手动释放资源。

如果开发者没有适时地调用Dispose()或者Close()方法来释放相关资源,就会导致内存占用越来越高。

3. 数据缓存问题为了提高操作效率,NPOI在处理数据时会进行缓存。

但是如果缓存的数据量过大,并且没有及时释放,就会导致内存占用过高的问题。

三、优化内存占用方法针对NPOI内存占用过高的问题,可以通过以下方法进行优化:1. 适时释放资源在使用完NPOI进行数据读写操作后,一定要适时地调用Dispose()或者Close()方法来释放资源,特别是对于大型Excel文件的处理,要格外注意。

2. 分页加载数据对于大型Excel文件,可以采取分页加载数据的方式。

即每次只加载一部分数据进行处理,处理完毕后再加载下一部分数据,这样可以有效减少内存占用。

3. 针对性地缓存数据在设计数据缓存时,可以根据实际需求对数据进行针对性的缓存。

只缓存必要的数据,而不是将整个Excel文件的所有数据都存储在内存中。

Excel表格文件体积过大怎么解决

Excel表格文件体积过大怎么解决

Excel表格文件体积过大怎么解决
推荐文章
excel2007表格中标签页不见了的解决方法是什么热度:excel 表格数据公式不生效如何解决热度:excel表格提示不能更改数组如何解决热度: Excel表格中插入图片图表的按钮呈灰色怎么解决热度:Excel表格超链接不能打开的解决方法热度:
Excel中的表格如果内存过大会导致打开慢,表格内存大具体该如何解决呢?下面是由店铺分享的excel表格内存过大的解决方案,欢迎大家来到学习。

excel表格内存过大的解决方法
内存过大解决步骤1:打开内存过大EXCEL文件,可能时间会较长
内存过大解决步骤2:快捷键Ctrl+G ,出现对话框,点定位条件,然后确定,出现如图对话框
内存过大解决步骤3:点对话框内的对象,就会出现如图小虚框,Delete 删掉小框
内存过大解决步骤4:再Ctrl+S 保存即可,这里打开此文件就会快了,内存也会变小很多。

excel表格内存虚大的解决方法

excel表格内存虚大的解决方法

很多人在实际‎使用EXCE‎L过程中发生‎E XCEL文‎件不明原因的‎增大,打开计算都很‎缓慢的现象,有时甚至造成‎文件损坏,无法打开的情‎况,以下是我收集‎的造成文件虚‎增的原因及处‎理办法,对没有提到的‎其他情况和解‎决办法,欢迎大家给予‎补充:一、工作表中有大‎量的细小图片‎对象造成文件‎增大,这是最常见的‎文件虚胖原因‎。

可能的原因:(1)从网页上复制‎内容直接粘帖‎到工作表中,而没有使用选‎择性粘帖,(2)无意中点了绘‎图工具栏的直‎线或其他绘图‎对象,不知不觉中在‎文件中插入了‎小的直线或其‎他图形,由于很小,肉眼几乎无法‎看到,又通过单元格‎的复制产生了‎大量的小绘图‎对象(3)在工作表中插‎入了图片其他‎绘图对象,操作中又将其‎高度宽度设为‎0或很小的值‎,通过复制产生‎了大量的对象‎(4)在行或列的位‎置中插入了绘‎图对象,对象的属性为‎,大小位置随单‎元而变的(默认的),然后隐藏行或‎列,或设置行高或‎列宽为很小的‎值,从而使插入的‎对象不能看到‎(5)工作表中的对‎象设置了不可‎见属性(V isibl‎e=false)或对象的线条‎和填充色均设‎为与底色相同‎,使对象无法看‎到判断方法:(1)编辑→定位(快捷键:F5或Ctr‎l-G),定位条件中选‎“对象”,确定后会显示‎很多被选择的‎小对象(这种方法在隐‎藏列或行中的‎对象并不能看‎到)(2)用VBA对对‎象进行计数,看看有多少个‎对象在工作表‎中,与你的工作表‎中需要的对象‎数量是否相符‎Sub counts‎h apes() Dim n n = Active‎S heet.Shapes‎.Count MsgBox‎"本工作表共有‎" & n & "个对象" End Sub解决办法(1)如果确认工作‎表中没有你需‎要的对象或控‎件,用CTRL-G,定位,定位条件中选‎“对象”,确定后按DE‎L键删除,会删除工作表‎中所有的对象‎(2)用VBA删除‎,可以根据需要‎删除高度或宽‎度小于一定值‎的小对象,如Sub delsha‎p es() Dim sp As Shape, n For Each sp In Active‎S heet.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二、工作表中在很‎大的范围内设‎置了单元格的‎格式或者条件‎格式可能的原因:操作时选择在‎很大的区域设‎置或复制了单‎元格的格式或‎条件格式(并不是整行整‎列),而真正用的区‎域并不很多,造成工作表内‎容不多,文件却很大。

EXCEL数据过大后几种提速的办法{转帖}[教材]

EXCEL数据过大后几种提速的办法{转帖}[教材]

EXCEL数据过大后几种提速的办法EXCEL数据过大后几种提速的办法,我试过可以解决一部分问题!现和大家分享一下.一个工作簿中,并没有多少数据,但文件却很大,运行速度较慢,有时几近无法忍受的地步。

针对这个问题,陆续也有不少朋友参与过讨论,也提出过一些解决方法,但还不完整。

现在我将比较完整地分析Excel工作簿体积膨胀的原因,以及常用的几种方法。

(建议读完全文,同时,强烈建议在按照本文所提到的一些方法进行操作之前要保留文件的备份)第一部分:如何给Excel工作簿减肥除了工作簿本身有宏病毒(关于如何识别宏病毒,本文的结束处有说明)外,有下列的几个原因可能导致工作簿异常膨胀一。

工作表中的格式过于复杂(如多种字体,多种颜色,条件格式等等)我们都知道,一个工作表有65536*256个单元格,这个非常大的一个范围。

我们在应用一些格式设置时,往往为了方便,直接在整行,或整列,或者在多行和多列中应用,这样其实是不妥当的。

我相信很少有人会用满整列,或者整行。

大量的没有用到的单元格被加上了一些格式后,Excel并不总是知道这个单元格是不需要用的,而往往在计算时会包括这些单元格。

另外,格式的多样性(包括字体,颜色等),势必是要造成Excel文件体积变大,这是不难理解的。

用尽量少的格式样式,如字体和颜色,毕竟Excel的优势不是在于文书,版面的展示(那是Word,PowerPoint等的强项)删除“空白”的单元格。

找到工作表中最右下角的单元格(请注意:除非你有自信,请不要过分依赖Excel 的"定位"=>"最后一个单元格"所给你的结果),我是说你可以手工找到这个单元格。

然后选中这个单元格右边所有的列,然后执行菜单命令:"编辑"=〉"清除"=〉"全部",接下来,选中这个单元格下面所有的行,同样执行菜单命令:"编辑"=〉"清除"=〉"全部",然后保存二。

Excel文件太大的九大原因分析及解决办法

Excel文件太大的九大原因分析及解决办法

Excel文件太大的九大原因分析及解决办法内容提要:本文介绍excel文件太大的9个原因,并针对具体原因给出具体的解决方法,从而解决excel文件太大的问题。

时常有朋友问到,Excel文件太大,如何办?首先得找出原因才能有解决的办法。

本文针对Excel文件太大给出几方面的原因分析,以对于那些寻求如何缩小excel文件大小的朋友一些帮助。

很多朋友都用上Excel2010版了,先来看看Excel2010中同一文件保存为何种Excel 格式文件大小最小?同一文件保存格式不同,生成的文件从大到小的顺序为XLS > XLSM > XLSX > XLSB。

另外如果是不明原因的遇到excel文件太大,可以从下面几方面来找原因。

excel文件太大原因之一:工作表中有大量细小图片对象导致文件增大。

比如从网页上复制内容直接粘帖到Excel 文件中,而没有使用选择性粘帖。

无意中单击了绘图工具栏的直线或其他绘图对象,不知不觉中在文件中插入了小的直线或其他图形,由于很小,几乎无法看到,又通过单元格的复制产生了大量的小绘图对象。

在工作表中插入了图片其他绘图对象,操作中又将其高度宽度设为0或很小的值,通过复制产生了大量的对象。

这种问题引起的excel文件太大,解决方法:按下F5键,定位条件,选中“对象”,确定,看是否有很多被选择的小对象。

但如果隐藏列或行,对象仍然不能看到。

这时可以使用VBA对对象进行计数,看看有多少个对象在工作表中,与你的工作表中需要的对象数量是否相符。

方法:按下ALT+F11键,打开VBE窗口,单击插入——模块,复制下面代码,按F5键运行。

Sub countshapes()Dim nn =MsgBox "本工作表共有" & n & "个对象"End Subexcel文件太大原因之二:一个工作簿带有过多工作表,导致体积过大打开缓慢。

适当的Excel工作簿内的工作表分离成多个工作簿,科学合理的创建规范的文件夹,分门别类,逻辑放置。

使用NPOI或POI导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)

使用NPOI或POI导出Excel大数据(百万级以上),导致内存溢出的解决方案(NPOI,POI)

使⽤NPOI或POI导出Excel⼤数据(百万级以上),导致内存溢出的解决⽅案(NPOI,POI)使⽤⼯具:POI(JAVA),NPOI(.Net)致谢博主 Crazy_Jeff 提供的思路⼀、问题描述:导出任务数据量近100W甚⾄更多,导出的项⽬就会内存溢出,挂掉。

⼆、原因分析:1、每个进程在写Excel⽂件时,都是先将数据加载到内存,然后再将内存⾥⾯的数据⽣成⽂件;因此单个进程任务的数据量过⼤,将⽆法及时回收系统内存,最终导致系统内存耗尽⽽宕机。

2、导出中查询结果是⼀次性全部查询出来,占⽤⼤量系统内存资源。

三、优化⽅案思路:1、将所有导出查询全部改成分页的⽅式查询;2、将写Excel⽂件使⽤IO流来实现,采⽤POI,或NPOI拼接xml字符串完成,迭代⼀批数据就flush进硬盘,同时把list,⼤对象赋值为空,显式调⽤垃圾回收器,及时回收内存。

⾸先提供Java版代码POI实现,来⾃:import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.io.OutputStreamWriter;import java.io.Writer;import ng.reflect.Method;import java.util.Calendar;import java.util.Enumeration;import java.util.HashMap;import java.util.List;import java.util.Map;import java.util.UUID;import java.util.zip.ZipEntry;import java.util.zip.ZipFile;import java.util.zip.ZipOutputStream;import ermodel.DateUtil;import ermodel.IndexedColors;import org.apache.poi.ss.util.CellReference;import ermodel.XSSFCellStyle;import ermodel.XSSFDataFormat;import ermodel.XSSFSheet;import ermodel.XSSFWorkbook;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.stereotype.Service;import com.chengfeng.ne.global.service.ITaskService;import com.thinkjf.core.config.GlobalConfig;/*** 功能描述:⽣成Excel⽂件类* @author Jeff* @version 1.0* @date 2015-08-03*/@Service("xlsxOutPutService")public class XlsxOutPutService {@Autowiredprivate ITaskService taskService;/*** 导出每个sheet⾏数*/public int pageSize = Integer.parseInt(GlobalConfig.getPropertyValue("common.exoprt.Worksheet.max.rownum"));/*** 根据传⼊的不同serviceName来执⾏不同的查询语句* @param serviceName* @param execMethod* @param params* @param pageIndex* @return*/public List<?> queryBySerivceName(String serviceName,String execMethod, Map<String, Object> params,int pageIndex)throws Exception{List<?> resultList = null;if("taskService".equals(serviceName)){resultList = taskService.queryExportResultPage(execMethod,params, pageIndex, pageSize);}return resultList;}/*** ⽣成Excel⽂件外部调⽤⽅法* @param headList 标题列表* @param fieldName 字段列表* @param sheetName ⼯作薄sheet名称* @param tempFilePath 临时⽂件⽬录* @param filePath ⽬标⽂件* @param execMethod 执⾏sql* @param params 查询参数* @param serviceName 执⾏service⽅法对象名称* @throws Exception*/public void generateExcel(List<String> headList,List<String> fieldName,String sheetName, String tempFilePath,String filePath,String execMethod, Map<String, O throws Exception {XSSFWorkbook wb = new XSSFWorkbook();Map<String, XSSFCellStyle> styles = createStyles(wb);XSSFSheet sheet = wb.createSheet(sheetName);String sheetRef = sheet.getPackagePart().getPartName().getName();String sheetRefList = sheetRef.substring(1);File tempFiledir = new File(tempFilePath);if(!tempFiledir.exists()){tempFiledir.mkdirs();}String uuid = UUID.randomUUID().toString();uuid = uuid.replace("-", "");File sheetFileList = new File(tempFilePath + "/sheet_" + uuid + ".xml");File tmpFile = new File(tempFilePath + "/"+uuid+".xlsx");FileOutputStream os = new FileOutputStream(tmpFile);wb.write(os);os.close();Writer fw = new OutputStreamWriter(new FileOutputStream(sheetFileList), "UTF-8");//⽣成sheetgenerateExcelSheet(headList,fieldName, fw, styles,execMethod,params,serviceName);fw.close();//将临时⽂件压缩替换FileOutputStream out = new FileOutputStream(filePath);substituteAll(tmpFile, sheetFileList, sheetRefList, out);out.close();// 删除临时⽂件tmpFile.delete();sheetFileList.delete();tmpFile = null;sheetFileList = null;os = null;fw = null;out = null;Runtime.getRuntime().gc();}/*** ⽣成sheet* @param headList* @param fields* @param out* @param styles* @param execMethod* @param params* @throws Exception*/private void generateExcelSheet(List<String> headList,List<String> fields,Writer out,Map<String, XSSFCellStyle> styles,String execMethod, Map<String, Object> params,String serviceName) throws Exception { XSSFCellStyle stringStyle = styles.get("cell_string");XSSFCellStyle longStyle = styles.get("cell_long");XSSFCellStyle doubleStyle = styles.get("cell_double");XSSFCellStyle dateStyle = styles.get("cell_date");Calendar calendar = Calendar.getInstance();SpreadsheetWriter sw = new SpreadsheetWriter(out);sw.beginWorkSheet();sw.beginSetColWidth();for (int i = 10, len = headList.size() - 2; i < len; i++) {sw.setColWidthBeforeSheet(i, 13);}sw.setColWidthBeforeSheet(headList.size() - 1, 16);sw.endSetColWidth();sw.beginSheet();// 表头sw.insertRowWithheight(0, headList.size(), 25);int styleIndex = ((XSSFCellStyle) styles.get("sheet_title")).getIndex();for (int i = 0, len = headList.size(); i < len; i++) {sw.createCell(i, headList.get(i), styleIndex);}sw.endWithheight();//int pageIndex = 1;// 查询起始页Boolean isEnd = false;// 是否是最后⼀页,循环条件do {// 开始分页查询// 导出查询改为分页查询⽅式,替代原有queryExportResult()⽅法long startTimne = System.currentTimeMillis();List<?> dataList = this.queryBySerivceName(serviceName, execMethod, params, pageIndex);long endTime = System.currentTimeMillis();System.out.println("查询"+pageIndex+"完成⽤时="+((endTime-startTimne))+"毫秒");if (dataList != null && dataList.size() > 0) {//写⽅法-------int cellIndex = 0;for (int rownum = 1, len = dataList.size() + 1; rownum < len; rownum++) {cellIndex = 0;sw.insertRow((pageIndex-1)*pageSize+rownum);Object data = dataList.get(rownum-1);Object val = null;Method fieldMethod = null;for (int k = 0, len2 = fields.size(); k < len2; k++) {fieldMethod = (Method) data.getClass().getMethod("get"+ fields.get(k));fieldMethod.setAccessible(true);// 不进⾏安全检测val = fieldMethod.invoke(data);if(val == null){sw.createCell(cellIndex,"",stringStyle.getIndex());}else{String typeName = fieldMethod.getGenericReturnType().toString();if (typeName.endsWith("int") || typeName.endsWith("nteger")) {sw.createCell(cellIndex, (Integer) val,longStyle.getIndex());} else if (typeName.endsWith("ong")) {sw.createCell(cellIndex, (Long) val, longStyle.getIndex());} else if (typeName.endsWith("ouble")) {sw.createCell(cellIndex, (Double) val,doubleStyle.getIndex());} else if (typeName.endsWith("util.Date")) {calendar.setTime((java.util.Date) val);sw.createCell(cellIndex, calendar, dateStyle.getIndex());} else if (typeName.endsWith("sql.Date")) {calendar.setTime((java.sql.Date) val);sw.createCell(cellIndex, calendar, dateStyle.getIndex());} else {sw.createCell(cellIndex, val==null?"":val.toString().replace("<", "&lt;").replace(">", "&gt;"), stringStyle.getIndex());}}cellIndex++;}sw.endRow();if (rownum % 2000 == 0) {out.flush();}}//------------isEnd = true;pageIndex++;} else {isEnd = false;}dataList = null;Runtime.getRuntime().gc();} while (isEnd);sw.endSheet();// 合并单元格// sw.beginMergerCell();// for (int i = 0, len = dataList.size() + 1; i < len; i++) {// sw.setMergeCell(i, 8, i, 9);// }// sw.endMergerCell();sw.endWorkSheet();}/*** 创建Excel样式* @param wb* @return*/private static Map<String, XSSFCellStyle> createStyles(XSSFWorkbook wb) {Map<String, XSSFCellStyle> stylesMap = new HashMap<String, XSSFCellStyle>();XSSFDataFormat fmt = wb.createDataFormat();XSSFCellStyle style = wb.createCellStyle();style.setAlignment(XSSFCellStyle.ALIGN_CENTER);style.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);stylesMap.put("cell_string", style);XSSFCellStyle style2 = wb.createCellStyle();style2.setDataFormat(fmt.getFormat("0"));style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);stylesMap.put("cell_long", style2);XSSFCellStyle style3 = wb.createCellStyle();style3.setDataFormat(fmt.getFormat("0.00"));style3.setAlignment(XSSFCellStyle.ALIGN_CENTER);style3.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);stylesMap.put("cell_double", style3);XSSFCellStyle style4 = wb.createCellStyle();style4.setDataFormat(fmt.getFormat("yyyy-MM-dd HH:mm:ss"));style4.setAlignment(XSSFCellStyle.ALIGN_CENTER);style4.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);stylesMap.put("cell_date", style4);XSSFCellStyle style5 = wb.createCellStyle();style5.setFillForegroundColor(IndexedColors.AQUA.getIndex());style5.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);style5.setAlignment(XSSFCellStyle.ALIGN_CENTER);style5.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);stylesMap.put("sheet_title", style5);return stylesMap;}/*** 打包压缩* @param zipfile* @param tmpfileList* @param entryList* @param out* @throws IOException*/private void substituteAll(File zipfile,File tmpfileList,String entryList, OutputStream out) throws IOException {ZipFile zip = new ZipFile(zipfile);ZipOutputStream zos = new ZipOutputStream(out);@SuppressWarnings("unchecked")Enumeration<ZipEntry> en = (Enumeration<ZipEntry>)zip.entries();while (en.hasMoreElements()) {ZipEntry ze = en.nextElement();if (!entryList.contains(ze.getName())) {zos.putNextEntry(new ZipEntry(ze.getName()));InputStream is = zip.getInputStream(ze);copyStream(is, zos);is.close();is = null;System.gc();}}InputStream is = null;zos.putNextEntry(new ZipEntry(entryList));is = new FileInputStream(tmpfileList);copyStream(is, zos);is.close();zos.close();zip.close();is = null;zos = null;zip = null;System.gc();}private static void copyStream(InputStream in, OutputStream out)throws IOException {byte[] chunk = new byte[1024*10];int count;while ((count = in.read(chunk)) >= 0)out.write(chunk, 0, count);}public int getTrueColumnNum(String address) {address = address.replaceAll("[^a-zA-Z]", "").toLowerCase();char[] adds = address.toCharArray();int base = 1;int total = 0;for (int i = adds.length - 1; i >= 0; i--) {total += (adds[i] - 'a' + 1) * base;base = 26 * base;}return total;}public static class SpreadsheetWriter {private final Writer _out;private int _rownum;public SpreadsheetWriter(Writer out) {this._out = out;}public void beginWorkSheet() throws IOException {this._out.write("<?xml version=\"1.0\" encoding=\"UTF-8\"?><worksheet xmlns=\"/spreadsheetml/2006/main\">"); }public void beginSheet() throws IOException {this._out.write("<sheetData>\n");}public void endSheet() throws IOException {this._out.write("</sheetData>");// 合并单元格}public void endWorkSheet() throws IOException {this._out.write("</worksheet>");}//插⼊⾏不带⾼度public void insertRow(int rownum) throws IOException {this._out.write("<row r=\"" + (rownum + 1) + "\">\n");this._rownum = rownum;}public void endRow() throws IOException {this._out.write("</row>\n");}//插⼊⾏且设置⾼度public void insertRowWithheight(int rownum, int columnNum, double height)throws IOException {this._out.write("<row r=\"" + (rownum + 1) + "\" spans=\"1:"+ columnNum + "\" ht=\"" + height+ "\" customHeight=\"1\">\n");this._rownum = rownum;}public void endWithheight() throws IOException {this._out.write("</row>\n");}public void beginSetColWidth() throws IOException {this._out.write("<cols>\n");}// 设置列宽下标从0开始public void setColWidthBeforeSheet(int columnIndex, double columnWidth)throws IOException {this._out.write("<col min=\"" + (columnIndex + 1) + "\" max=\""+ (columnIndex + 1) + "\" width=\"" + columnWidth+ "\" customWidth=\"1\"/>\n");}public void endSetColWidth() throws IOException {this._out.write("</cols>\n");}public void beginMergerCell() throws IOException {this._out.write("<mergeCells>\n");}public void endMergerCell() throws IOException {this._out.write("</mergeCells>\n");}// 合并单元格下标从0开始public void setMergeCell(int beginColumn, int beginCell, int endColumn,int endCell) throws IOException {this._out.write("<mergeCell ref=\"" + getExcelName(beginCell + 1)+ (beginColumn + 1) + ":" + getExcelName(endCell + 1)+ (endColumn + 1) + "\"/>\n");// 列⾏:列⾏}public void createCell(int columnIndex, String value, int styleIndex)throws IOException {String ref = new CellReference(this._rownum, columnIndex).formatAsString();this._out.write("<c r=\"" + ref + "\" t=\"inlineStr\"");if (styleIndex != -1)this._out.write(" s=\"" + styleIndex + "\"");this._out.write(">");this._out.write("<is><t>" + value + "</t></is>");this._out.write("</c>");}public void createCell(int columnIndex, String value)throws IOException {createCell(columnIndex, value, -1);}public void createCell(int columnIndex, double value, int styleIndex)throws IOException {String ref = new CellReference(this._rownum, columnIndex).formatAsString();this._out.write("<c r=\"" + ref + "\" t=\"n\"");if (styleIndex != -1)this._out.write(" s=\"" + styleIndex + "\"");this._out.write(">");this._out.write("<v>" + value + "</v>");this._out.write("</c>");}public void createCell(int columnIndex, double value)throws IOException {createCell(columnIndex, value, -1);}public void createCell(int columnIndex, Calendar value, int styleIndex)throws IOException {createCell(columnIndex, DateUtil.getExcelDate(value, false),styleIndex);}//10 进制转26进制private String getExcelName(int i) {char[] allChar = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".toCharArray();StringBuilder sb = new StringBuilder();while (i > 0) {sb.append(allChar[i % 26 - 1]);i /= 26;}return sb.reverse().toString();}}}调⽤⽅法如下String tempFilePath = GlobalConfig.getPropertyValue("common.attach.upload_dir") + "/task/tmp/";//调⽤新的⽣成⽅法xlsxOutPutService.generateExcel(Arrays.asList(cellName), fieldName,MessageUtils.getMessage(exportDateType.toString()),tempFilePath, expFilePath, execMetho .net NPOI实现,这⾥没有使⽤list对象,⽽是将list转成了datatable后再来⽣成execl,⽀持多sheet操作using System;using System.Collections;using System.Collections.Generic;using System.Data;using System.IO;using System.Text;using ICSharpCode.SharpZipLib.Zip;using erModel;using NPOI.SS.Util;using erModel;///<summary>/// Xlsx输出/// editor:571115139@///</summary>public class XlsxOutputHelper{private const int FlushCnt = 2000;private static readonly string _tempFilePath = LocalStorge.TempDirectory;public int TotalCnt = 0;public Action<int> ProgressShow = null;private readonly string _batchId;private List<EntryPackage> _sheetFileList = new List<EntryPackage>();private readonly string _filePath;private readonly string _tempFile;private Dictionary<string, XSSFCellStyle> _styles;public XlsxOutputHelper(string filePath){var ext = Path.GetExtension(filePath);if (ext != ".xlsx"){_filePath = Path.GetFileNameWithoutExtension(filePath) + ".xlsx";}else{_filePath = filePath;}File.Create(_filePath).Close();_batchId = Guid.NewGuid().ToString("N");_tempFile = _tempFilePath + "/" + _batchId + ".xlsx";}public void BeginGenerate(List<string> sheetNames){XSSFWorkbook wb = new XSSFWorkbook();_styles = CreateStyles(wb);foreach (var sheetName in sheetNames){wb.CreateSheet(sheetName);}using (var os = new FileStream(_tempFile, FileMode.Create, FileAccess.ReadWrite)){wb.Write(os);}}///<summary>///⽣成Excel,多个sheet⽂件外部调⽤⽅法///</summary>///<param name="headList">标题列表</param>///<param name="sheetName">⼯作薄sheet名称</param>///<param name="querySerivce">查询服务</param>public bool GenerateSheet(List<string> headList, string sheetName, Func<int/*页码*/,int/*数据标识*/, DataPackage/*返回数据*/> querySerivce) {if (!File.Exists(_tempFile)) throw new Exception("请先执⾏BeginGenerate⽅法");XSSFWorkbook wb = new XSSFWorkbook(_tempFile);XSSFSheet sheet = (XSSFSheet)wb.GetSheet(sheetName);string sheetRef = sheet.GetPackagePart();string sheetRefList = sheetRef.Substring(1);wb.Close();if (!Directory.Exists(_tempFilePath)){Directory.CreateDirectory(_tempFilePath);}string guid = Guid.NewGuid().ToString("N");string sheetFileListFile = _tempFilePath + "/sheet_" + guid + ".xml";bool isOk = true;using (var s = File.OpenWrite(sheetFileListFile)){using (StreamWriter fw = new StreamWriter(s, Encoding.UTF8)){//⽣成sheetif (!GenerateExcelSheet(headList, fw, _styles,querySerivce)){isOk = false;}}}if (!isOk){FileHelper.DeleteFile(sheetFileListFile);return false;}_sheetFileList.Add(new EntryPackage() { EntryPath = sheetRefList, XmlFile = sheetFileListFile });return true;}///<summary>///结束⽣成Excel写⼊⽂件到本地///</summary>///<param name="writefileConsole"></param>///<returns></returns>public bool EndGenerate(Action<string> writefileConsole){if (!File.Exists(_tempFile)) throw new Exception("请先执⾏BeginGenerate⽅法");if (_sheetFileList == null || _sheetFileList.Count == 0) return false;writefileConsole("正在写⼊⽂件,请耐⼼等待....");//将临时⽂件压缩替换using (var output = File.OpenWrite(_filePath)){SubstituteAll(_tempFile, _sheetFileList, output);}// 删除临时⽂件FileHelper.DeleteFile(_tempFile);foreach (var entryPackage in _sheetFileList){FileHelper.DeleteFile(entryPackage.XmlFile);}return true;}///// <summary>///// ⽣成Excel⽂件外部调⽤⽅法///// </summary>///// <param name="headList">标题列表</param>///// <param name="sheetName">⼯作薄sheet名称</param>///// <param name="filePath">⽬标⽂件</param>///// <param name="writefileConsole">进度输出</param>//public bool GenerateExcel(List<string> headList, string sheetName, string filePath, Action<string> writefileConsole) //{// XSSFWorkbook wb = new XSSFWorkbook();// Dictionary<string, XSSFCellStyle> styles = CreateStyles(wb);// XSSFSheet sheet = (XSSFSheet)wb.CreateSheet(sheetName);// string sheetRef = sheet.GetPackagePart();// string sheetRefList = sheetRef.Substring(1);// if (!Directory.Exists(_tempFilePath))// {// Directory.CreateDirectory(_tempFilePath);// }// string guid = Guid.NewGuid().ToString("N");// string sheetFileListFile = _tempFilePath + "/sheet_" + guid + ".xml";// string tmpFile = _tempFilePath + "/" + guid + ".xlsx";// using (var os = new FileStream(tmpFile, FileMode.Create, FileAccess.ReadWrite))// {// wb.Write(os);// }// using (var s = File.OpenWrite(sheetFileListFile))// {// using (StreamWriter fw = new StreamWriter(s, Encoding.UTF8))// {////⽣成sheet// if (!GenerateExcelSheet(headList, fw, styles))// {// return false;// }// }// }// writefileConsole("正在写⼊⽂件,请耐⼼等待....");////将临时⽂件压缩替换// using (var output = File.OpenWrite(filePath))// {// SubstituteAll(tmpFile, sheetFileListFile, sheetRefList, output);// }//// 删除临时⽂件// File.Delete(tmpFile);// File.Delete(sheetFileListFile);// return true;//}///<summary>///⽣成sheet///</summary>///<param name="headList"></param>///<param name="output"></param>///<param name="styles"></param>///<param name="querySerivce"></param>private bool GenerateExcelSheet(List<string> headList, StreamWriter output,Dictionary<string, XSSFCellStyle> styles, Func<int/*页码*/, int/*数据标识*/, DataPackage/*返回数据*/> querySerivce) {XSSFCellStyle stringStyle = styles["cell_string"];XSSFCellStyle longStyle = styles["cell_long"];XSSFCellStyle doubleStyle = styles["cell_double"];XSSFCellStyle dateStyle = styles["cell_date"];SpreadsheetWriter sw = new SpreadsheetWriter(output);int[] arrColWidth = new int[headList.Count];for (int i = 0; i < headList.Count; i++){arrColWidth[i] = Math.Max(Encoding.GetEncoding(936).GetBytes(headList[i]).Length, 10);}sw.BeginWorkSheet();sw.BeginSetColWidth();for (int i = 0; i < headList.Count; i++){sw.SetColWidthBeforeSheet(i, arrColWidth[i]+1);}sw.EndSetColWidth();sw.BeginSheet();// 表头sw.InsertRowWithheight(0, headList.Count, 15);int styleIndex = styles["sheet_title"].Index;for (int i = 0, len = headList.Count; i < len; i++){sw.CreateCell(i, headList[i], styleIndex);}sw.EndWithheight();//int pageIndex = 1;// 查询起始页bool hasNextRow;// 是否还有数据,循环条件int flag = 0;//⽤于多批数据的处理int rownum = 1;//总⾏数do{// 开始分页查询// 导出查询改为分页查询⽅式,替代原有queryExportResult()⽅法DataPackage data = querySerivce(pageIndex, flag);if (!data.IsSucess) return false;if(flag==0 || data.Flag==0) flag = data.Flag;if (flag != 0 && flag != data.Flag){flag = data.Flag;pageIndex = 1;hasNextRow = true;continue;}var dt = data.Table;if (dt != null && dt.Rows.Count > 0){int cellIndex;foreach (DataRow row in dt.Rows){cellIndex = 0;sw.InsertRow(rownum);#region填充内容foreach (DataColumn column in dt.Columns){string drValue = row[column].ToString();if (drValue.IsNullOrWiteSpace()){sw.CreateCell(cellIndex, "", stringStyle.Index);}else{switch (column.DataType.ToString()){case"System.DateTime"://⽇期类型DateTime.TryParse(drValue, out DateTime dateV);sw.CreateCell(cellIndex, dateV, dateStyle.Index);break;case"System.Int16"://整型case"System.Int32":case"System.Int64":case"System.Byte":int.TryParse(drValue, out int intV);sw.CreateCell(cellIndex, intV, longStyle.Index);break;case"System.Decimal"://浮点型case"System.Double":double.TryParse(drValue, out double doubV);sw.CreateCell(cellIndex, doubV, doubleStyle.Index);break;case"System.DBNull"://空值处理sw.CreateCell(cellIndex, "", stringStyle.Index);break;default:sw.CreateCell(cellIndex, drValue.Replace("<", "&lt;").Replace(">", "&gt;"), stringStyle.Index);break;}}cellIndex++;}#endregionsw.EndRow();if (rownum % FlushCnt == 0){output.Flush();}rownum++;}ProgressShow?.Invoke(TotalCnt += rownum - 1);hasNextRow = true;pageIndex++;}else{hasNextRow = false;}GC.Collect();} while (hasNextRow);sw.EndSheet();sw.EndWorkSheet();return true;}///<summary>///创建Excel样式///</summary>///<param name="wb"></param>///<returns></returns>private static Dictionary<string, XSSFCellStyle> CreateStyles(XSSFWorkbook wb){Dictionary<string, XSSFCellStyle> stylesMap = new Dictionary<string, XSSFCellStyle>(); IDataFormat fmt = wb.CreateDataFormat();ICellStyle style = wb.CreateCellStyle();style.Alignment = HorizontalAlignment.Left;style.VerticalAlignment = VerticalAlignment.Center;stylesMap.Add("cell_string", (XSSFCellStyle)style);ICellStyle style2 = wb.CreateCellStyle();style2.DataFormat = fmt.GetFormat("0");style2.Alignment = HorizontalAlignment.Center;style2.VerticalAlignment = VerticalAlignment.Center;stylesMap.Add("cell_long", (XSSFCellStyle)style2);ICellStyle style3 = wb.CreateCellStyle();style3.DataFormat = fmt.GetFormat("0");style3.Alignment = HorizontalAlignment.Center;style3.VerticalAlignment = VerticalAlignment.Center;stylesMap.Add("cell_double", (XSSFCellStyle)style3);ICellStyle style4 = wb.CreateCellStyle();style4.DataFormat = fmt.GetFormat("yyyy-MM-dd HH:mm");style4.Alignment = HorizontalAlignment.Center;style4.VerticalAlignment = VerticalAlignment.Center;stylesMap.Add("cell_date", (XSSFCellStyle)style4);ICellStyle style5 = wb.CreateCellStyle();style5.FillForegroundColor = IndexedColors.Grey25Percent.Index;style5.FillPattern = FillPattern.SolidForeground;style5.Alignment = HorizontalAlignment.Center;style5.VerticalAlignment = VerticalAlignment.Center;IFont font = wb.CreateFont();font.FontHeightInPoints = 10;font.Boldweight = 700;style5.SetFont(font);stylesMap.Add("sheet_title", (XSSFCellStyle)style5);return stylesMap;}///<summary>///打包压缩///</summary>///<param name="zipfile"></param>///<param name="sheetList"></param>///<param name="output"></param>private void SubstituteAll(string zipfile, List<EntryPackage> sheetList, Stream output){using (ZipOutputStream zos = new ZipOutputStream(output)){using (ZipFile zip = new ZipFile(zipfile)){IEnumerator en = zip.GetEnumerator();while (en.MoveNext()){if (en.Current == null) continue;ZipEntry ze = (ZipEntry)en.Current;if (!sheetList.Exists(e => e.EntryPath.Contains())){zos.PutNextEntry(new ZipEntry());Stream tis = zip.GetInputStream(ze);var length = ze.Size;StreamUtils.Copy(tis, zos, null, (position) =>{ProgressShow?.Invoke(Convert.ToInt32((position / (length + 0M)) * 100));});}}foreach (var sheetEntry in sheetList){zos.PutNextEntry(new ZipEntry(sheetEntry.EntryPath));using (Stream lis = new FileStream(sheetEntry.XmlFile, FileMode.Open, FileAccess.ReadWrite)) {var length = lis.Length;StreamUtils.Copy(lis, zos, null, (position) =>{ProgressShow?.Invoke(Convert.ToInt32((position / (length + 0M)) * 100));});}}}}}///<summary>///打包压缩///</summary>///<param name="zipfile"></param>///<param name="xmlfile"></param>///<param name="entryList"></param>///<param name="output"></param>private void SubstituteAll(string zipfile, string xmlfile, string entryList, Stream output){using (ZipOutputStream zos = new ZipOutputStream(output)){using (ZipFile zip = new ZipFile(zipfile)){IEnumerator en = zip.GetEnumerator();while (en.MoveNext()){if (en.Current == null) continue;ZipEntry ze = (ZipEntry)en.Current;if (!entryList.Contains()){zos.PutNextEntry(new ZipEntry());Stream tis = zip.GetInputStream(ze);var length = ze.Size;StreamUtils.Copy(tis, zos, null, (position) =>{ProgressShow?.Invoke(Convert.ToInt32((position / (length + 0M)) * 100));});}}zos.PutNextEntry(new ZipEntry(entryList));using (Stream lis = new FileStream(xmlfile, FileMode.Open, FileAccess.ReadWrite)){var length = lis.Length;StreamUtils.Copy(lis, zos, null, (position) =>{。

Excel文件太大的九大原因分析及解决办法

Excel文件太大的九大原因分析及解决办法

Excel文件太大的九大原因分析及解决办法内容提要:本文介绍excel文件太大的9个原因,并针对具体原因给出具体的解决方法,从而解决excel文件太大的问题。

时常有朋友问到,Excel文件太大,如何办?首先得找出原因才能有解决的办法。

本文针对Excel文件太大给出几方面的原因分析,以对于那些寻求如何缩小excel文件大小的朋友一些帮助。

很多朋友都用上Excel2010版了,先来看看Excel2010中同一文件保存为何种Excel 格式文件大小最小?同一文件保存格式不同,生成的文件从大到小的顺序为XLS > XLSM > XLSX > XLSB。

另外如果是不明原因的遇到excel文件太大,可以从下面几方面来找原因。

excel文件太大原因之一:工作表中有大量细小图片对象导致文件增大。

比如从网页上复制内容直接粘帖到Excel 文件中,而没有使用选择性粘帖。

无意中单击了绘图工具栏的直线或其他绘图对象,不知不觉中在文件中插入了小的直线或其他图形,由于很小,几乎无法看到,又通过单元格的复制产生了大量的小绘图对象。

在工作表中插入了图片其他绘图对象,操作中又将其高度宽度设为0或很小的值,通过复制产生了大量的对象。

这种问题引起的excel文件太大,解决方法:按下F5键,定位条件,选中“对象”,确定,看是否有很多被选择的小对象。

但如果隐藏列或行,对象仍然不能看到。

这时可以使用VBA对对象进行计数,看看有多少个对象在工作表中,与你的工作表中需要的对象数量是否相符。

方法:按下ALT+F11键,打开VBE窗口,单击插入——模块,复制下面代码,按F5键运行。

Sub countshapes()Dim nn = ActiveSheet.Shapes.CountMsgBox "本工作表共有" & n & "个对象"End Subexcel文件太大原因之二:一个工作簿带有过多工作表,导致体积过大打开缓慢。

poi处理1万列数据,内存溢出

poi处理1万列数据,内存溢出

poi处理1万列数据,内存溢出
当处理大量数据时,POI库可能会导致内存溢出的问题。

这是因为POI库在内存中创建了大量的对象来表示Excel文件的内容,特别是当处理大量列数据时,会占用大量的内存。

下面是一些可以尝试的方法来解决内存溢出问题:
1. 增加内存:通过增加Java虚拟机的内存限制来解决内存溢出问题。

可以使用`-Xmx`参数来增加Java堆内存的大小,例如`-Xmx4g`表示将Java堆内存的最大限制增加到4GB。

2. 分批处理:将大量的数据分成多个批次进行处理,每次只处理部分数据。

可以使用POI的`SXSSFWorkbook`和`SXSSFSheet`类来进行分批写入,以减少内存使用。

这些类将数据写入临时文件而不是直接写入内存。

3. 使用流式处理:使用POI的`Event API`来处理大数据。

这种方式可以将Excel文件的数据作为事件流来处理,而不是一次性加载到内存中。

可以使用`XSSFReader`和`XSSFListener`来读取Excel文件的内容,并在处理事件时逐行处理数据。

4. 使用CSV格式:如果不需要保留Excel文件的格式和公式,可以将数据导出为CSV格式。

CSV文件是纯文本格式,不需要POI库就可以处理大量数据。

5. 使用其他库:如果POI库无法满足需求,可以尝试使用其他的Excel处理库,如Apache POI-OOXML、JExcel等。

这些库可能对内存的使用有更好的控制。

通过以上方法,您应该能够解决POI处理大量数据时的内存溢出问题。

excel文件过大的解决方法

excel文件过大的解决方法

excel文件过大的解决方法1.我的Excel文件太大了,打开速度太慢。

My Excel file is too large, the opening speed is too slow.2.我需要找到一种方法来减小文件的大小。

I need to find a way to reduce the size of the file.3.也许我可以删除一些不必要的数据。

Maybe I can delete some unnecessary data.4.另一个选择是压缩文件。

Another option is to compress the file.5.我可以尝试使用一些特殊的工具来压缩Excel文件。

I can try using some special tools to compress the Excel file.6.我应该检查一下文件中是否有重复的数据。

I should check if there are any duplicate data in thefile.7.或许我可以分割文件成更小的部分。

Perhaps I can split the file into smaller parts.8.还有一种方法是将一些工作表移动到新的文件中。

Another method is to move some worksheets to a new file.9.我需要清理一些不必要的格式和样式。

I need to clean up some unnecessary formatting and styles.10.也许我可以使用更高效的公式和功能。

Perhaps I can use more efficient formulas and functions.11.我可以让文件只包含当前需要的数据。

I can make the file only include the data that iscurrently needed.12.我需要保持文件结构简单。

EXCEL文件很大的原因分析及解决办法

EXCEL文件很大的原因分析及解决办法
3、如果欲对已设置的不同格式的单元格设置整列或整行统一的格式,应选整行或整列,先清除单元格的格式或将单元格格式设为常规,再对整行或整列设置其他的单元格格式,直接设置有时可能并不能使文件减肥
4、对条件格式也可用编辑-定位,定位条件中选“条件格式”,然后在格式-条件格式中删除条件格式
三、为很大的区域设置了数据有效性
形成原因:
与第二项基本相同,选择很大的区域设置了数据有效性,或将有有效性设置的单元格复制到很大的区域,尤其是在有效性设置中进行了“输入法”“输入信息”“出错警告”的设置,更具有隐蔽性,一般不易发现。
判断方法:
与由于单元格格式造成文件虚肥的原因相同,在清除多余区域的单元格格式后文件尺寸仍没有减下来,就应该考虑是不是有效性设置原因引起
(4)在行或列的位置中插入了绘图对象,对象的属性为,大小位置随单元而变的(默认的),然后隐藏行或列,或设置行高或列宽为很小的值,从而使插入的对象不能看到
(5)工作表中的对象设置了不可见属性(Visible=false)或对象的线条和填充色均设为与底色相同,使对象无法看到
判断方法:
(1)编辑→定位(快捷键:F5或Ctrl-G),定位条件中选“对象”,确定后会显示很多被选择的小对象(这种方法在隐藏列或行中的对象并不能看到)
2、如果需要在一行或一列的很大范围设置统一的单元格格式,可以选择整行或整列设置单元格格式,而不要只选择行列的一部分单独设置格式,再根据需要对行列的个别单元格设置单独的格式,对整行或整列甚至整个工作表设置单元格格式并不会造成文件虚增的问题,对A1:A65536设置单元格格式与对 A1:A65535设置单元格格式文件太小是完全不同的
再补充两条
六、工作表背景造成的文件增大

解决poi读取excel2007出现内存溢出问题代码参考

解决poi读取excel2007出现内存溢出问题代码参考
ZipOutputStream zos =newZipOutputStream(out);
@SuppressWarnings("unchecked")
Enumeration<ZipEntry> en = (Enumeration<ZipEntry>) zip.entries();
while(en.hasMoreElements()) {
}
publicvoidendSheet()throwsIOException {
sw.endSheet();
}
/**
*
*@paramzipfilethetemplatefile
*@paramtmpfiletheXMLfilewiththesheetdata
*@paramentrythenameofthesheetentrytosubstitute,e.g.xl/worksheets/sheet1.xml
*
*/
publicabstractclassAbstractExcel2007Writer {
privateSpreadsheetWritersw;
/**
*写入电子表格的主要流程
*@paramfileName
*@throwsException
*/
publicvoidprocess(String fileName)throwsException{
}
publicvoidinsertRow(introwNum)throwsIOException {
sw.insertRow(rowNum);
}
publicvoidcreateCell(intcolumnIndex, String value)throwsIOException {

Java通过导出超大Excel文件解决内存溢出问题

Java通过导出超大Excel文件解决内存溢出问题

Java通过导出超⼤Excel⽂件解决内存溢出问题前⾔将业务数据导出到Excel表中,导出任务数据量较⼤时,导出的项⽬就会内存溢出,本⽂通过Java操作Poi的SXSSFWorkbook 类进⾏导出,解决内存溢出问题。

1.采⽤Poi中的SXSSFWorkbook在实现excel导出时,在数据量过⼤的情况下,总是容易发⽣内存溢出的情况。

可以使⽤POI提供的 SXSSFWorkbook 类来避免内存溢出。

2.maven中引⼊Poi<!-- poi start --><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>4.1.2</version></dependency><!-- poi end -->3.测试过程先使⽤普通的写法测试(XSSFWorkbook),编写writeNormalExcelTest测试⽅法,写⼊的⾏数太多时,会报内存溢出(在设置-server -Xmx64m -Xms64m -Xmn32m的情况下)。

Excel中文件占内存体积很大的解决方法

Excel中文件占内存体积很大的解决方法

Excel中文件占内存体积很大的解决方法
推荐文章
2017年党员学习的文件热度:学习纪检监察文件心得体会3篇热度:2017中央一号文件全文内容是什么热度:2017中央一号文件全文内容热度: 2017年中央一号文件标题名称热度:Excel文件只有几行数据,为什么体积很大呢?今天,店铺就教大家在Excel中文件占内存体积很大的解决方法。

Excel中文件占内存体积很大的解决步骤
最近收到一个客户的EXCEL文件,只要几行数据。

体积却很大。

这个文件有4.2M,按照常理,这个文件只有几十KB。

什么原因?
什么原因使文件增加,你会发现这个文件里面没有图片。

没有对象。

什么原因呢?
肯定是隐藏的对象。

一些设置好以后,肉眼是没有办法看到的。

怎么样找到这些隐藏对象呢?CTRL+G打开定位对话框。

Excel中文件占内存体积很大的解决步骤图2
点击定位对话框下的“定位条件”选择“对象”并确定
Excel中文件占内存体积很大的解决步骤图3
看一下,是不是有隐藏的对象找到?再按DEL键就可以删除所有的对象了。

结果这个4M的文件只有16KB了。

Excel中文件占内存体积很大的解决步骤图4 Excel中文件占内存体积很大的解决方法。

解决大批量数据导出Excel产生内存溢出的方案

解决大批量数据导出Excel产生内存溢出的方案
for (int k = offset; k < records.size(); k++) {
Record rec = (Record) records.get(k);
if (rec.getSid() == LabelRecord.sid) {
LabelRecord oldrec = (LabelRecord) rec;
int index = workbook.addSSTString(sstRecord.getString(j));
//记录原来的索引和现在的索引的对应关系
map.put(Integer.valueOf(j), Integer.valueOf(index));
}
} else if (record.getSid() == LabelSSTRecord.sid) {
POIFSFileSystem fs = new POIFSFileSystem();
// Write out the Workbook stream
try {
fs.createDocument(new ByteArrayInputStream(data), "Workbook");
fs.writeFilesystem(out);
out.flush();
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
static List<Sheet> getSheets(Workbook workbook, List records) {
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

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、对条件格式也可用编辑-定位,定位条件中选“条件格式”,然后在格式-条件格式中删除条件格式三、为很大的区域设置了数据有效性形成原因:与第二项基本相同,选择很大的区域设置了数据有效性,或将有有效性设置的单元格复制到很大的区域,尤其是在有效性设置中进行了“输入法”“输入信息”“出错警告”的设置,更具有隐蔽性,一般不易发现。

相关文档
最新文档