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