日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

利用zui上传excel文件,并通过java后台读取excel中的内容

發布時間:2023/12/16 编程问答 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 利用zui上传excel文件,并通过java后台读取excel中的内容 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

上傳excel文件,并且利用java代碼讀取excel文件內容

1.html代碼:

<div id="app" style="padding: 10px;margin-top: 50px;"><form class="form-horizontal" id="form1"><div id='uploader' class="uploader"><div class="uploader-message text-center"><div class="content"></div><button type="button" class="close">×</button></div><div class="uploader-files file-list file-list-lg" data-drag-placeholder="請拖拽文件到此處"></div><div class="uploader-actions"><div class="uploader-status pull-right text-muted"></div><button type="button" class="btn btn-link uploader-btn-browse"><i class="icon icon-plus"></i> 選擇文件</button><button type="button" class="btn btn-link uploader-btn-start"><i class="icon icon-cloud-upload"></i> 開始上傳</button></div></div><input type="hidden" id="task_id" name="task_id" :value="task_id"></form><div class="alert alert-success with-icon tsxx" style="display: none;"><i class="icon-ok-sign"></i><div class="content"><h4>導入成功</h4><hr><strong>{{msg}}</strong></div></div></div>

可選擇拖拽或者點擊上傳的方式上傳excel文件,本次上傳可支持xls文件和xlsx文件格式.

var url = xxx;//這里是調用后端執行讀取excel文件的url地址(controller)var options = {headers : {'Uuid': generateUUID(),'Authorization' : sessionStorage.getItem("token")},url : url,lang : 'zh_cn',filters: {mime_types: [{title: '表格', extensions: 'xls,xlsx'}]},// autoResetFails:true,chunk_size : 0,limitFilesCount : 1,multipart_params:{//此處是后端頁面需要的參數的位置//task_id : app.task_id,},onUploadFile : function() {if (this.plupload.state != 1) {$("#main_loading").show();}},onFileUploaded : function(file, responseObject) {if (responseObject.status == '200') {var json = responseObject.response;var obj = JSON.parse(json);console.log(JSON.stringify(responseObject));//導入結果的顯示問題if (obj.code == '-1') {new $.zui.Messager(obj.msg, {icon : 'remove-sign',placement : 'center', // 定義顯示位置type : 'info',time : 20000}).show();} else if (obj.code == '0') {//導入成功//構造提示信息區域, 用于展示, 如果本次導入并沒有完全匹配成功, 需要提供錯誤信息下載, 用于更改, 下次再次導入$("#uploader").hide();app.msg = obj.data.msg;$(".tsxx").show();}}$("#main_loading").hide();}};

其中可以根據自定義過濾條件展示出上傳多少條,成功多少條,失敗多少條數據.

2.后端解析excel文件

根據前端地址來后controller

@RequestMapping("/import/excel")public JsonData importForExcel(@RequestHeader(name="Authorization") String token, @RequestParam("file") MultipartFile file,HttpServletResponse response, HttpServletRequest request ) {response.addHeader("Access-Control-Allow-Origin", "*");User user = userService.getLoginUser(request);//獲取到當前用戶信息return xxxService.importForExcel(user,file);//導入數據}

根據個人需求添加參數(從前端帶過來的)
到service層的方法:

public JsonData importForExcel(User user, MultipartFile file) {Map map_rtn = new HashMap();String msg = "";List<String> name = new ArrayList<String>(); List<Map> list_data = new ArrayList<Map>(); //獲取主表Map<String,String> xxx= xxxMapper.selectByTaskIdAndCjdw(xxx);int rtn_code = 0;try {//一、解析excel數據Map rtn_map = getDataFromExcel(user, file,xxx);//需要定義解析方法//System.out.println("rtn_map:"+rtn_map);String file_code = ConverterUtils.nullToStr(rtn_map.get("file_code"));String list_size = ConverterUtils.nullToStr(rtn_map.get("list_size"));String err_str = ConverterUtils.nullToStr(rtn_map.get("err_str"));if("1".equals(file_code)) {rtn_code = -1;msg = err_str;} else {List<Map> list_hang = (List<Map>) rtn_map.get("list_hang");boolean flag = saveDataFromExcel(user,xxx,ysb);//定義把讀取數據保存到數據庫的方法if(flag) {msg = "導入成功:總共" + list_size + "行數據,導入成功" +list_hang.size()+ "條";}}} catch (Exception e) {e.printStackTrace();return JsonData.buildError("請求失敗! + Exception: " + e);}if(rtn_code == -1) {return JsonData.buildError(msg);} else {return JsonData.buildSuccess(msg,rtn_code);}}

定義解析excel文件的方法,此方法可解析xls和xlsx文件格式,方法比較復雜,但是比較全面.需要導入poi包,例如:import org.apache.poi.ss.usermodel.Workbook;
下面是解析excel的方法(重點)

public Map getDataFromExcel(User user, MultipartFile file, xxx) throws BiffException, IOException {long t1 = System.currentTimeMillis();String err_str = "";int notAddNum = 0;Map rtn_map = new HashMap();Workbook workbook = getWorkBook(file);//獲取大年層級單位下所有的預算科目Map map_param = new HashMap();map_param.put("gkdw_bm", "");List<Map<String,String>> list_yskm = selectListOrderByPbm(user,map_param);//獲取所有該任務涉及的部門List<Map> list_dept = selectForBbSbDwByTaskId(task_id);//保存所有的列數據List<Map> list_lm = new ArrayList<Map>();//保存所有的行數庫List<Map> list_hang = new ArrayList<Map>();if(workbook != null) {for (int sheetNum = 0; sheetNum < workbook.getNumberOfSheets(); sheetNum++) {//獲得當前sheet工作表Sheet sheet = workbook.getSheetAt(sheetNum);if (sheet == null) {continue;}//獲得當前sheet的開始行int firstRowNum = sheet.getFirstRowNum();//獲得當前sheet的結束行int lastRowNum = sheet.getLastRowNum();System.err.println("lastRowNum::"+lastRowNum);//循環除了所有行,如果要循環除第一行以外的就firstRowNum+1for (int rowNum = firstRowNum ; rowNum <=lastRowNum ; rowNum++) {//獲得當前行Row row = sheet.getRow(rowNum);if (row == null) {continue;}//獲得當前行的開始列int firstCellNum = row.getFirstCellNum();//獲得當前行的列數int lastCellNum = row.getLastCellNum();//每行有多少列if (lastCellNum > 0) {//第二行,第一行為標題,不需要判斷if(rowNum == 1) {//循環當前行for (int cellNum = 4; cellNum < lastCellNum; cellNum++) {//此處只需要每行的第4列及后面,前面的則不需要獲取Cell cell = row.getCell(cellNum);//獲取內容String xxx= getCellValue(cell).trim().replace("*", "");//查看每一列是否符合數據庫的匹配項boolean flag = false;for(int i_dept = 0 ; i_dept < list_dept.size() ; i_dept ++ ) {Map map_dept = (HashMap) list_dept.get(i_dept);if(ConverterUtils.nullToStr(map_dept.get("DEPT_MC")).contains(dept_mc)) {map_dept.put("COL", cellNum);list_lm.add(map_dept);flag = true;}}if(!flag) {err_str += ",第" + (cellNum + 1) + "列(" + dept_mc + ")";}}if(!"".equals(err_str)) {rtn_map.put("file_code", "1");rtn_map.put("err_str", "提示消息");return rtn_map;}long t2 = System.currentTimeMillis();System.out.println("TIME_1:"+(t2 - t1));}else if(rowNum > 2) {//第2行結束第3行為合計行,不作處理//判斷當前列是否有效int pxh = 0;String yskm_bm = "",isleaf = "",lx = "",yskm_id = "";Cell cell = row.getCell(0);String yskm_name = getCellValue(cell).trim();Map map_row = new HashMap();for(Map m : list_yskm) {String name_ys = ( m.get("QC") == null || "".equals(ConverterUtils.nullToStr(m.get("QC"))) ? ConverterUtils.nullToStr(m.get("MC")) : ConverterUtils.nullToStr(m.get("QC")) + "/" + ConverterUtils.nullToStr(m.get("MC")) ); if(yskm_name.equals(name_ys)) {yskm_id = ConverterUtils.nullToStr(m.get("ID"));}}if("".equals(isleaf) || "".equals(yskm_bm) || "".equals(yskm_id)) {++notAddNum;err_str += ",第"+(rowNum + 1)+"行("+yskm_name+")不存在";} else {if("0".equals(isleaf)) {++notAddNum;} else {for(Map lm : list_lm) {map_row = new HashMap();String index_col = ConverterUtils.nullToStr(lm.get("COL"));cell = row.getCell(Integer.parseInt(index_col));double l_value2 = cell.getNumericCellValue();//根據EXCEL內容化獲取數據值String reg_num0 = "^(?!0+\\.00)(?=.{1,9}(\\.|$))(?!0(?!\\.))\\d{1,3}(,\\d{3})*(\\.\\d+)?$";String reg_num1 = "^0.{0,1}[0]*$";String l_value = ConverterUtils.nullToStr(l_value2);if(l_value.matches(reg_num0)) {l_value = l_value.replaceAll(",", "").replace(",", "").replace(",", "");}if(!l_value.matches(reg_num1) && !"".equals(l_value)) {map_row.put("PXH",""+ (++pxh));map_row.put("DEPT_ID", ConverterUtils.nullToStr(lm.get("DEPT_BM")).trim());map_row.put("DEPT_MC", ConverterUtils.nullToStr(lm.get("DEPT_MC")).trim());if(l_value.trim() == null) {map_row.put("JE", 0);}else {map_row.put("JE", l_value.trim());}if(yskm_name.contains("培訓費")) {map_row.put("ZFY", l_value.trim());}list_hang.add(map_row);}}}}}}}}}rtn_map.put("file_code", "0");Sheet sheet = workbook.getSheetAt(0);rtn_map.put("list_size", sheet.getLastRowNum() - ( notAddNum + 3 ));//數據總行數rtn_map.put("list_hang", list_hang);//數據rtn_map.put("err_str", "".equals(err_str) ? "" : err_str.substring(1) );//錯誤數據信息//System.out.println("rtn_map:"+rtn_map.toString());long t2 = System.currentTimeMillis();System.out.println((t2 - t1));return rtn_map;}

上面是解析excel的主要方法,中間定義了需要過濾條件,下面是各種判斷方法

/*** xls,xlsx文件上傳判斷* @param file* @return* @author ls*/public static Workbook getWorkBook(MultipartFile file) {System.err.println("判斷");//獲得文件名String fileName = file.getOriginalFilename();//創建Workbook工作薄對象,表示整個excelWorkbook workbook = null;try {//獲取excel文件的io流InputStream is = file.getInputStream();//根據文件后綴名不同(xls和xlsx)獲得不同的Workbook實現類對象if (fileName.endsWith("xls")) {//2003workbook = new HSSFWorkbook(is);} else if (fileName.endsWith("xlsx")) {//2007 及2007以上workbook = new XSSFWorkbook(is);}} catch (IOException e) {e.getMessage();System.err.println("錯誤::"+e.getMessage());}System.err.println("結束return:"+workbook);return workbook;} /*** 判斷單元格的數據類型* @param cell* @return*/public static String getCellValue(Cell cell) {String cellValue = "";if (cell == null) {return cellValue;}//判斷數據的類型//判斷數據的類型switch (cell.getCellTypeEnum()) {case NUMERIC: //數字cellValue = stringDateProcess(cell);break;case STRING: //字符串cellValue = String.valueOf(cell.getStringCellValue());break;case BOOLEAN: //BooleancellValue = String.valueOf(cell.getBooleanCellValue());break;case FORMULA: //公式cellValue = String.valueOf(cell.getCellFormula());break;case BLANK: //空值cellValue = "";break;case ERROR: //故障cellValue = "非法字符";break;default:cellValue = "未知類型";break;}return cellValue;} public static String stringDateProcess(Cell cell) {String result = new String();if (HSSFDateUtil.isCellDateFormatted(cell)) {// 處理日期格式、時間格式SimpleDateFormat sdf = null;if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {sdf = new SimpleDateFormat("HH:mm");} else {// 日期sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");}Date date = cell.getDateCellValue();result = sdf.format(date);} else if (cell.getCellStyle().getDataFormat() == 58) {// 處理自定義日期格式:m月d日(通過判斷單元格的格式id解決,id的值是58)SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");double value = cell.getNumericCellValue();Date date = org.apache.poi.ss.usermodel.DateUtil.getJavaDate(value);result = sdf.format(date);} else {double value = cell.getNumericCellValue();CellStyle style = cell.getCellStyle();DecimalFormat format = new DecimalFormat();String temp = style.getDataFormatString();// 單元格設置成常規if (temp.equals("General")) {format.applyPattern("#");}result = format.format(value);}return result;}

如果單元格中有計算函數則需要用到getNumericCellValue()方法,此方法為獲取單元格計算后的數值,例如單元格A3=A1+A2,A1為1,A2為2,獲取到A3的數據為’1+2’,把該數據插入到數據庫不符合常理,如果格式不對也會報錯,使用改方法會自動計算1+2.
double l_value2 = cell.getNumericCellValue();
現在以上代碼基本上可以解決所有數據問題,根據業務邏輯進行判斷修改即可.

3.jxl包下導入xls格式excel文件

此方法使用起來比較簡單,但是jxl包下工具類不支持上傳xlsx文件.html頁面還是以前的頁面,controller不變,只需要改變解析excel主方法,判斷方法也不需要.
service代碼:

@Transactionalprivate List<Map> getNsrxxFromExcel(User user, MultipartFile file) throws Exception {//根據需要添加參數//file.getInputStream();//獲取輸入流//需要做基礎檢測List<Map> datas = new ArrayList<Map>();WorkbookSettings setting = new WorkbookSettings();setting.setEncoding("GBK");Workbook rwb = Workbook.getWorkbook(file.getInputStream(), setting);Sheet[] sheet = rwb.getSheets();JSONObject json = null;Map yjrw = null;Map titles = new HashMap();//所有的標題Sheet rs = rwb.getSheet(0);if(!"導入模板".equals(rs.getName())) {for(Sheet s : sheet) {if("導入模板".equals(s.getName())) {rs = s;break;}}}if(!"導入模板".equals(rs.getName())) {throw new Exception("xxx提示消息");//此處邏輯我們定義了模板,如果不是該模板則報錯!}for (int j = 0; j < rs.getRows(); j++) {Cell[] cells = rs.getRow(j);//列if(j == 0) {continue;}if(j == 1) {//第一行需要記錄自定義字段if(cells.length < 13 || cells[0] == null || !"xxx".equals(cells[0].getContents().trim())) {//列數少于13列, 不是我們要的excel數據, 亂導入的數據.應該立馬提示導入的excel數據非法.throw new Exception("xxx提示消息");//自定義需求}//開始獲取需要的自定義內容了....int maxIndex = 0;//11if("錯誤信息".equals(cells[cells.length - 1].getContents())) {//我們提供的錯誤數據列maxIndex = cells.length - 1;} else {maxIndex = cells.length;}for(int i = 11; i < maxIndex; i ++) {titles.put(i, cells[i].getContents());}continue;}yjrw = new HashMap<>();//根據需求放入String msg = "";//yjrw.put("drzt", "1");SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");for(int k = 0; k < cells.length; k++) {//讀取所有數據System.err.println(cells);String txsxId = PrimaryKeyDependent.nextKey();//提醒事項idyjrw.put("txsxid", txsxId);String val = cells[k].getContents().trim();json = new JSONObject();switch (k) {case 0: //djxhStrif(val.length() > MAX_LENGTH_DJXH) {//需求邏輯判斷msg+="XXX長度不能不能超過最大長度"+MAX_LENGTH_XXX+"位###";String djxh = val.toString().substring(0, 20);yjrw.put("djxh",djxh);yjrw.put("drzt", "0");}else {yjrw.put("djxh", ConverterUtils.nullToStr(val));}break;if("".equals(ConverterUtils.toString(yjrw.get("djxh"))) && "".equals(ConverterUtils.toString(yjrw.get("nsrsbh"))) && "".equals(ConverterUtils.toString(yjrw.get("nsrmc")))&& "".equals(ConverterUtils.toString(yjrw.get("sklx")))&& "".equals(ConverterUtils.toString(yjrw.get("xxms")))){continue;} // if("".equals(yjrw.get("djxh")) && "".equals(yjrw.get("nsrsbh")) && "".equals(yjrw.get("nsrmc"))) { // msg+="【XXX】至少填寫一項###"; // }if("".equals(yjrw.get("skssqq"))) {SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Date date = new Date();String ssqq = sdf.format(date);yjrw.put("skssqq", ssqq);}datas.add(yjrw);System.err.println(datas);}return datas;}

該方法獲取excel內容相對簡單容易理解,唯一缺點是不支持xlsx文件格式,兩種方案,根據需求來選擇.

總結

以上是生活随笔為你收集整理的利用zui上传excel文件,并通过java后台读取excel中的内容的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产亚洲精品久久久久久青梅 | 男女无遮挡做爰猛烈视频 | 九九激情网 | 欧美一性一乱一交一视频 | 亚洲九九九 | 日韩 国产 欧美 | 97超碰总站 | 手机看片福利在线 | 久久无码视频一区 | a级片在线观看视频 | 日韩欧美高清在线 | 欧美成人午夜精品免费 | 香蕉久草 | 亚洲丝袜天堂 | 成人h动漫精品一区 | 日韩电影二区 | 亚洲色妞| 91免费版黄 | 国产白嫩美女无套久久 | 狠狠久| 丰满人妻一区二区三区精品高清 | 少妇av片 | 免费成人深夜夜行网站视频 | 欧美91精品久久久久国产性生爱 | 亚洲一区成人 | 成人av高清在线 | 无码播放一区二区三区 | 亚洲色图日韩 | 亚洲一区二区不卡在线观看 | 天天综合网天天综合色 | 人妖和人妖互交性xxxx视频 | 国产美女视频网站 | 免费黄色一级视频 | 亚洲一区视频网站 | 禁网站在线观看免费视频 | 91传媒视频在线观看 | 色哟哟无码精品一区二区三区 | 激情视频在线免费观看 | 91av色| 日韩在线 中文字幕 | www.国产com| 黑人狂躁日本妞hd | 在线看中文字幕 | 欧美成人一二区 | 中文字幕亚洲第一 | 精品在线免费视频 | 日日撸夜夜操 | 欧美黄色片免费看 | 亚洲香蕉在线视频 | 亚洲日本成人在线观看 | 国产麻豆影视 | 一级国产黄色片 | 美女超碰 | 成人国产精品免费观看动漫 | 色视屏| 免费播放黄色片 | 狠狠搞视频 | 我的邻居在线观看 | 香蕉视频免费在线观看 | 91亚洲精品乱码久久久久久蜜桃 | 性做久久久久久久 | 国产无遮挡a片又黄又爽 | 久久精品亚洲精品国产欧美 | 91爱视频 | 91天天射| 香蕉视频免费在线看 | 国产成年人 | 加勒比不卡视频 | 91精品国产综合久久久蜜臀粉嫩 | 中出在线观看 | 日本性视频网站 | 国产第一福利影院 | 噜噜噜精品欧美成人 | 人人干免费 | 亚洲经典在线观看 | 久久不卡 | 精品视频999| 中国少妇高潮 | 在线天堂中文在线资源网 | 波多野结衣视频免费在线观看 | av免播放器在线观看 | 农村寡妇一区二区三区 | 久久久久久久久蜜桃 | 亚洲aaa视频| 在线不卡毛片 | 欧美日韩国产麻豆 | 国模视频一区二区 | 色偷偷在线观看 | 四虎影库| 婷婷在线一区 | av在线首页 | 日韩一区二区高清 | 国产成a人亚洲精v品无码 | av性在线| 欧美 日韩 中文 | 亚洲欧美伊人 | 青青青手机在线视频 | 五十路六十路七十路熟婆 | gav成人|