poi9处理excel中的百万条数据
来源:互联网 发布:win10平板手势软件 编辑:程序博客网 时间:2024/05/09 00:06
前段时间联通发过来一个全北京市所有的客户的帐户信息,就一个sheet共1048976行,让查一查这些客户在16年上半年有没有在走过综合故障单系统,都是哪几个月,出现几回。需求很简单,就是查一下有出现在就写一个“是”没有“否”就可以,打算用poi14后来用了poi9,其实都一样,都能处理 xlsx格式的excel,其中9里有一个扩展包poi-ooxml-3.9-20121203.jar专业用来处理2007之后的excel.限时三天。前两天试各种方式还是不行,各种内存溢出。问题是poi下次处理不了这么多数据,怎么办呢,叶师傅出了几条路:1)装一个64位的jdk,前提是系统也是64位,然后开几个进程同时进行。2)把class的内存分大一点(右键-->Run As ---> Run Configurations --> Arguments --> VM Arguments) 写上-Xms1024m -Xmx1532m , 主要是写给这个文件分配多一点内存3)分成5万一个,也就是20个excel结果:把文件分成10份,一份10万条,先做完了2)再装了1)一次跑三个进程,把用到的包写一下cmd执行:
java -classpath F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\dom4j-1.6.1.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\poi-ooxml-schemas-3.9-20121203.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\xmlbeans-2.3.0.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\xmlbeans-2.3.0.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\log4j-1.2.13.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\ojdbc14.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\poi-3.9-20121203.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\lib\poi-ooxml-3.9-20121203.jar;F:\WorkSpace\Poi9\WebRoot\WEB-INF\classes\ -Xms1024m -Xmx3064m poi.LocalTest/jndd/src/com/jndd/servlets/excelinfo/SheetCircuitStatistics.java
时间大概用了三个小时跑完。写的程序也要简练,PreparedStatement、ResultSet用完就关闭。上网查了一下说是处理这种大批量的数量,poi提供了一个类叫:SXSSFWorkbook ,但是这个文件只负责写,读数据处理数据还是不行。
总之,看下我的程序:
package poi;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;import java.sql.Connection;import java.sql.DriverManager;import java.sql.PreparedStatement;import java.sql.ResultSet;import java.sql.SQLException;import org.apache.log4j.Logger;import org.apache.poi.ss.usermodel.Cell;import org.apache.poi.ss.usermodel.Row;import org.apache.poi.ss.usermodel.Sheet;import org.apache.poi.xssf.streaming.SXSSFSheet;import org.apache.poi.xssf.streaming.SXSSFWorkbook;import org.apache.poi.xssf.usermodel.XSSFCell;import org.apache.poi.xssf.usermodel.XSSFRow;import org.apache.poi.xssf.usermodel.XSSFSheet;import org.apache.poi.xssf.usermodel.XSSFWorkbook;public class LocalTest { private static Logger log = Logger.getLogger(LocalTest.class.getName()); public static void main(String[] args) { try { File file = new File("E:\\20160530-All\\0608-10w-11.xlsx"); log.info("*****************************(开始)*************************************"); getAndSetData(file, 1); log.info("*****************************(结束)*************************************"); } catch (Exception e) { e.printStackTrace(); } } public static void getAndSetData(File file, int ignoreRows) throws FileNotFoundException, IOException { Connection conn = null; PreparedStatement stSel = null; ResultSet rsSel = null; try { FileInputStream fis = new FileInputStream(file); log.info("---------------------XSSFWorkbook-----start"); XSSFWorkbook hssfworkbook = new XSSFWorkbook(fis); if (hssfworkbook != null) { XSSFSheet st = hssfworkbook.getSheetAt(0); log.info("----------------------SXSSFWorkbook---"); conn = getConnection(); conn.setAutoCommit(false); for (int rowIndex = ignoreRows; rowIndex <= st.getLastRowNum(); rowIndex++) { XSSFRow row = st.getRow(rowIndex); if (row == null) { continue; } XSSFCell yesOrNo_1 = row.getCell(16); // 是否派过故障单 if (yesOrNo_1 == null) { yesOrNo_1 = row.createCell(16); } XSSFCell m = row.getCell(17); // 月份 if (m == null) { m = row.createCell(17); } String yesOrNo = getValue(yesOrNo_1); if (yesOrNo == null && "".equals(yesOrNo)) { continue; } if("是".equals(yesOrNo)){ XSSFCell cellTelNO = row.getCell(15);//电话号码 String strTelNO = getValue(cellTelNO); if(strTelNO!=null && !"".equals(strTelNO)){ log.info(strTelNO+"------------strTelNO--yes-----------row:"+rowIndex); String sqlSelect = "select to_char(b.accept_time, 'mm') month, count(*) count from balk_basic b where b.balk_phone='"+strTelNO+"' and b.accept_time between to_date('2016-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and to_date('2016-05-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss') group by to_char(b.accept_time, 'mm')"; stSel = conn.prepareStatement(sqlSelect); rsSel = stSel.executeQuery(); StringBuffer buffer= new StringBuffer(); while(rsSel.next()) { String month = rsSel.getString("month"); int selCount = rsSel.getInt("count"); buffer.append(month+"月数量:"+selCount+" "); } if (buffer.toString() !=null && !"".equals(buffer.toString())) { log.info(buffer); m.setCellValue(buffer.toString()); } } else{ XSSFCell bl_login = row.getCell(14);//宽带 String lan = getValue(bl_login); log.info("====="+lan+"-lan------------yes-----------row:"+rowIndex); if (lan != null && !"".equals(lan)) { String sqlSelect ="select to_char(b.accept_time, 'mm') month, count(*) count from balk_basic b,prod_broad_lan t where b.balk_no=t.balk_no and t.bl_login_name =? and b.accept_time between to_date('2016-01-01 00:00:00', 'yyyy-mm-dd hh24:mi:ss') and to_date('2016-05-31 23:59:59', 'yyyy-mm-dd hh24:mi:ss') group by to_char(b.accept_time, 'mm')"; stSel = conn.prepareStatement(sqlSelect); stSel.setString(1,lan); rsSel = stSel.executeQuery(); StringBuffer buffer= new StringBuffer(); while(rsSel.next()){ String month = rsSel.getString("month"); int selCount = rsSel.getInt("count"); buffer.append(month+"月数量:"+selCount+" "); } if (buffer.toString() !=null && !"".equals(buffer.toString())) { log.info(buffer); m.setCellValue(buffer.toString()); } } } if (rsSel != null) rsSel.close(); if (stSel != null) stSel.close(); } } conn.commit(); SXSSFWorkbook sxw = new SXSSFWorkbook(hssfworkbook,10000); fis.close(); FileOutputStream out = new FileOutputStream( "E:\\20160530-All\\0608-10w-11-ok.xlsx"); sxw.write(out); out.close(); } } catch (Exception ex) { log.fatal("", ex); ex.printStackTrace(); try { conn.rollback(); } catch (Exception dbex) { } } finally { try { if (rsSel != null) rsSel.close(); if (stSel != null) stSel.close(); if (conn != null) conn.close(); } catch (SQLException sex) { } } } public static String getValue(XSSFCell cell){ String cellvalue = ""; if (cell!=null) { switch (cell.getCellType()) { case XSSFCell.CELL_TYPE_BOOLEAN: cellvalue = String.valueOf(cell.getBooleanCellValue()); break; case XSSFCell.CELL_TYPE_NUMERIC: cellvalue = String.valueOf(cell.getNumericCellValue()); break; case XSSFCell.CELL_TYPE_STRING: cellvalue = cell.getStringCellValue(); break; case XSSFCell.CELL_TYPE_BLANK: break; case XSSFCell.CELL_TYPE_ERROR: break; case XSSFCell.CELL_TYPE_FORMULA: break; } } else{ return null; } return cellvalue; } public static Connection getConnection() throws Exception { Connection conn = null; String driver = "oracle.jdbc.driver.OracleDriver"; /**************** 生产正式数据库 *******************/// String url = "jdbc:oracle:thin:@132.77.64.240:1521:GKL1"; String url = "jdbc:oracle:thin:@(description=(address_list= (address=(host=132.77.64.202) (protocol=tcp)(port=1522))(address=(host=132.77.64.203)(protocol=tcp) (port=1522)) (load_balance=yes)(failover=yes))(connect_data=(service_name=ifmdb)))";// String user = "ifm";// String pwd = "ifm"; String user = "zonghe"; String pwd = "zonghe2008"; try { Class.forName(driver); conn = DriverManager.getConnection(url, user, pwd); } catch (Exception e) { System.out.println("创建连接出现异常!"); e.printStackTrace(); conn = null; throw e; } return conn; }}
0 0
- poi9处理excel中的百万条数据
- load data infile将excel文件中的数百万条数据在1分钟内导入数据库
- load data infile将excel文件中的数百万条数据在1分钟内导入数据库
- 百万条数据分页
- 百万条数据分页
- 百万条数据分页
- 如何快速更新数据库中的百万条数据
- 百万条数据批量导入
- 百万条数据查询优化
- 查询百万级条数据
- 百万数据分批导出excel
- 百万数据导出到Excel
- Java一次导出百万条数据生成excel(web操作)
- 如何处理百万级别数据
- 百万计数据数据库处理
- 百万数据秒级处理
- 百万条数据生成比较 快慢
- thinkphp5-循环插入百万条数据
- C# WinForm捕获全局异常
- OpenCV_(5):core组件常用函数
- WordPress主题 Tob 自适应响应式小清新无限加载图片主题[更新v0.3]
- Linux 网桥配置命令:brctl
- js 脚本去除 空格 回车 换行
- poi9处理excel中的百万条数据
- c# 复制文件夹中的所有文件夹与文件到另一个文件夹
- 在Linux CentOS 6.6上安装Python 2.7.9
- Get to know docker
- LeetCode357. Count Numbers with Unique Digits
- C#移动文件夹中的所有文件夹与文件到另一个文件夹
- c#删除指定目录下所有内容
- [小技巧] 网易邮箱收到的邮件乱码怎么办?
- 老大布置的作业中遇到的问题,然后解决的思路