zoukankan      html  css  js  c++  java
  • [转]POI实现读写Excel2007完整示例

    http://blog.csdn.net/little_stars/article/details/8210532

    流程:(跟jxl相似,只是读取逻辑有点不同)

    跟jxl的两处主要区别:

    1、读取和写入方式略有不同:

    (1)  poi 读取:

    [java] view plain copy
     
     print?
    1. <span style="white-space:pre">  </span>  FileInputStream input = new FileInputStream(new File(xls_read_Address));  //读取的文件路径   
    2.           XSSFWorkbook wb = new XSSFWorkbook(new BufferedInputStream(input));   

         poi 写入:先定位 哪一行,再在这个行的循环里面 写入每个 单元格的内容;

    (2) jxl 读取:

    [java] view plain copy
     
     print?
    1. <span style="white-space:pre">  </span>  Workbook book = Workbook.getWorkbook(new File(xls_read_Address),workbookSettings);   

    jxl 写入:任意定位 行列数,写入更灵活,当然,写入整个表的话,还是跟poi一样要遍历的。

    2、数据类型判断方式略有不同:

    (1)个人觉得,数据类型处理方面,poi 比不上 jxl 方便实用,poi在处理 数字 类型的值时 很容易出问题(不用文本方式),各位亲可以亲自试试。

    (2)jxl 则处理的很好,像一般 操作 都只需要用到 文本方式就行。

    ----------------------------------------------------------------------------------

    1、用 poi 读取Excel表格(传入Excel地址等):

    (1)读取Excel   ,将 Excel 中的所有 “工作表”,封装进 ArrayList<ArrayList>     ls      中;

    (2)读取工作表,遍历 ls,     将 每个 工作表 的所有数据,封装进 ArrayList<Sring[]>         ls_a  中;

    (3)读取每一行,遍历 ls_a,将 每一行 的所有 列 的内容,封装数组 Sring[]                        s        中;

    (4)对 单元格 内容 进行 操作,比如 替换值、设置宽度 等。

    (5)操作完后,赋值给对应的 s[i],也就是重写了s[i]的内容;接着封装进 ls_a ,最后把 ls_a 封装进 ls;

    (6)关闭 流:

    1. input.close(); 

    2、用 jxl 写入Excel 表格(传入 ArrayList<ArrayList>,新Excel地址等):

    (1)用  ArrayList<ArrayList>     ls 接收 上面 的传值,遍历 ls;

    (2)用  ArrayList<Sring[]>  ls_a   接收 遍历出来的 ls.get(i) ,并且 接着 遍历 ls_a ;

    (3)用 String[] s 接收 遍历 出来的 ls_a ;

    (4)用

    [java] view plain copy
     
     print?
    1. <span style="white-space:pre">          </span>XSSFCell cell = row.createCell(cols);                      
    2.                     cell.setCellType(XSSFCell.CELL_TYPE_STRING);//文本格式  
    3.                     cell.setCellValue(s[cols]);//写入内容  

    将每个 s[cols]  写入 第 cols+1 列 。

    (5)关闭流:           

    [java] view plain copy
     
     print?
    1. <span style="white-space:pre">      </span>wb.write(output);  
    2.         output.close();   

    ----------------------------------------------------------------------------------

    方案 :每分钟约 处理 7000 行数据

    运行环境:Tomcat 6.0.36  +JDK 1.6 + IE9 

    ----------------------------------------------------------------------------------

    1、建议建一个web工程而不是java工程;好处是:既可以用作web访问,又可以 以  java 工程 来测试;

    2、src 下建一个包,两个 java文件,比如:Config.java ;

    3、说明:Config.java  ,所有操作在这里完成 ;

    4、添加 jxl 的包,顺便如果用到数据库,就添加数据库包,比如本例中 oracle;

    5、测试前要修改的信息有:

    (1)包所在的路径、类名 等按提示修改即可;

    (2) 数据库 信息 配置,这个要手动一个个修改,如果没有数据库的,那就用更简单的,将本例中的 调用数据库的 代码 直接去掉即可。

    (3)各方法传入参数和传出参数 的修改:比如 Excel 文件路径 等

    6、源码如下(源码中有调用到一个  DataConvert 类,这个类 是一个 基本数据类型 转换的封装类,你可以自己写一个方法替换就行):

    (1)Config.java

    [java] view plain copy
     
     print?
    1. package com.excel.poi.gz10000;  
    2. import java.io.BufferedInputStream;  
    3. import java.io.File;  
    4. import java.io.FileInputStream;  
    5. import java.io.FileOutputStream;  
    6. import java.io.IOException;  
    7. import java.io.UnsupportedEncodingException;  
    8. import java.sql.Connection;  
    9. import java.sql.DriverManager;  
    10. import java.sql.ResultSet;  
    11. import java.sql.SQLException;  
    12. import java.sql.Statement;  
    13. import java.text.DecimalFormat;  
    14. import java.text.NumberFormat;  
    15. import java.util.ArrayList;  
    16. import javax.servlet.ServletException;  
    17. import javax.servlet.http.HttpServlet;  
    18. import javax.servlet.http.HttpServletRequest;  
    19. import javax.servlet.http.HttpServletResponse;  
    20.    
    21. import org.apache.poi.xssf.usermodel.XSSFCell;   
    22. import org.apache.poi.xssf.usermodel.XSSFRow;    
    23. import org.apache.poi.xssf.usermodel.XSSFSheet;    
    24. import org.apache.poi.xssf.usermodel.XSSFWorkbook;    
    25.   
    26. /** 
    27.  * <b> 数据匹配</b> <br> 
    28.  * <ul> 
    29.  * <li> 作者:C_Dream </li> 
    30.  * <li> 时间: 2012-11-08 19:22 </li> 
    31.  * <li> 版本:1.0 </li> 
    32.  * </ul> 
    33.  */  
    34. public class Config extends HttpServlet{  
    35.     private static final long serialVersionUID = 1L;    //此行可省略,只是为了标识  
    36.       
    37.       
    38.       
    39.     public void doPost(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException  
    40.     {  
    41.         this.doGet(request,response); //将 表单  post 方法传过来的参数,转给 get方法 去处理  
    42.     }  
    43.     public void doGet(HttpServletRequest request,HttpServletResponse response)throws ServletException, IOException   
    44.     {  
    45.          request.setCharacterEncoding("UTF-8"); //转码  
    46.          String forms=(String)request.getParameter("forms");  
    47.   
    48.          if(forms.equals("if_3g")){  
    49.                 try {  
    50.                     this.read_Excel(request,response);  
    51.                 } catch (SQLException e) {  
    52.                     e.printStackTrace();  
    53.                 } catch (ClassNotFoundException e) {  
    54.                     e.printStackTrace();  
    55.                 }  
    56.          }  
    57.                    
    58.          response.sendRedirect("index.jsp?done=true");  
    59.     }   
    60.       
    61.       
    62.     @SuppressWarnings("rawtypes")  
    63.     public void read_Excel(HttpServletRequest request,  
    64.             HttpServletResponse response) throws UnsupportedEncodingException, SQLException, ClassNotFoundException {  
    65.         request.setCharacterEncoding("UTF-8");  //转码  
    66.         String xls_read_Address=(String)request.getParameter("xls_read_Address");//读取     
    67.         String xls_write_Address=(String)request.getParameter("xls_write_Address");//写入  
    68.         String  count_rows=(String)request.getParameter("count_rows");//自动编号      
    69.           
    70.         try {   
    71.             DataConvert dc = new DataConvert();//数据转换工具  
    72.             DecimalFormat df = (DecimalFormat) NumberFormat.getPercentInstance();   
    73.             ArrayList<ArrayList> ls = new  ArrayList<ArrayList>();  
    74.               
    75.             FileInputStream input = new FileInputStream(new File(xls_read_Address));  //读取的文件路径   
    76.             XSSFWorkbook wb = new XSSFWorkbook(new BufferedInputStream(input));   
    77.               
    78.             int sheet_numbers = wb.getNumberOfSheets();//获取表的总数  
    79.             String[] sheetnames=new String[sheet_numbers];  
    80.               
    81.             Connection con=null;  
    82.             Statement  stmt=null;  
    83.             ResultSet  rs=null;  
    84.             String s_3g=null;             
    85.             Class.forName("oracle.jdbc.driver.OracleDriver");  
    86.             con = DriverManager.getConnection("jdbc:oracle:thin:@10.57.123.214:1521:gz13200","gz13200","12345");  
    87.             stmt = con.createStatement();     
    88.               
    89.             for(int i=0;i<sheet_numbers;i++){//遍历所有表               
    90.                 ArrayList<String[]> ls_a = new  ArrayList<String[]>(); //用来存储某个表 读取出来的数据    
    91.                 XSSFSheet sheet = wb.getSheetAt(i);  //获取 某个表                
    92.                 sheetnames[i] = sheet.getSheetName();//获取表名,存入数组  
    93.                 System.out.println("------>>>---正在读取Excel表数据,当前表:"+sheetnames[i]);  
    94.                   
    95.                 for( int rows=0;rows<sheet.getLastRowNum();rows++){//有多少行  
    96.                     XSSFRow row = sheet.getRow(rows);//取得某一行   对象                     
    97.                     String[] s =new String[5];//初始化数组长度  
    98.                       
    99.                     for( int columns=0;columns<row.getLastCellNum();columns++){//读取所有列  
    100.                         //s[columns] = row.getCell(columns).getStringCellValue(); //取得某单元格内容,字符串类型   
    101.                         XSSFCell  cell = row.getCell(columns);                    
    102.                         if(cell!=null){   
    103.                         switch ( cell.getCellType()) {    
    104.                          case XSSFCell.CELL_TYPE_STRING: // 字符串     
    105.                              s[columns] = cell.getStringCellValue();    
    106.                              if(s[columns]==null){  
    107.                                  s[columns]=" ";  
    108.                              }  
    109.                              break;   
    110.                          case XSSFCell.CELL_TYPE_NUMERIC: // 数字                            
    111.                                 double strCell = cell.getNumericCellValue();  
    112.                              if(String.valueOf(strCell)==null){  
    113.                                  s[columns]=" ";  
    114.                              }    
    115.                                       
    116.                                 df.applyPattern("0");  
    117.                                 s[columns] = df.format(strCell);  
    118.                                 if(Double.parseDouble(s[columns])!=strCell){  
    119.                                  df.applyPattern(Double.toString(strCell));  
    120.                                  s[columns] = df.format(strCell);  
    121.                                 }  
    122.                                
    123.                              break;  
    124.                          case XSSFCell.CELL_TYPE_BLANK: // 空值     
    125.                              s[columns]=" ";    
    126.                              break;     
    127.                          default:     
    128.                              System.out.print(" ---单元格格式不支持---");     
    129.                              break;     
    130.                          }    
    131.                        }  
    132.                     }  
    133.                     if(count_rows.equals("是")&&rows>0){  
    134.                         s[0]=dc.intToString(rows);//自动编号  
    135.                     }  
    136.                       
    137.                     /* ******** 访问数据库 ,并判断是否3G ******** */  
    138.                     String sql="select * from ap_t_si_cus_spec_info where cus_phone='"+s[1]+"' and rownum=1";                         
    139.                     rs = stmt.executeQuery(sql);  
    140.                       
    141.                     if(rs.next()){  
    142.                         if(rs.getString("busiattr1")!=null){  
    143.                             s_3g = rs.getString("busiattr1").toString().toUpperCase();  
    144.                         }  
    145.                         else{  
    146.                             s_3g=" ";  
    147.                         }  
    148.                     }  
    149.                     else{  
    150.                         s_3g=" ";  
    151.                     }   
    152.                     /* ******** 访问结束  ******** */  
    153.                       
    154.                     if(s_3g.contains("3G")){  
    155.                         s[4]="是";//写入 “是否3G”这一列 的值,比如 “是”  
    156.                     }  
    157.                     if(s[4]==null){  
    158.                         s[4]=" ";  
    159.                     }  
    160.                     System.out.println(" ------>>>---已处理数据---号码:"+s[1]+" 是否3G:"+s[4]);  
    161.                     ls_a.add(s);//添加每行数据到 ls_a    
    162.             }  
    163.             ls.add(ls_a);       //添加 每个表 到 ls   
    164.             System.out.println(" ------>>>---开始写入Excel文件,请耐心等待---<<<------");  
    165.             input.close();    
    166.             write_Excel( xls_write_Address, ls, sheetnames )  ;   
    167.             }              
    168.         } catch (IOException ex) {    
    169.             ex.printStackTrace();    
    170.         }  
    171.     }  
    172.   
    173.     @SuppressWarnings({ "rawtypes", "unchecked" })  
    174.     public void write_Excel( String xls_write_Address,ArrayList<ArrayList> ls,String[] sheetnames ) throws IOException  {  
    175.           
    176.         FileOutputStream output = new FileOutputStream(new File(xls_write_Address));  //读取的文件路径   
    177.         XSSFWorkbook wb = new XSSFWorkbook();//(new BufferedInputStream(output));         
    178.           
    179.           
    180.         for(int sn=0;sn<ls.size();sn++){  
    181.             XSSFSheet sheet = wb.createSheet(String.valueOf(sn));  
    182.             wb.setSheetName(sn, sheetnames[sn]);          
    183.             ArrayList<String[]> ls2 = ls.get(sn);           
    184.             for(int i=0;i<ls2.size();i++){  
    185.                 XSSFRow row = sheet.createRow(i);  
    186.                 String[] s = ls2.get(i);                  
    187.                 for(int cols=0;cols<s.length;cols++){  
    188.                     XSSFCell cell = row.createCell(cols);                     
    189.                     cell.setCellType(XSSFCell.CELL_TYPE_STRING);//文本格式  
    190.                     cell.setCellValue(s[cols]);//写入内容  
    191.                 }  
    192.   
    193.             }              
    194.          }    
    195.         wb.write(output);  
    196.         output.close();   
    197.         System.out.println("-------【完成写入】-------");       
    198.     }  
    199. }  
    200.    

    -----------------------------------------------------------

    关于代码可读性与扩展性,以及运行效率问题的 小结:

    1、本章方案:二次开发难度相对高,但是运行效率更高,因为只需连接一次数据库,就可以处理所有数据;

    2、跟前章jxl类似的DAO方案(本章未列出):代码可读性相对高,更适合做二次开发,但是由于 在业务中调用DAO,因此 每次都连接数据库,因此消耗了性能; 

    -------------------------------------------------

    关于为何 不用 SSH 等框架:

    1、一个小小的业务的话,是没必要伤筋动骨的;

    2、如果业务不多,那么,其实直接用 JDBC 访问数据库,效率比 Hibernate 更高;

    3、不用 SSH,那么,对公司的员工的技术要求 门槛就低了,可以用 较低的成本,完成自己的业务。

  • 相关阅读:
    函数
    文件的基本操作
    c语言程序设计案例教程(第2版)笔记(一)—零散、输入输出、最小公倍数、选择排序、冒泡排序
    c语言中的rand()函数用法
    c语言 error C4996: 'strupr': The POSIX name for this item is deprecated. Instead, use the ISO C and C++ conformant name
    Python之列表生成式、生成器
    Python之迭代器
    Python之装饰器
    Linux之线程相关命令及常用命令
    重写、重构、重载区别
  • 原文地址:https://www.cnblogs.com/shengs/p/5751418.html
Copyright © 2011-2022 走看看