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

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

跟jxl的两处主要区别:

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

(1)  poi 读取:

  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 读取:

  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)用

  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)关闭流:

  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

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

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

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

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

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

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

关于为何 不用 SSH 等框架:

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

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

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

[转]POI实现读写Excel2007完整示例的更多相关文章

  1. Java poi读取,写入Excel2007

    Java poi读取,写入Excel2007 相关阅读:poi读写Excel2003:http://www.cnblogs.com/gavinYang/p/3576739.htmljxl读写excel ...

  2. 【第四篇】ASP.NET MVC快速入门之完整示例(MVC5+EF6)

    目录 [第一篇]ASP.NET MVC快速入门之数据库操作(MVC5+EF6) [第二篇]ASP.NET MVC快速入门之数据注解(MVC5+EF6) [第三篇]ASP.NET MVC快速入门之安全策 ...

  3. java使用poi读取ppt文件和poi读取excel、word示例

    java使用poi读取ppt文件和poi读取excel.word示例 http://www.jb51.net/article/48092.htm

  4. WCF服务开发与调用的完整示例

    WCF服务开发与调用的完整示例 开发工具:VS2008 开发语言:C# 开发内容:简单的权限管理系统 第一步.建立WCF服务库 点击确定,将建立一个WCF 服务库示例程序,自动生成一个包括IServi ...

  5. springmvc 项目完整示例06 日志–log4j 参数详细解析 log4j如何配置

    Log4j由三个重要的组件构成: 日志信息的优先级 日志信息的输出目的地 日志信息的输出格式 日志信息的优先级从高到低有ERROR.WARN. INFO.DEBUG,分别用来指定这条日志信息的重要程度 ...

  6. c#读写注册表示例分享

    c#读写注册表示例,示例中有详细注释. 代码: //写注册表RegistryKey regWrite;//往HKEY_CURRENT_USER主键里的Software子键下写一个名为“Test”的子键 ...

  7. C连接MySQL数据库开发之Linux环境完整示例演示(增、删、改、查)

    一.开发环境 ReadHat6.3 32位.mysql5.6.15.gcc4.4.6 二.编译 gcc -I/usr/include/mysql -L/usr/lib -lmysqlclient ma ...

  8. Struts 2.3.4.1完整示例

    [系统环境]Windows 7 Ultimate 64 Bit [开发环境]JDK1.6.21,Tomcat6.0.35,MyEclipse10 [其他环境]Struts2.3.4.1 [项目描述]S ...

  9. Spring 3 AOP 概念及完整示例

    AOP概念 AOP(Aspect Oriented Programming),即面向切面编程(也叫面向方面编程,面向方法编程).其主要作用是,在不修改源代码的情况下给某个或者一组操作添加额外的功能.像 ...

随机推荐

  1. 5. 支持向量机(SVM)软间隔

    1. 感知机原理(Perceptron) 2. 感知机(Perceptron)基本形式和对偶形式实现 3. 支持向量机(SVM)拉格朗日对偶性(KKT) 4. 支持向量机(SVM)原理 5. 支持向量 ...

  2. 词袋模型bow和词向量模型word2vec

    在自然语言处理和文本分析的问题中,词袋(Bag of Words, BOW)和词向量(Word Embedding)是两种最常用的模型.更准确地说,词向量只能表征单个词,如果要表示文本,需要做一些额外 ...

  3. 收藏mac重装php环境

    参考网址: 全新安装Mac OSX 开发者环境 同时使用homebrew搭建 PHP,Nginx ,MySQL,Redis,Memcache ... ... (LNMP开发环境)

  4. composer概念学习

    composer的中文文档地址 Composer是什么 Composer 是 PHP 的一个依赖管理工具.它允许你申明项目所依赖的代码库,它会在你的项目中为你安装他们. Composer 不是一个包管 ...

  5. [开发笔记]-初学WPF之自学笔记

    一:动态加载背景图片 代码: 在窗体加载时,Window_Loaded 方法中: #region 测试动态加载背景图片 /* 1.图片右键 属性: 复制到输出目录:选择“如果较新则复制” 生成操作选择 ...

  6. UEFI Protocol

    MEM_INFO_PROTOCOL MEM_INFO_PROTOCOL; EFI_LOADED_IMAGE_PROTOCOL EFI_DEVICE_PATH_PROTOCOL EFI_DRIVER_B ...

  7. DevExpress控件安装和初次使用图解

    安装: 解压后包含这么多东东.执行选中的那个: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fil ...

  8. R语言使用tryCatch进行简单的错误处理

    最近在看<机器学习:实用案例解析>,做邮件过滤器的时候,参考书中的代码读取邮件文件进行分类器训练,在读取过程中会出现下面的错误:   seq.default(which(text == & ...

  9. Sword ACE编译

    1.设置环境变量 #ACE_ROOT是指ACE解压目录 export ACE_ROOT=/home/person/2/ACE_wrappers export LD_LIBRARY_PATH=$ACE_ ...

  10. so在genymotation中错误问题

    genymotation的android模拟器运行起来非常快,但是有些项目安装到上面不是crash,log一般是so文件调用失败的信息,或则直接提示INSTALL_FAILED_CPU_ABI_INC ...