POI實現excel匯入
阿新 • • 發佈:2019-01-08
- 在很多地方,我們需要將資料多條資料新增到資料庫,那麼這個時候,如果實現了excel資料匯入到資料庫,我們的工作將會輕鬆很多,接下來我就給大家提供一個簡單的POI匯入excel資料到資料庫,並且判斷匯入的資料是否存在於資料庫,存在匯入失敗,否則,成功;
- 上傳之前先對資料進行處理
$('#btnSub').click(function(){
//會計科目這個是easyuitree設計,所以獲得當前的id寫法不同;
var kjkm =$('#newkjkmTree').tree('getSelected');
if(kjkm){
kjkm = $('#newkjkmTree' ).tree('getSelected').id;
}else{
alert("請選擇會計科目");
return false;
}
var unit = $('#getUnit').val();
if(unit ==""){
alert("請選擇計量單位");
return false;
}
var fileDir = $("#uploadExcel").val();
var suffix = fileDir.substr(fileDir.lastIndexOf("." ));
if("" == fileDir){
alert("選擇需要匯入的Excel檔案!");
return false;
} if( ".xlsx" != suffix ){
alert("選擇.xlsx格式的檔案匯入!");
return false;
}
$("#importForm").submit();
})
- 驗證檔案並上傳後,這時候需要後臺對接收到是excel資料進行處理:
public class ImportExcelUtil {
private final static String excel2003L =".xls"; //2003- 版本的excel
private final static String excel2007U =".xlsx"; //2007+ 版本的excel
/**
* 描述:獲取IO流中的資料,組裝成List<List<Object>>物件
* @param in,fileName
* @return
* @throws IOException
*/
public List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
List<List<Object>> list = null;
//建立Excel工作薄
Workbook work = this.getWorkbook(in,fileName);
if(null == work){
throw new Exception("建立Excel工作薄為空!");
}
Sheet sheet = null;
Row row = null;
Cell cell = null;
list = new ArrayList<List<Object>>();
//遍歷Excel中所有的sheet
for (int i = 0; i < work.getNumberOfSheets(); i++) {
sheet = work.getSheetAt(i);
if(sheet==null){continue;}
//遍歷當前sheet中的所有行
for (int j = sheet.getFirstRowNum(); j < sheet.getLastRowNum(); j++) {
row = sheet.getRow(j);
if(row==null||row.getFirstCellNum()==j){continue;}
//遍歷所有的列
List<Object> li = new ArrayList<Object>();
for (int y = row.getFirstCellNum(); y < row.getLastCellNum(); y++) {
cell = row.getCell(y);
li.add(this.getCellValue(cell));
}
list.add(li);
}
}
return list;
}
/**
* 描述:根據檔案字尾,自適應上傳檔案的版本
* @param inStr,fileName
* @return
* @throws Exception
*/
public Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
Workbook wb = null;
String fileType = fileName.substring(fileName.lastIndexOf("."));
if(excel2003L.equals(fileType)){
wb = new HSSFWorkbook(inStr); //2003-
}else if(excel2007U.equals(fileType)){
wb = new XSSFWorkbook(inStr); //2007+
}else{
throw new Exception("解析的檔案格式有誤!");
}
return wb;
}
/**
* 描述:對錶格中數值進行格式化
* @param cell
* @return
*/
@SuppressWarnings("unused")
public Object getCellValue(Cell cell){
String strCell = "";
switch (cell.getCellType()) {
case XSSFCell.CELL_TYPE_STRING:
strCell = cell.getStringCellValue();
break;
case XSSFCell.CELL_TYPE_NUMERIC:
if (XSSFDateUtil.isCellDateFormatted(cell)) {
// 如果是date型別則 ,獲取該cell的date值
strCell = new SimpleDateFormat("yyyy-MM-dd").format(XSSFDateUtil.getJavaDate(cell.getNumericCellValue()));
} else { // 純數字
strCell = String.valueOf(cell.getNumericCellValue());
DecimalFormat df = new DecimalFormat("#.#########");
strCell=df.format(Double.valueOf(strCell));
}
break;
case XSSFCell.CELL_TYPE_BOOLEAN:
strCell = String.valueOf(cell.getBooleanCellValue());
break;
case XSSFCell.CELL_TYPE_BLANK:
strCell = "";
break;
case XSSFCell.CELL_TYPE_FORMULA:
strCell = String.valueOf(cell.getNumericCellValue());
DecimalFormat df = new DecimalFormat("#.#########");
strCell=df.format(Double.valueOf(strCell));
break;
default:
strCell = "";
break;
}
if (strCell.equals("") || strCell == null) {
return "";
}
if (cell == null) {
return "";
}
return strCell;
}
public static class XSSFDateUtil extends DateUtil {
protected static int absoluteDay(Calendar cal, boolean use1904windowing) {
return DateUtil.absoluteDay(cal, use1904windowing);
}
}
}
- 以上就是處理excel資料的工具類,接下來我們需要在控制層對資料進行處理:
@RequestMapping("importEcxel.do")
public ModelAndView importExcel(HttpServletRequest request,HttpServletResponse response,HttpSession session,
String kjkm,Model model,Integer unit) throws Exception{
MultipartHttpServletRequest multRequest = (MultipartHttpServletRequest) request;
MultipartFile file = multRequest.getFile("uploadExcel"); //獲得上傳的excel檔案;
if(file.isEmpty()){
throw new Exception("檔案不存在!");
}
InputStream in =null; //建立輸入流;
List<List<Object>> listob = null;
in = file.getInputStream();
listob = new ImportExcelUtil().getBankListByExcel(in,file.getOriginalFilename()); //這個時候將獲得的excel檔案進行處理;
in.close();
List<WyFeePlanPO> list = new ArrayList<WyFeePlanPO>();
String kjkmName = planService.findWyFeePlanPOByKJKM(kjkm);//這裡是將獲得的中文描述轉化為資料庫中對應的字串;
int number = 0;
//此處開始對資料進行遍歷,並新增的list中;
for (int i = 0; i < listob.size(); i++) {
List<Object> lo = listob.get(i);
WyFeePlanPO planPo = new WyFeePlanPO();
if (kjkmName!=null) {
if (lo.get(0).equals("")) {
break;//當獲得的資料第一格為空的時候跳出當前迴圈,結束遍歷;
} else {
planPo.setOwner_name(String.valueOf(lo.get(0)));
}
if (!lo.get(1).equals("")) {
if(StringUtil.isNotEmpty(String.valueOf(lo.get(1)))){
planPo.setResidence_code(RoomCodeDATAUtils.getInRoomNum(String.valueOf(lo.get(1)))); //此處對資源號進行處理,根據各自上傳的excel欄位需求來進行遍歷;
}
}else {
planPo.setResidence_code("");
}
if (!lo.get(2).equals("")) {
String startUnit = String.valueOf(lo.get(2));
int start = Integer.parseInt(startUnit);
planPo.setStart_dosage(start);
} else {
planPo.setStart_dosage(0);
}
if (!lo.get(3).equals("")) {
String endUnit = String.valueOf(lo.get(3));
int end = Integer.parseInt(endUnit);
planPo.setEnd_dosage(end);
} else {
planPo.setEnd_dosage(0);
}
if (!lo.get(4).equals("")) {
String sjyl = String.valueOf(lo.get(4));
int SJ = Integer.parseInt(sjyl);
planPo.setActual_dosage(SJ);
} else {
planPo.setActual_dosage(0);
}
if (!lo.get(5).equals("")) {
planPo.setPay_company(String.valueOf(lo.get(5)));
}else {
planPo.setPay_company("");
}
Date recordDate = null;
if (!lo.get(6).equals("")) {
SimpleDateFormat sdf = new SimpleDateFormat(
"yyyy-MM-dd");
String recordTime = String.valueOf(lo.get(6));
recordDate = sdf.parse(recordTime);
planPo.setRecordTime(recordDate);
}else {
planPo.setRecordTime(new Date());
}
if (!lo.get(7).equals("")) {
String write_persion = String.valueOf(lo.get(7));
planPo.setWrite_persion(write_persion);
}else {
planPo.setWrite_persion("");
}
planPo.setKjkm(kjkm);
planPo.setUnit(unit);
String residence_code = String.valueOf(lo.get(1));
costDetailService.calculateWyFeePlanPO(planPo);//此處是呼叫方法計算費用;需求不同,則不需要;
if(StringUtil.isNotEmpty(residence_code)){
planPo.setResidence_code(RoomCodeDATAUtils.getInRoomNum(residence_code));
}
int residenceCodeCount = planService.findCodeCountByCodition(planPo.getResidence_code());//此處是查詢業主列表中是否存在該房號;根據需求做處理;
if (residenceCodeCount>0) {
String owner_name = planPo.getOwner_name();
int sjyl = planPo.getActual_dosage();
unit = planPo.getUnit();
Double collection_fee = planPo.getAmount();
String pay_company = planPo.getPay_company();
int count = planService.findPlanCountByCodition(
owner_name, sjyl, collection_fee,
pay_company, residence_code, recordDate);
if (count > 0) {
planPo.setState(1);
planPo.setKjkm_name(kjkmName);
planPo.setUnit(unit);
} else {
planPo.setState(0);
planPo.setKjkm_name(kjkmName);
planPo.setUnit(unit);
}
}else {
planPo.setState(1);
planPo.setRemark("資源號不存在,請重新輸入");
}
number +=1;
}
list.add(planPo);
}
Map<String, Object> map = new HashMap<String, Object>();
User user = currentUser(request);
Integer role = user.getRoleId();
WyFeePlanPO planPonum = new WyFeePlanPO();
planPonum.setNumber(number);
session.setAttribute("list", list);
model.addAttribute("planPonum", planPonum);
map.put("role",role);
return new ModelAndView( "crm/wyfee/wyfeeplancheck",map);
}//將資料處理好之後,將放到新的頁面進行預覽;
- 這時候我們將處理後的資料拿到顯示到頁面上;
@RequestMapping("importShow.do")
public void importShow(HttpServletRequest request,HttpServletResponse response) throws Exception{
@SuppressWarnings("unchecked")
List<WyFeePlanPO> list = (List<WyFeePlanPO>) request.getSession().getAttribute("list");
List<WyFeePlanVO> wyFeePlan = planService.showPlanPOsVo(list);
ResponseUtil.responseJson(response, wyFeePlan);
}
- 圖書已經看到了資料的處理,接下來就是需要將其匯入到資料庫了
@RequestMapping("importToServer.do")
public void importToServer(HttpServletRequest request,HttpServletResponse response,Model model){
@SuppressWarnings("unchecked")
List<WyFeePlanPO> list = (List<WyFeePlanPO>) request.getSession().getAttribute("list");
String userPin = cookieUtil.getCookieValueByName(request, CookieConstants.SYS_USER_PIN);
int amount = 0;
for (WyFeePlanPO wyFeePlanPO : list) {
if (wyFeePlanPO.getRemark()!=null) {
wyFeePlanPO.setState(1);
wyFeePlanPO.setRemark(wyFeePlanPO.getRemark());
}else {
int count = planService.findPlanCountByCodition(wyFeePlanPO.getOwner_name(), wyFeePlanPO.getActual_dosage(),
wyFeePlanPO.getAmount(),wyFeePlanPO.getPay_company(),wyFeePlanPO.getResidence_code(),
wyFeePlanPO.getRecordTime());
//此處又是對資料進行查重處理;
if (count > 0) {
wyFeePlanPO.setState(1);
String remark = "匯入失敗,資料已存在";
wyFeePlanPO.setRemark(remark);
} else {
String remark = "匯入成功";
wyFeePlanPO.setState(0);
wyFeePlanPO.setRemark(remark);
//獲取訂單編號
SnowflakeIdWorker snowfalake=SnowflakeIdWorker.getInstance();
long order_no=snowfalake.nextId();
wyFeePlanPO.setOrder_no(String.valueOf(order_no));
wyFeePlanPO.setCreateBy(userPin);
wyFeePlanPO.setModifyBy(userPin);
planService.handlewyfeePlanPo(wyFeePlanPO);
amount+=1;//這裡是對匯入成功的資料做一個記錄數
}
}
}
WyFeePlanPO wyFeePlanPO = new WyFeePlanPO();
wyFeePlanPO.setNumber(amount);
ResponseUtil.responseJson(response, wyFeePlanPO);
}
- 那麼到以上部分,POI對excel的匯入基本上就完成了,此處又涉及到多資料判斷的sql的書寫格式也一併附上:
<select id="findPlanCountByCodition" parameterType="com.bckj.crm.wyfee.domain.po.WyFeePlanPO"
resultType="java.lang.Integer">
select count(*) from crm_wy_fee_plan where owner_name=#{0} and actual_dosage=#{1} and
amount=#{2}
and pay_company=#{3} and residence_code=#{4} and recordTime=#{5}
</select>
- 以上就是對POI匯入excel的全部描述,不管是匯入還是匯出,我都做了詳細的程式碼演示,希望對大家有所幫助;當然藥品那個POI做匯入匯出還是需要這些jar包:poi-3.9.jar ; poi-ooxml-3.9.jar ; poi-ooxml-schemas-3.9.jar ; xmlbeans-2.6.0jar ; dom4j-1.6.1jar ;具體哪些是匯入需要的 ,哪些的匯出需要的,記不清了,那就都一起把,反正都需要用。