美文网首页学习记录前端
element-table 转excel(学习记录)

element-table 转excel(学习记录)

作者: zt_sole | 来源:发表于2021-07-01 15:02 被阅读0次

使用说明:
1、在el-table 标签上加上id属性值


image.png

2、调用exportExcelByTableId 方法传入table id 值即可


image.png
3、导出效果
image.png
image.png

js工具



/**
 * 表格数据导出excel
 */
import FileSaver from "file-saver";
import XLSX from "xlsx";


/** 通过table id 获取workbook 对象
 * @param {Object} id table id
 */
export function getWorkBookObjById(id){
  var xlsxParam = { raw: true };//转换成excel时,使用原始的格式
  // 解决生成重复数据-因为使用fixed属性
  var fix = document.querySelector("#"+id).querySelector('.el-table__fixed')
  var wb;
  if (fix) {
      /* 从表生成工作簿对象 */
      wb = XLSX.utils.table_to_book(document.querySelector("#"+id).removeChild(fix))
      document.querySelector("#"+id).appendChild(fix)
    } else {
      wb = XLSX.utils.table_to_book(document.querySelector("#"+id))
    }
    return wb;
}
/**
 * @param {Object} id 表格 document id
 * @param {Object} fileName 导出文件名
 */
export function exportExcelByTableId(id,fileName){
      var wb=getWorkBookObjById(id);
      createExcel(wb,fileName);
}
/** 创建excel
 * @param {Object} wb work_book
 * @param {Object} fileName 导出文件名
 */
export function createExcel(wb,fileName){
  var wbout = XLSX.write(wb, {
    bookType: "xlsx",
    bookSST: true,
    type: "array"
  });
  try {
    FileSaver.saveAs(
      new Blob([wbout], { type: "application/octet-stream;charset=utf-8" }),
      fileName+".xlsx"
    );
  } catch (e) {
    if (typeof console !== "undefined") console.log(e, wbout);
  }
  return wbout;
}

export function formatJson(filterVal, jsonData){
  // jsonData 数据转成行数据(不包含标题)
  return jsonData.map(v => filterVal.map(j => v[j]))

}

/** 通过多个表格id导出excle
 * @param {arr} paramArr [{id:"el-table id值","sheetName":"sheetName"}]
 *  * @param {arr} fileName 导出文件名 ,如果不填的话默认当前时间戳
 */
export function exportExcelByTableIds(paramArr,fileName){
  let wb =getExportWorkBookByTableIds(paramArr);
  fileName=fileName?fileName:"data-export-excel_"+new Date().toLocaleString();
  createExcel(wb,fileName);
}

/** 通过document id 参数数据获取word_book 对象
 * @param {Object} paramArr [{id:"el-table id值","sheetName":"sheetName"}]
 */
export function getExportWorkBookByTableIds(paramArr){
  let wb = XLSX.utils.book_new();
  var xlsxParam = { raw: true };//转换成excel时,使用原始的格式
  for(let i=0;i<paramArr.length;i++){
    var wb1 = getWorkBookObjById("#"+paramArr[i].id);//XLSX.utils.table_to_book(document.querySelector("#"+paramArr[i].id),xlsxParam);
    for(let j=0;j<wb1.SheetNames.length;j++){
      let sheetJSON=XLSX.utils.sheet_to_json(wb1.Sheets[wb1.SheetNames[j]]);
      console.log(sheetJSON,"sheetJSON");
      let sheet = XLSX.utils.json_to_sheet(sheetJSON);
      // 命名sheet名称:如果只有一个sheet就用传入进行来的sheetName,多个的话新的 sheetName=传入的sheetName + 原来的sheetName
      let sheetName=wb1.SheetNames.length>1?paramArr[i].sheetName+wb1.SheetNames[j]:paramArr[i].sheetName;
      XLSX.utils.book_append_sheet(wb, sheet, sheetName);
    }
  }
  return wb;
}

/**
 * @param {Object} headerArr 列名数组(最终导出excel的列表)如:["第一列","第二列"]
 * @param {Object} filterVal 列名数组(对应数据中的字段名) 如:["col1","col2"]
 * @param {Object} dataList 数据列表 如[{col1:"1",col2:"2"},{col1:"1",col2:"2"}]
 */
export function getSheetByJSON(headerArr,filterVal,dataList){
   let data=formatJson(filterVal,dataList);
   data.unshift(headerArr);// 在data数据第一行加上标题行
   let sheet = XLSX.utils.aoa_to_sheet(data);
   return sheet;
}
/** 通过table id 获取sheet(一个)
 * @param {Object} tableId table id
 */
export function getSheetByTableId(tableId){
  var xlsxParam = { raw: true };//转换成excel时,使用原始的格式
  var wb = XLSX.utils.table_to_book(document.querySelector("#"+tableId),xlsxParam);
  
  let sheetJSON=XLSX.utils.sheet_to_json(wb.Sheets[wb.SheetNames[0]]);
  let sheet = XLSX.utils.json_to_sheet(sheetJSON);
  return sheet;
}

/**
 * @param {Object} headerArr 列名数组(最终导出excel的列表)如:["第一列","第二列"]
 * @param {Object} filterVal 列名数组(对应数据中的字段名) 如:["col1","col2"]
 * @param {Object} dataList 数据列表 如[{col1:"1",col2:"2"},{col1:"1",col2:"2"}]
 *
 * @param {Object} fileName 导出文件名/sheetName
 */
export function exportExcelByJSON(headerArr,filterVal,dataList,fileName){
  let sheet=getSheetByJSON(headerArr,filterVal,dataList);
  let wb = XLSX.utils.book_new();
  XLSX.utils.book_append_sheet(wb, sheet, fileName);
  createExcel(wb,fileName);
}

相关文章

网友评论

    本文标题:element-table 转excel(学习记录)

    本文链接:https://www.haomeiwen.com/subject/cepksltx.html