POI读取并解析xlsx格式的excel文件
来源:互联网 发布:淘宝上药店正规的吗 编辑:程序博客网 时间:2024/05/15 23:54
本文主要采用POI来解析excel文件。如果需要解析的是支持数据量更大的.xlsx后缀的格式,需要导入的jar包为poi-ooxml-3.15.jar;若是需要解析的是.xls后缀的格式,需要导入的是poi-3.17-beta.jar。jar版本建议采用公司maven库中的最新版。
本文的demo中,解析的是xlsx后缀的excel文件。xls格式的类似,只需要将所有的XSSF开头的都改成HSSF,并稍加改动即可。
上服务器端代码:
/** * @return * @throws Exception * @author jason.gao * 功能描述:交易导入 */@RequestMapping(value = "/transDetail/upload", method = {RequestMethod.POST, RequestMethod.GET})@RequestGuard(perm = "transaction.import.upload")public ResponseEntity<ResponseEnvelope<RestApiResp>> uploadFile(@RequestParam("file") CommonsMultipartFile[] files, HttpServletRequest req, HttpServletResponse resp){logger.info("uploadFile == >upload button start; fileName:[{}], CommonsMultipartFile[]:[{}]", files[0].getFileItem().getName(), files);Long startTime = System.currentTimeMillis();String result = "完成交易文件的导入!";try {for (int i = 0; i < files.length; i++) {//从文件名中获取商户号、商户名称、商户批次号、商户批次序号//String fileName = files[0].getFileItem().getName().replace(".xlsx", "");InputStream is = files[i].getInputStream();XSSFWorkbook xssFWorkbook = new XSSFWorkbook(is);//只处理第一个工作簿中的数据String handleResult = this.handleDetailDate(xssFWorkbook, 0);if (!handleResult.equals(TransImportJobStatus.Success.getValue())) {result = TransImportJobStatus.getDescByKey(handleResult);logger.error(result);}}} catch (CellDataException e ) {logger.error("CellDataException: ErrorCode:[{}], ErrorMessage:[{}]",e.getCode(),e.getMessage());return RestApiResp.getSuccResponseEntity(e.getMessage(), null);} catch (OspException e) {logger.error("OspException:[{}]",e.getMessage());return RestApiResp.getSuccResponseEntity(e.getMessage(), null);} catch (Exception e) {logger.error("未知异常:[{}]",e.getMessage());return RestApiResp.getSuccResponseEntity("未知异常,请排查日志:" + e.getMessage(), null);}logger.info("{},耗时:{}毫秒",result, System.currentTimeMillis()-startTime);return RestApiResp.getSuccResponseEntity(result, null);}public String handleDetailDate(XSSFWorkbook xssFWorkbook, int numSheet) throws CellDataException, OspException{XSSFSheet xssFSheet = xssFWorkbook.getSheetAt(numSheet);if (xssFSheet == null) {return TransImportJobStatus.EmptyData.getValue();}/** * 获取汇总行数据 */TransFileHeadModel transFileHeadModel = getHeadData(xssFSheet);/** * 校验明细行的汇总结果是否符合汇总行 */int realDetailLine = checkDetailSummary(xssFSheet, transFileHeadModel);/** * 分批的去调用OSP接口 */return doOspHandle(xssFSheet, transFileHeadModel, realDetailLine);}private int checkDetailSummary(XSSFSheet xssfSheet, TransFileHeadModel transFileHeadModel) throws CellDataException{int realDetailLine = 0;// 获取当前工作薄的明细行int paymentCount = 0; //支付总笔数BigDecimal paymentAmount = BigDecimal.ZERO; //支付总金额int refundCount = 0; //退款总笔数BigDecimal refundAmount = BigDecimal.ZERO; //退款总金额for (int j = 3; j <= xssfSheet.getLastRowNum() + 1; j++) {XSSFRow xssfRowDetail = xssfSheet.getRow(j);if (xssfRowDetail != null && !xssfRowDetail.getCell(0).toString().equals("")) {//校验该行是否为有效数据String transType;if (xssfRowDetail.getCell(5) == null) {//默认取值为1:支付transType = TransTypeEnums.Payment.getValue();} else {transType = XssfCellValueCheckHelper.getNumber(xssfRowDetail, 5, 0).toString();}if (transType.equals(TransTypeEnums.Payment.getValue())){paymentCount++;paymentAmount = paymentAmount.add(new BigDecimal(XssfCellValueCheckHelper.getNumber(xssfRowDetail, 7, 0)));} else if(transType.equals(TransTypeEnums.Refund.getValue())) {refundCount++;refundAmount = refundAmount.add(new BigDecimal(XssfCellValueCheckHelper.getNumber(xssfRowDetail,7, 0)));} else {throw new CellDataException(TransImpFileExceptEnums.DetailDateError.getValue(), TransImpFileExceptEnums.DetailDateError.setParams(j+1, "交易类型不为“支付或退款”").getDesc());}} else {realDetailLine = j - 1;break;}}if (paymentCount != transFileHeadModel.getPaymentCount()) {throw new CellDataException("汇总行数据中的“支付总笔数”错误:汇总行数据=[" + transFileHeadModel.getPaymentCount() + "],计算数据=[" + paymentCount + "].");}if (paymentAmount.compareTo(transFileHeadModel.getPaymentAmount()) != 0) {throw new CellDataException("汇总行数据中的“支付总金额”错误:汇总行数据=[" + transFileHeadModel.getPaymentAmount() + "],计算数据=[" + paymentAmount + "].");}if (refundCount != transFileHeadModel.getRefundCount()) {throw new CellDataException("汇总行数据中的“退款总笔数”错误:汇总行数据=[" + transFileHeadModel.getRefundCount() + "],计算数据=[" + refundCount + "].");}if (transFileHeadModel.getRefundAmount().compareTo(refundAmount) != 0) {throw new CellDataException("汇总行数据中的“退款总金额”错误:汇总行数据=[" + transFileHeadModel.getRefundAmount() + "],计算数据=[" + refundAmount + "].");}if (transFileHeadModel.getNetCount() != paymentCount - refundCount) {throw new CellDataException("汇总行数据中的“净笔数”错误:汇总行数据=[" + transFileHeadModel.getNetCount() + "],计算数据=[" + (paymentCount - refundCount) + "].");}if (transFileHeadModel.getNetAmount().compareTo(paymentAmount.subtract(refundAmount)) != 0) {throw new CellDataException("汇总行数据中的“净金额”错误:汇总行数据=[" + transFileHeadModel.getNetAmount() + "],计算数据=[" + (paymentAmount.subtract(refundAmount)) + "].");}return realDetailLine;}public TransFileHeadModel getHeadData(XSSFSheet xssFSheet) throws CellDataException {TransFileHeadModel transFileHeadModel = new TransFileHeadModel();// 获取当前工作薄的汇总行XSSFRow xssfRowHead = xssFSheet.getRow(1);if (xssfRowHead != null) {checkHeadNotEmpty(xssfRowHead);transFileHeadModel.setMerchantId(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 0, null));transFileHeadModel.setMerchantName(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 1, null));transFileHeadModel.setSettleOrderNo(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 2, null));transFileHeadModel.setPaymentCount(new Double(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 3, null)).intValue());transFileHeadModel.setPaymentAmount(new BigDecimal(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 4, null)));transFileHeadModel.setRefundCount(new Double(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 5, null)).intValue());transFileHeadModel.setRefundAmount(new BigDecimal(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 6, null)));transFileHeadModel.setNetCount(new Double(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 7, null)).intValue());transFileHeadModel.setNetAmount(new BigDecimal(XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, 8, null)));}logger.info("汇总行的数据为:{}", JSON.toJSONString(transFileHeadModel));return transFileHeadModel;}public String doOspHandle (XSSFSheet xssfSheet, TransFileHeadModel transFileHeadModel, int realDetailLine) throws CellDataException, OspException{// 获取当前工作薄的明细行int start = 3;int size = 5000;String importStatus = "";/** * 分批的调用osp接口:执行交易明细的导入 */while(start <= realDetailLine){importStatus = handleTransImport(xssfSheet, start, size, realDetailLine,transFileHeadModel);if (!importStatus.equals(TransImportJobStatus.Success.getValue())) {return importStatus;}start += size;}return importStatus;}/** * 调用osp接口:执行交易明细的导入 * 返回OSP操作完成的状态 */public String handleTransImport(XSSFSheet xssfSheet, int start, int size, int realDetailLine, TransFileHeadModel transFileHeadModel) throws CellDataException, OspException{List<TransDetailImport> transDetailImportList = new ArrayList<>();//组织好一个list数据:读取从start -> start+size行的数据for (int j = start; j < start + size && j <= realDetailLine ; j++) {TransDetailImport transDetailImport = new TransDetailImport();XSSFRow xssfRowDetail = xssfSheet.getRow(j);if (xssfRowDetail != null) {try {transDetailImport.setMerchantId(transFileHeadModel.getMerchantId());transDetailImport.setMerchantName(transFileHeadModel.getMerchantName());transDetailImport.setMerchantBatchNo(transFileHeadModel.getSettleOrderNo()); //商户批次号transDetailImport.setMerchantBatchSerialNo(XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, j, 0).replace(".0", ""));//商户批次序号<来源:页面导入模板中明细行的序号>transDetailImport.setMerchantOrderNo(XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, j,1)); //商户订单号:外部交易上传,内部交易由清分获取transDetailImport.setPlatformOrderNo(XssfCellValueCheckHelper.getString(xssfRowDetail, 2, transDetailImport.getMerchantOrderNo()));//平台订单号:如果不送默认商户订单号transDetailImport.setMerchantTransDate(XssfCellValueCheckHelper.getDate(xssfRowDetail, 4, new Date()));//商户交易日期:如果不送默认上送日期transDetailImport.setTransType(XssfCellValueCheckHelper.getString(xssfRowDetail,5, TransTypeEnums.Payment.getValue()).replace(".0", "")); //交易类型:如果不送默认支付transDetailImport.setOriginOrderNo(XssfCellValueCheckHelper.checkAndGetOriginOrderNo(xssfRowDetail, j, 3, transDetailImport.getTransType()));//原支付订单号transDetailImport.setCurrency(XssfCellValueCheckHelper.getString(xssfRowDetail,6, "CNY")); //币种:三位货币代码,如果不送默认CNY:人民币transDetailImport.setAmount(XssfCellValueCheckHelper.getNumberNotEmpty(xssfRowDetail, j, 7)); //交易金额:外部交易上传金额,内部商户订单金额transDetailImport.setCustomerName(XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, j, 9)); //客户名称:外部交易上传,内部交易从卡系统获取transDetailImport.setIdType(XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, j, 10)); //证件类型:外部交易上传,内部交易从卡系统获取transDetailImport.setCustomerType(XssfCellValueCheckHelper.checkAndGetCustomerType(xssfRowDetail, j, 8)); //客户类型:根据证件类型确定transDetailImport.setIdNo(XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, j,11));transDetailImport.setMoneyType(XssfCellValueCheckHelper.getString(xssfRowDetail, 12, MoneyTypeEnums.Currency.getValue()));//款项类型:默认:A 预付款项transDetailImport.setIsPayUnderBonded(XssfCellValueCheckHelper.getString(xssfRowDetail, 13, IsPayUnderBondedEnums.YES.getValue()).replace(".0", ""));//是否保税货物项下付款:默认:是transDetailImport.setTradingCode(XssfCellValueCheckHelper.getString(xssfRowDetail, 14, TradingCodeEnums.GoodsTrade.getValue()).replace(".0", ""));//交易编码:交易编码 默认:122030货物贸易transDetailImport.setRmbAccount(XssfCellValueCheckHelper.getString(xssfRowDetail, 15, ""));//人民币账号transDetailImport.setTrmo(TradingCodeEnums.getDesc(XssfCellValueCheckHelper.getString(xssfRowDetail, 16, transDetailImport.getTradingCode()).replace(".0", "")));//交易附言:默认交易编码对应的transDetailImport.setProductDesc(XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, j, 17)); //产品描述transDetailImport.setWaybillNum(XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, j, 18)); //运单号transDetailImport.setProductNum(XssfCellValueCheckHelper.getString(xssfRowDetail,19, "").replace(".0", "")); //销售数量transDetailImport.setTransFrom("3");//交易来源:1支付引擎、2门户导入、3运营控制台导入、4外部商户导入} catch (CellDataException e) {throw new CellDataException(TransImpFileExceptEnums.DetailDateError.getValue(), TransImpFileExceptEnums.DetailDateError.setParams(j+1, e.getMessage()).getDesc());}} else {throw new CellDataException(TransImpFileExceptEnums.EmptyHeadLine.getValue(), TransImpFileExceptEnums.EmptyHeadLine.getDesc());}transDetailImportList.add(transDetailImport);}logger.info("调用“导入交易明细”的OSP接口的请求参数为:{}", JSON.toJSONString(transDetailImportList));OspTransDetailServiceHelper.OspTransDetailServiceClient ospTransDetailServiceClient = new OspTransDetailServiceHelper.OspTransDetailServiceClient();TransDetailResp transDetailResp = null;try{transDetailResp = ospTransDetailServiceClient.transDetailImport(transDetailImportList);} catch (OspException e) {logger.error("调用“导入交易明细”的OSP接口的抛出异常![{}]", e.getMessage());logger.info("调用“交易明细删除”的OSP接口的请求参数为:[{}],[{}]", transFileHeadModel.getMerchantId(), transFileHeadModel.getSettleOrderNo());TransDetailResp delResp = ospTransDetailServiceClient.transDetailDel(transFileHeadModel.getMerchantId(), transFileHeadModel.getSettleOrderNo());if (!delResp.getResponseCode().equals(MessageEnum.SUCCESS.getValue())) {throw new OspException(TransImpFileExceptEnums.OspTransDetailDelRrror.getValue(), TransImpFileExceptEnums.OspTransDetailDelRrror.getDesc());}}logger.info("调用“导入交易明细”的OSP接口的返回参数为:{}", JSON.toJSONString(transDetailResp));if (!transDetailResp.getResponseCode().equals(MessageEnum.SUCCESS.getValue())) {logger.info("调用“交易明细删除”的OSP接口的请求参数为:[{}],[{}]", transFileHeadModel.getMerchantId(), transFileHeadModel.getSettleOrderNo());TransDetailResp delResp;try{delResp = ospTransDetailServiceClient.transDetailDel(transFileHeadModel.getMerchantId(), transFileHeadModel.getSettleOrderNo());} catch (OspException e) {logger.error("调用“交易明细删除”的OSP接口的抛出异常![{}]", e.getMessage());throw new OspException("调用“交易明细删除”的OSP接口的抛出异常![{}]", e.getMessage());}logger.info("调用“交易明细删除”的OSP接口的返回参数为:{}", JSON.toJSONString(delResp));if (!delResp.getResponseCode().equals(MessageEnum.SUCCESS.getValue())) {throw new OspException(TransImpFileExceptEnums.OspTransDetailDelRrror.getValue(), TransImpFileExceptEnums.OspTransDetailDelRrror.getDesc());}return TransImportJobStatus.InsetFailAndRollBack.getValue();} else {logger.info("调用“交易明细导入”的OSP接口成功!");TransDetailResp confirmResp;try{confirmResp = ospTransDetailServiceClient.transDetailConfirm(transFileHeadModel.getMerchantId(), transFileHeadModel.getSettleOrderNo(), (realDetailLine-2));} catch (OspException e) {logger.error("调用“确认交易明细成功”的OSP接口的抛出异常![{}]", e.getMessage());throw new OspException("调用“确认交易明细成功”的OSP接口的抛出异常![{}]", e.getMessage());}logger.info("调用“确认交易明细成功”的OSP接口的返回参数为:{}", JSON.toJSONString(confirmResp));if (!confirmResp.getResponseCode().equals(MessageEnum.SUCCESS.getValue())) {throw new OspException(TransImpFileExceptEnums.OspTransDetailConfirm.getValue(), TransImpFileExceptEnums.OspTransDetailConfirm.getDesc());}}return TransImportJobStatus.Success.getValue();}/** * 校验汇总行所有必填项 */public void checkHeadNotEmpty(XSSFRow xssfRowHead) throws CellDataException{for (int i = 0; i < 9; i++) {String obj = XssfCellValueCheckHelper.getCellStringValue(xssfRowHead, i, "");if (null == obj || obj.equals("")){throw new CellDataException(TransImpFileExceptEnums.EmptyFieldError.getValue(), TransImpFileExceptEnums.EmptyFieldError.setParams(2, i+1).getDesc());}}}
需要用到的工具类:
public static String getStringNotEmpty(XSSFRow xssfRowDetail, int row, int cell) throws CellDataException { if (xssfRowDetail.getCell(cell) == null || getCellStringValue(xssfRowDetail, cell, "").equals("")) { throw new CellDataException(TransImpFileExceptEnums.EmptyFieldError.getValue(), TransImpFileExceptEnums.EmptyFieldError.setParams(row+1, cell+1).getDesc()); } else { return getCellStringValue(xssfRowDetail, cell, null); } } public static String getString(XSSFRow xssfRowDetail, int cell, String defVlaue) { if (xssfRowDetail.getCell(cell) == null || getCellStringValue(xssfRowDetail, cell, "").equals("")) { return defVlaue; } else { return getCellStringValue(xssfRowDetail, cell, null); } } public static Integer getNumber(XSSFRow xssfRowDetail, int cell, Integer defVal) { if (xssfRowDetail.getCell(cell) == null || getCellStringValue(xssfRowDetail, cell, "").equals("")) { return defVal; } else { return new Double(getCellStringValue(xssfRowDetail, cell, null)).intValue(); } } /** * 根据cell数据类型,转成String格式 * @param xssfRowDetail * @param cellNo * @param defVal * @return */ public static String getCellStringValue(XSSFRow xssfRowDetail, int cellNo, String defVal) { Object returnValue = null; XSSFCell cell = xssfRowDetail.getCell(cellNo); if(null != cell){ switch(cell.getCellType()){ case XSSFCell.CELL_TYPE_NUMERIC: //数字 returnValue = cell.getNumericCellValue(); break; case XSSFCell.CELL_TYPE_BOOLEAN: //布尔 returnValue = cell.getBooleanCellValue(); break; case XSSFCell.CELL_TYPE_BLANK: // 空值 returnValue = ""; break; case XSSFCell.CELL_TYPE_FORMULA: // 公式 returnValue = cell.getCellFormula(); break; case XSSFCell.CELL_TYPE_ERROR: // 故障 returnValue = defVal; break; default: returnValue = cell.getStringCellValue(); if (StringUtils.isBlank(String.valueOf(returnValue))) { returnValue = defVal; } break; } } return null == returnValue ? defVal : String.valueOf(returnValue); } public static Date getDate(XSSFRow xssfRowDetail, int cell, Date defVal) { if (xssfRowDetail.getCell(cell) == null || getCellStringValue(xssfRowDetail, cell, "").equals("")) { return defVal; } else { return xssfRowDetail.getCell(cell).getDateCellValue(); } } public static Long getNumberNotEmpty(XSSFRow xssfRowDetail, int row, int cell) throws CellDataException { if (xssfRowDetail.getCell(cell) == null || getCellStringValue(xssfRowDetail, cell, "").equals("")) { throw new CellDataException(TransImpFileExceptEnums.EmptyFieldError.getValue(), TransImpFileExceptEnums.EmptyFieldError.setParams(row+1, cell+1).getDesc()); } else { return new Double(getCellStringValue(xssfRowDetail, cell, null)).longValue(); } } public static Long getNumber(XSSFRow xssfRowDetail, int cell, Long defVal) { if (xssfRowDetail.getCell(cell) == null || getCellStringValue(xssfRowDetail, cell, "").equals("")) { return defVal; } else { return new Double(getCellStringValue(xssfRowDetail, cell,null)).longValue(); } } /** * 校验原支付订单号在退款时必填 * 返回原支付订单号 */ public static String checkAndGetOriginOrderNo(XSSFRow xssfRowDetail, int row, int cell, String transType) throws CellDataException { if (transType.equals(TransTypeEnums.Refund.getValue()) && xssfRowDetail.getCell(cell) == null) { throw new CellDataException(TransImpFileExceptEnums.EmptyFieldError.getValue(), TransImpFileExceptEnums.EmptyFieldError.setParams(row, cell).getDesc()); } return getString(xssfRowDetail, cell, ""); //原支付订单号 } /** * 校验证件类型和客户类型的关系一致性 * 返回客户类型的值 */ public static String checkAndGetCustomerType(XSSFRow xssfRowDetail, int row, int cell) throws CellDataException { //校验证件类型是否正确 String idType = XssfCellValueCheckHelper.getStringNotEmpty(xssfRowDetail, row,10); String customerTypeByDict = IdTypeCustomerTypeEnums.getDesc(idType); if (customerTypeByDict.equals("")) { throw new CellDataException(TransImpFileExceptEnums.DetailDateError.getValue(), TransImpFileExceptEnums.DetailDateError.setParams(row+1, 10).getDesc()); } //校验客户类型是否与证件类型相匹配 String cusTomerType = XssfCellValueCheckHelper.getString(xssfRowDetail, cell, customerTypeByDict);//客户类型,可不填,默认为证件类型对应的 if (!customerTypeByDict.equals(cusTomerType)){ throw new CellDataException(TransImpFileExceptEnums.DetailDateError.getValue(), TransImpFileExceptEnums.DetailDateError.setParams(row+1, 8).getDesc()); } return cusTomerType; }
angularJS代码如下:
appCtrl.controller('transactionImportCtrl',['$rootScope', '$scope', 'http', 'FileUploader',function($rootScope, $scope,http, FileUploader) { //单个的上传 var uploader = $scope.uploader = new FileUploader({ url: '/proxy/cap-cbs-mgr/mgr/transDetail/upload', queueLimit: 1 }); uploader.onBeforeUploadItem = function(item) { item.formData = [{ // fileName : uploader.queue[0].file.name, // suffix : fileName.substring(fileName.lastIndexOf("."),fileName.length) // reconDateStr:$scope.paymentTime.replace(/-/g,''), // paymentBankId:$scope.selectBank.model, // paymentChannelId:$scope.selectPaymentChanel.model }]; }; uploader.onSuccessItem = function(fileItem, response, status, headers) { console.log("success"); console.log(response); $scope.fileCheck = response.data.respMsg; $.trace($scope.fileCheck); uploader.clearQueue(); $('#txFileImport').modal('hide'); }; uploader.onErrorItem = function(fileItem, response, status, headers) { $.trace(response.error.message); $('#txFileImport').modal('hide'); }; $scope.uploadFile = function() { if(uploader === undefined || uploader.queue.length === 0) { alert("请选择要上传的文件......"); return; } var fileName = uploader.queue[0].file.name; var suffix = fileName.substring(fileName.lastIndexOf("."),fileName.length); if(suffix !== ".xlsx" && fileName.indexOf(".") !== -1){ alert("对账文件类型必须为以.xlsx为后缀的excel文件,请重新选择"); return; } $('#txFileImport').modal('show'); }; $scope.uploadCancel = function(){ $('#txFileImport').modal('hide'); }; $scope.uploadConfirm = function(){ uploader.uploadAll(); }; $scope.clearItems = function() { $scope.fileCheck = ""; uploader.clearQueue(); if(uploader !== undefined && uploader.queue.length !== 0) { uploader.queue[0].progress = 0; } }; //文件模板下载 $scope.downloadTemplate = function(){ location.href = "/proxy/cap-cbs-mgr/mgr/transDetail/download"; }; //重置 $scope.reset = function(){ uploader.clearQueue(); };}]);
HTML代码如下:
<div class="container-fluid ice-query"><div class="query-container"> <div class='query-title'> <span class='title'>交易导入</span> </div> <div class="ice-block-single"> <div class="ice-row ice-query"> <div class="ice-column"><h4>选择上传的文件</h4></div> <div class="ice-column"><input type="text" class="form-control deal-value" readonly="readonly" ng-model="uploader.queue[0].file.name" /></div> <div class="ice-column"> <input type="file" nv-file-select="" accept="application/vnd.ms-excel,application/vnd.openxmlformats-officedocument.spreadsheetml.sheet" uploader="uploader" style="position: absolute; filter: alpha(opacity = 0); opacity: 0; width: 70px; height: 32px; cursor: hand" hidefocus="" ng-click="clearItems()" /> <button type="button" class="btn btn-info btn-sm">浏览</button> </div> </div> <div class="ice-row ice-query"> <div class="ice-column"> <ice-permission value='transaction.import.download' out='downloadTemplate123'> <ice-button text='文件模板下载' hanle-click='downloadTemplate()'/> </ice-permission> </div> <div class="ice-column"> <ice-permission value='transaction.import.upload' out='uploadFile123'> <ice-button text='文件上传' hanle-click='uploadFile()'/> </ice-permission> </div> <div class="ice-column"> <ice-permission value='transaction.import.reset' out='reset123'> <ice-button text='重置' hanle-click='reset()'/> </ice-permission> </div> </div> </div> <div class="modal fade" id = "txFileImport" tabindex="-1" role="dialog"> <div class="modal-dialog" role = "document"> <div class="modal-content" > <div class="modal-body"> <h4>是否确认上传?</h4> </div> <div class="modal-footer"> <div class="ice-row ice-query"> <div class="ice-column" style="float:left"> <ice-button text='确定' hanle-click='uploadConfirm()'/> </div> <div class="ice-column" style="float:right"> <ice-button text='取消' hanle-click='uploadCancel()'/> </div> </div> </div> </div> </div></div>
但是现在有个问题:在下图中,当导入的文件太大的时候,new XSSFWorkbook(inputStream)加载文件流的时候会内存溢出。目前正在思考好的解决方案,有合适的欢迎留言一起评论~~~
阅读全文
1 0
- POI读取并解析xlsx格式的excel文件
- 通过poi实现解析并读取excel文件(包含xls、xlsx后缀)
- 通过poi实现解析并读取excel文件(包含xls、xlsx后缀)
- java使用poi读取xls格式和xlsx格式的excel文件
- POI读取加密的EXCEL(兼容XLS,XLSX格式)
- java使用poi读取xlsx格式的Excel总结
- 超大数据量的xlsx格式的excel文件的读取和解析,解决了POI方式的内存溢出和性能问题
- 利用 js-xlsx 实现 Excel 文件导入并解析Excel数据成json格式的数据
- Java 实现导出excel表 POI/Java实现不同excel格式(*.xls、*.xlsx)文件的读取
- POI读取EXCEL下xlsx,xls文件
- PHPExcel 读取Excel以xlsx格式的文件
- Java通过apache poi 读取excel(.xlsx)文件,并通过MyBbtis插入数据库中
- poi创建、解析Excel(还有高版本的xlsx格式的Excel创建)
- Java中通过POI读取Excel 2003 - 2007的xls,xlsx格式
- groovy : poi 读取 Excel xlsx
- groovy : poi 读取 Excel xlsx
- java:poi读取excel文件,分xls和xlsx
- java使用POI读取excel文件,兼容xls和xlsx
- 接口设计模式
- 在windows上安装Jenkins---tomcat流
- svn报错
- fastjson 属性大写问题
- 多进程和多线程的选择
- POI读取并解析xlsx格式的excel文件
- c#每隔一段时间就运行某段程序 timer类使用
- python 数据可视化 matplotlib学习三:生成随机漫步数据并使用matplotlib呈现
- 哥德巴赫猜想
- viewpager的无限轮播和带点
- 获取类的隐藏的方法,及Method Swizzling的运用
- idea的debug调试快捷键
- QQ第三方登录+分享
- Adobe Acrobat Xi Pro v11.0.10官方简体中文破解版