EXCEL解析匯入,多執行緒批量插入大量資料

2021-10-08 05:13:27 字數 3335 閱讀 9469

excel匯入基本分為3個步驟:

1. 上傳檔案

2. 解析檔案

3. 邏輯內容

首先檢視是哪一步需要優化,一般需要在第3步,插入資料庫的邏輯優化。

如果資料量比較大的話,單條sql執行很慢,幾條資料幾次和資料庫互動。影響執行效率。解決辦法:

1. 批量插入

2. 多執行緒執行

直接貼**,專案例項:

public result importexcel1() );

}int colnum = row.getphysicalnumberofcells();

if (colnum < 9) );

}if (colnum != 9) );

}emmodcnllist emmodcnllist = null;

int rows = sheet.getphysicalnumberofrows();

long btime1 = system.currenttimemillis();

for (int i = 0; i < rows; i++)

/* if()*/

// 獲取當前行的資料

row row2 = sheet.getrow(i);

if (row2.getcell(0) == null && row2.getcell(1) == null && row2.getcell(2) == null && row2.getcell(3) == null

&& row2.getcell(4) == null && row2.getcell(5) == null && row2.getcell(6) == null && row2.getcell(7) == null && row2.getcell(8) == null

) emmodcnllist = new emmodcnllist();

int index = 0;

string value = "";

for (cell cell : row2) else if (cell.getcelltype() == cell.cell_type_string) else

switch (index)

break;

}emmodcnllist.setacpkid(sourceid);

emmodcnllist.setimpdate(new date());

emmodcnllist.setimpman(username);

emmodcnllist.setimpmanid(accountid);

emmodcnllists.add(emmodcnllist);

}int threadsize = 500;

int datasize = emmodcnllists.size();

// 執行緒數

int threadnum = datasize / threadsize + 1;

// 定義標記,過濾threadnum為整數

boolean special = datasize % threadsize == 0;

// 建立乙個執行緒池

executorservice exec = executors.newfixedthreadpool(threadnum);

// 定義乙個任務集合

list> tasks = new arraylist>();

callabletask = null;

listcutlist = null;

system.out.println("mod清單匯入——執行緒開始執行");

// 確定每條執行緒的資料

for (int i = 0; i < threadnum; i++)

cutlist = emmodcnllists.sublist(threadsize * i, datasize);

} else

// system.out.println("第" + (i + 1) + "組:" + cutlist.tostring());

final listliststr = cutlist;

task = new callable()

};// 這裡提交的任務容器列表和返回的future列表存在順序對應的關係

tasks.add(task);

}list> results = exec.invokeall(tasks);

//捕捉異常或者.... 這句話很重要

for (futureres : results)

exec.shutdown();

system.out.println("執行緒任務執行結束");

system.err.println("mod清單匯入——執行任務消耗了 :" + (system.currenttimemillis() - btime1) + "毫秒");

manager.setisok(true);

} catch (exception e) );

} else );

}} finally catch (ioexception e)

}if (instream != null) catch (ioexception e) }}

result = result.buildsuccess();

return result;

}

xml檔案:資料庫oracle

insert  into em_mod_cnl_list(

pkid,

ac_pkid,

mod,

is_anti_mod_of,

has_for_anti_mod,

title,

mp,mscn,

sb,rfc,

ata,

imp_man_id,

imp_man,

imp_date

)select em_mod_cnl_list_seq.nextval,s.* from

(select

#,#,

#,#,

#,#,

#,#,

#,#,

#,#,

#from dual

) s

我的excel只有乙個sheet頁所以沒有優化。如果多個的話可以看著修改一下,把公共的提取出來。如果資料量很多的話,開很多執行緒影響記憶體,可以任務不統一提交,每乙個執行緒執行任務完畢以後就釋放,這裡只用到簡單的,為了省事。

親測可用!親測可用!親測可用!

java批量匯入Excel

util包 public class excelhelp catch exception ex for int numsheet 0 numsheet workbook.getnumberofsheets numsheet 迴圈行row for int rownum 1 rownum sheet.g...

單執行緒與多執行緒解析Excel檔案

因為工作原因要學習多執行緒非同步解析資料我不知道我的操作對不對,突發奇想用多執行緒來解析excel資料,excel資料量不是很大也不是很小二十三萬多條,最後比較解析耗時發現單執行緒居然比多執行緒快。多執行緒使用方法如下 1.建立excelthread類實現callable介面 2.解析方法 publ...

匯入解析excel小結

控制器例子 一.解析excel內容插入到資料庫 vm 注意 解析按鈕必須是標籤,如果換成button,用公司的表單提交則會出錯 提示不是multipartfile請求.js form file bupform url xx.do datatype json onsubmit function ret...