excel 二进制流js接收

js代码


import ElementUI from 'element-ui'

import {requestDownload} from '@/api/request.js'

/*
* 时间戳转换成日期
* */
export const timestampToTime = function (timestamp) {
  let date = new Date(timestamp)
  let Y = date.getFullYear() + '-'
  let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  let D = date.getDate() + ''
  D.length == 1 ? D = '0' + D : D
  let replaceDate = Y + M + D
  return replaceDate
}

/*
* 时间戳转换成日期+时间
* */
export const timestampToTimeHMS = function (timestamp) {
  let date = new Date(timestamp * 1000)
  let Y = date.getFullYear() + '-'
  let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '

  let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
  let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'
  let s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  let replaceDate = Y + M + D + h + m + s
  return replaceDate
}

/*
* 时间戳转换成日期+时间
* */
export const timestampToTimeHM = function (timestamp) {
  let date = new Date(timestamp * 1000)
  let Y = date.getFullYear() + '-'
  let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '

  let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
  let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes())
  let replaceDate = Y + M + D + h + m
  return replaceDate
}

/*
* 时间戳转换成日期+时间
* */
export const timestampToTimeHMS_C = function (timestamp) {
  let date = new Date(timestamp)
  let Y = date.getFullYear() + '-'
  let M = (date.getMonth() + 1 < 10 ? '0' + (date.getMonth() + 1) : date.getMonth() + 1) + '-'
  let D = (date.getDate() < 10 ? '0' + date.getDate() : date.getDate()) + ' '

  let h = (date.getHours() < 10 ? '0' + date.getHours() : date.getHours()) + ':'
  let m = (date.getMinutes() < 10 ? '0' + date.getMinutes() : date.getMinutes()) + ':'
  let s = date.getSeconds() < 10 ? '0' + date.getSeconds() : date.getSeconds()
  let replaceDate = Y + M + D + h + m + s
  return replaceDate
}
// 时分秒转为时间戳
export function countDown (time) {
  let s = 0
  let hour = time.split(':')[0]
  let min = time.split(':')[1]
  let sec = time.split(':')[2]

  s = Number(hour * 3600) + Number(min * 60) + Number(sec)
  return s
}

// 时间戳--转为时分秒
export function formatDuring (mss) {
  let time = new Date(new Date('2019-1-1 00:00:00').getTime() + mss * 1000)
  let hours = time.getHours()
  let minutes = time.getMinutes()
  let seconds = time.getSeconds()
  hours = hours < 10 ? '0' + hours : hours
  minutes = minutes < 10 ? '0' + minutes : minutes
  seconds = seconds < 10 ? '0' + seconds : seconds
  return hours + ':' + minutes + ':' + seconds
}

/*
计算时间
*/
export const GetDateStr = function (type, AddDayCount, monthCount) {
  let dd = new Date()
  dd.setDate(dd.getDate() + AddDayCount)// 获取AddDayCount天后的日期
  let y = dd.getFullYear()
  let m = (dd.getMonth() + 1) < 10 ? '0' + (dd.getMonth() + 1) : (dd.getMonth() + 1)// 获取当前月份的日期,不足10补0
  let d = dd.getDate() < 10 ? '0' + dd.getDate() : dd.getDate()// 获取当前几号,不足10补0
  let h = dd.getHours() < 10 ? '0' + dd.getHours() : dd.getHours()/// /获取当前时间点,不足10补0
  let min = dd.getMinutes() < 10 ? '0' + dd.getMinutes() : dd.getMinutes()/// /获取当前分钟值,不足10补0
  let s = dd.getSeconds() < 10 ? '0' + dd.getSeconds() : dd.getSeconds()/// /获取当前秒值,不足10补0

  let time = ''
  // 计算月份
  if (monthCount) {
    /* if(monthCount> 0) {
        if(monthCount >= dd.getMonth()+1){
            let month = dd.getMonth()+1;
            let yearCount = (month+12 - monthCount)%12 + 1;
            console.log(yearCount);
            month = month+12- yearCount*12 - monthCount;
            m = month<10?"0"+month:month
            // console.log(m);
            y= y -yearCount;
        }else{
            m = m - monthCount;
        }
    }else{
        console.log('日期格式错误')
    } */
    let mm = dd.getMonth() + 1
    let month = (mm + monthCount) % 12
    console.log(month)
    let year = parseInt((mm + monthCount) / 12)
    console.log(year)
    if (month > 0) {
      y = y + year
      m = month
    } else {
      y = y + year - 1
      m = month + 12
    }
  }

  // 精确到天
  if (type == 1) {
    time = y + '-' + m + '-' + d + ' ' + '00' + ':' + '00' + ':' + '00'
  }
  // 精确到秒
  else if (type == 2) {
    time = y + '-' + m + '-' + d + ' ' + h + ':' + min + ':' + s
  }

  return time
}
/* 秒转天时分秒 */
export function timeStamp (second_time) {
  let time = parseInt(second_time);
  if( parseInt(second_time )> 60){
    let second = parseInt(second_time) % 60;
    let min = parseInt(second_time / 60);
    time = min + ":" + second;
    if( min > 60 ){
      min = parseInt(second_time / 60) % 60;
      let hour = parseInt( parseInt(second_time / 60) /60 );
      time = hour + ":" + min + ":" + second;

      if( hour > 24 ){
        hour = parseInt( parseInt(second_time / 60) /60 ) % 24;
        let day = parseInt( parseInt( parseInt(second_time / 60) /60 ) / 24 );
        time = day + "天, " + hour + ":" + min + ":" + second;
      }
    }
  }
  return time;
}

// 下载文件
let _this = this
/*
 * fileType -文件类型 默认 vnd.ms-excel,x-java-jnlp-file(kvm)
 */
export const getDownloadFile = function (url, data, fileType) {
  if (!fileType) {
    fileType = 'vnd.ms-excel'
  }
  requestDownload(url, data)
    .then((response) => {
      console.log(data)
      if (decodeURIComponent(response.headers['content-disposition']) === 'undefined') {
        ElementUI.Message({
          message: '该文件为空',
          type: 'warning',
          duration: 2000
        })
        return
      }
      let name = decodeURIComponent(response.headers['content-disposition'].split('=')[1])
      let blob = new Blob([response.data], {type: 'application/' + fileType})

      if (window.navigator.msSaveOrOpenBlob) {
        // 兼容ie浏览器
        window.navigator.msSaveBlob(blob, name)
      } else {
        let blob = new Blob([response.data], {type: 'application/' + fileType})
        let downloadElement = document.createElement('a')
        let href = window.URL.createObjectURL(blob) // 创建下载的链接
        downloadElement.href = href
        downloadElement.download = name.replace(/\"/g, '') // 下载后文件名
        document.body.appendChild(downloadElement)
        downloadElement.click() // 点击下载
        document.body.removeChild(downloadElement) // 下载完成移除元素
        window.URL.revokeObjectURL(href) // 释放掉blob对象
      }
    })
}

请求方法:

export function requestDownload (url, data = {}, method = 'post', responseType = 'blob') {
  return new Promise((resolve, reject) => {
    let options = {
      url: url,
      method,
      responseType
    }
    if (method === 'get') {
      options.params = {...data}
    } else {
      options.data = data
    }
    axios(options)
      .then((res) => {
        resolve(res)
      })
      .catch((error) => {
        reject(error)
      })
  })
}

后端方法

    @RequestMapping(value="/exportUserPage.action")
    public  void exportUserPage( HttpServletResponse response,HttpServletRequest request){
 
        Map parameterMap = null;
        try {
            // 对应前端的编码,在这里进行解码,并解析json为Map
            String value = URLDecoder.decode(request.getParameter("parameterMap"), "UTF-8");
            parameterMap = (Map)JSON.parse(value);
            System.out.println("value");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
 
        Map<String, String> queryCondition = parameterToQueryCondition(parameterMap);
 
        // 1 获取当前页数
        Object pageObj = parameterMap.get(GeneralConstants.PAGE_NOW);
        Integer pageNow = PageUtil.getPage(pageObj);
 
        // 2 获取实际数据
        int start = (pageNow - 1) * PAGE_SIZE;//开始条数
        int end = PAGE_SIZE;
        List<Map<String, Object>> list = userFilterService.listDataWithPage(start,end,queryCondition);
 
 
        // 3 生成excel
        String []title = {"UID","姓名","学历","姓别","求职状态","求职期望","是否有boss身份","期望工作地区","工作年限","工作经历","教育经历"};
        HSSFWorkbook wb = ExcelUtil.getHSSFWorkbook("SheetName",title,list,null);
 
        // 4 响应到客户端,弹出下载提示框
        try {
            this.setResponseHeader(response, "user"+DateUtil.getCurrentDate()+".xls");
            OutputStream os = response.getOutputStream();
            wb.write(os);
            os.flush();
            os.close();
        } catch (Exception e) {
            e.printStackTrace();
            logger.error("excel导出错误:"+e);
        }
        return ;
    }
 
 
   /**
     * 功能描述: 发送响应流方法
     *
     * @param 
     * @return 
     * @auther mazhen
     * @date 2018/12/11 下午2:17
     */
    public void setResponseHeader(HttpServletResponse response, String fileName) {
        try {
            try {
                fileName = new String(fileName.getBytes(),"ISO8859-1");
            } catch (UnsupportedEncodingException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
                logger.error("excel导出错误:"+e);
            }
            response.setContentType("application/octet-stream;charset=ISO8859-1");
            response.setHeader("Content-Disposition", "attachment;filename="+ fileName);
            response.addHeader("Pargam", "no-cache");
            response.addHeader("Cache-Control", "no-cache");
        } catch (Exception ex) {
            ex.printStackTrace();
            logger.error("excel导出错误:"+ex);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
首先,你需要在前端使用ajax向后端发送请求,并在请求中设置responseType为blob,以便获取二进制数据。同时,你需要在后端将excel文件转换成二进制数据并返回给前端。 以下是一个使用jQuery的前端示例代码: ```javascript $.ajax({ url: 'your-backend-url', method: 'POST', responseType: 'blob', // 设置返回数据类型为二进制 success: function(data) { // 创建一个a标签,将二进制数据转换为URL,并设置下载属性 var a = document.createElement('a'); var url = window.URL.createObjectURL(data); a.href = url; a.download = 'file.xls'; // 将a标签添加到文档中,并自动触发点击事件下载文件 document.body.appendChild(a); a.click(); // 下载完成后,释放URL对象 window.URL.revokeObjectURL(url); } }); ``` 在后端,你可以使用EPPlus或NPOI等库来将Excel文件转换为二进制数据,并将其作为响应返回给前端。以下是一个使用EPPlus的后端示例代码: ```csharp using OfficeOpenXml; // ... [HttpPost] public IActionResult DownloadExcel() { // 读取Excel文件 var fileInfo = new FileInfo("path/to/file.xlsx"); using (var package = new ExcelPackage(fileInfo)) { // 获取工作表 var worksheet = package.Workbook.Worksheets[0]; // 将工作表转换为二进制数据 var data = worksheet.ConvertToBinary(); // 返回二进制数据 return File(data, "application/vnd.ms-excel", "file.xls"); } } ``` 注意,以上代码仅供参考,具体实现可能会因为框架和库的不同而有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值