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
原创粉丝点击