java操作Excel效率之poi与fastexcel比较

来源:互联网 发布:ae视频软件 编辑:程序博客网 时间:2024/06/04 03:57
最近看到有关fastexcel的消息

自己做了个小测试
POI代码如下
Java代码
  1.      public void testPoiExcel(String strPath) throws Exception {  
  2.   
  3. HSSFWorkbook wb = new HSSFWorkbook(new FileInputStream(strPath));  
  4.   
  5. HSSFSheet sheet = wb.getSheetAt(0);  
  6.   
  7. HSSFRow row;  
  8. HSSFCell cell;  
  9.   
  10. for (int i = sheet.getFirstRowNum(); i < sheet.getLastRowNum(); i++) {  
  11.     row = sheet.getRow(i);  
  12.     for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {  
  13.         cell = row.getCell((short) j);  
  14.     }  
  15. }  

fastExcel代码如下
Java代码
  1. public void testFastExcel(String strPath) throws Exception {  
  2.       
  3.     Workbook workBook = FastExcel.createReadableWorkbook(new File(strPath));  
  4.     workBook.open();  
  5.   
  6.     Sheet s = workBook.getSheet(0);  
  7.       
  8.     String[] row;  
  9.     String cell;  
  10.       
  11.     for (int i = s.getFirstRow(); i <= s.getLastRow(); i++) {  
  12.         row = s.getRow(i);  
  13.         for (int j = s.getFirstColumn(); j <= s.getLastColumn(); j++) {  
  14.             cell = s.getCell(i, j);  
  15.         }  
  16.     }  
  17.       
  18.     workBook.close();  
  19. }  

Excel一行数据如下【AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA,AAAAAAAA


测试结果如下
POI         2272条     5782毫秒
FastExcel   2272条     828毫秒
在我的机器上设置的jvm内存 poi只能跑2272条数据,再多就内存溢出了。
FastExcel做到48000条还没溢出时间是14093毫秒

为什么这么大区别 我自己感觉是 POI用的是大对象HSSFRow,HSSFCell而Fastexcel是String[]和String
毕竟在集合中数组是占用空间最小的

但是这样的话 fastexcel不能操作Excel的样式了 ,如果是做简单的Excel导入导出首选FastExcel
  • Source.rar (1.1 MB)
  • 下载次数: 230
    <script type="text/javascript"><!-- google_ad_client = &quot;pub-9971846879634397&quot;;google_ad_slot = &quot;6749798418&quot;;google_ad_width = 728;google_ad_height = 90;// --></script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"></script><script src="http://pagead2.googlesyndication.com/pagead/expansion_embed.js"></script><script src="http://googleads.g.doubleclick.net/pagead/test_domain.js"></script><script type="text/javascript"><!-- window.google_render_ad();// --></script>
    推荐链接
    • 6月份JAVA技术沙龙活动通知
    • 在繁琐中挣扎还是简化自主管理?
                                     
    • houwen
    • 等级: 初级会员
    • 文章: 2
    • 积分: 30
    • 来自: 上海


    Java代码
    1. public static void main(String [] args){  
    2.         writeExcel("testPoi.xls");  
    3.         System.out.println(readExcel(new File("testPoi.xls")));  
    4.     }  
    5.   
    6.     private static void writeExcel(String fileName) {  
    7.         HSSFWorkbook wb = new HSSFWorkbook();  
    8.         for(int sheetIndx = 0; sheetIndx < 5 ;sheetIndx++){  
    9.             HSSFSheet sheet = wb.createSheet("sheet" + sheetIndx);     
    10.             HSSFRow row;     
    11.             HSSFCell cell;     
    12.             for (int rowIndex = 0; rowIndex < 10; rowIndex++) {     
    13.                 row = sheet.createRow(rowIndex);     
    14.                 for (int cellIndex = 0; cellIndex < 5; cellIndex++) {     
    15.                     cell = row.createCell(cellIndex);  
    16.                     cell.setCellValue("hello");  
    17.                 }   
    18.             }    
    19.         }  
    20.         FileOutputStream fos = null;     
    21.         try{  
    22.             initFile(fileName);  
    23.             fos = new FileOutputStream(fileName);   
    24.             wb.write(fos);  
    25.         }catch(Exception e){  
    26.             e.printStackTrace();  
    27.   
    28.         } finally {     
    29.             try {     
    30.                 fos.flush();  
    31.                 fos.close();    
    32.             } catch (Exception e) {     
    33.                 e.printStackTrace();     
    34.             }     
    35.         }     
    36.     }  
    37.   
    38.     private static String readExcel(File file) {  
    39.         StringBuffer strBuffer = new StringBuffer();  
    40.         HSSFWorkbook wb;  
    41.         FileInputStream fs = null;   
    42.         try {  
    43.             fs = new FileInputStream(file);   
    44.             wb = new HSSFWorkbook(fs);     
    45.             int sheetNum = wb.getNumberOfSheets();  
    46.             for(int sheetIndx = 0; sheetIndx < sheetNum ;sheetIndx++){  
    47.                 HSSFSheet sheet = wb.getSheetAt(sheetIndx);     
    48.                 HSSFRow row;     
    49.                 HSSFCell cell;     
    50.                 strBuffer.append(wb.getSheetName(sheetIndx)+ "/r/n");   
    51.                 for (int i = sheet.getFirstRowNum(); i < sheet.getLastRowNum(); i++) {     
    52.                     row = sheet.getRow(i);     
    53.                     for (int j = row.getFirstCellNum(); j < row.getLastCellNum(); j++) {     
    54.                         cell = row.getCell(j);  
    55.                         strBuffer.append(cell.toString() + "/t");  
    56.                     }   
    57.                     strBuffer.append("/r/n");   
    58.                 }    
    59.             }  
    60.         }catch (Exception e){  
    61.   
    62.         } finally {  
    63.             try {  
    64.                 fs.close();  
    65.             } catch (IOException e) {  
    66.                 e.printStackTrace();  
    67.             }  
    68.         }  
    69.         return strBuffer.toString();  
    70.     }  
    71.     private static void initFile(String filePath) {  
    72.         File file = new File(filePath);  
    73.         if(!file.exists()){  
    74.             try {  
    75.                 file.createNewFile();  
    76.             } catch (IOException e) {  
    77.                 // TODO Auto-generated catch block  
    78.                 e.printStackTrace();  
    79.             }  
    80.         }     
    81.     }  
             
    poi当cell对象过多的时候 会造成内存溢出的
    而且样式什么的设置 如果过多的话也会内存溢出