JS導出Excel文件


JS導出Excel文件

  大家在日常開發的過程中,尤其是B端的項目,很可能會碰到這個需求,將某個表格中的數據,或者是后端傳輸的數據,作為一個Excel文件進行導出保存。

  我們不可能為每次的突然出現的需求,都重寫一次函數,所以我們可以寫一個一直可用的公共方法來滿足這個“導出”層面的需求,那么我們的函數大概需要注意以下幾點:

  • 允許兼容大部分Excel格式,例如xslx、xls、csv
  • 數據易於導入
  • 自定義的文件名及后綴
  • 低版本兼容

  對於以上幾點,CSV是一個很好的缺省格式,當使用時未指定格式時,默認使用CSV進行導出,因為xslx、xls可能會有編碼問題,它是二進制的文件,而CSV是文本文件,用記事本即可打開。數據導入我選擇標題及內部數據拆開,使用數組導入,這樣會更加靈活。對於低版本導入,這邊選擇的是JS中的Blob對象,這是一個二進制大對象,可以用於保存二進制數據並使用a標簽模擬點擊進行下載,在各大瀏覽器,Blob都是有很好的兼容性的,所以基本可以放心使用,這意味着不止React等框架,簡單的H5C3頁面也是可以使用Blob進行Excel導出的,這里把我的代碼貼出,希望能對大家有幫助,必要的注釋已經額外在其中補充了。

export const excelExport = ({ dataSource = [], titles = [], fileName = 'data', suffix = 'csv' }) => {

  var dataType = "\uFEFF"; //解決亂碼問題
  dataType += titles.join(',');  //添加表格的頭
  dataType += '\n'; // 以上是導出的Excel文件頭部

  // 從dataSource中取出數據存入數據源(dataType)
  dataSource.map(item => dataType += `${item.join(',')}\n`); 

  // 使用Blob,獲得二進制實例
  const csvData = new Blob([dataType], {
    type: 'text/csv'
  });

  // 創建a標簽
  const _a = document.createElement('a');
  /**
  * URL.createObjectURL() 靜態方法會創建一個 DOMString,其中包含一個表示參數中給出的對象的URL
  * 這里相當於為a標簽添加了一個下載地址
  */
  _a.href = URL.createObjectURL(csvData);
  // 該a標簽點擊后會打開新的標簽頁,人機交互會更加舒適
  _a.target = '_blank';
  // 為a標簽規定被下載的超鏈接目標
  _a.download = `${fileName}.${suffix}`;
  // 將這個制作好的a標簽置入body,並在點擊之后移除,降低外界感知
  document.body.appendChild(_a);
  _a.click();
  document.body.removeChild(_a);
}

  既然已經展示了我自己的一個導出函數,那么這里也舉個例去使用這個函數。這里的情景是一個最簡單的導出,需要導出所有的title、data為csv文件。(React代碼)

// 這里一般的情況是可以用來保存Table中被選中的項
const [selectedRows, setSelectedRows] = useState<SelectedProps[]>([
  { name: '喬布斯', age: 18 },
  { name: '米卡', age: 21 },
  { name: '起飛', age: 24 },
]);

const column = [
  {
    title: '姓名',
    dataIndex: 'name',
    width: 200,
  }, {
    title: '年齡',
    dataIndex: 'age',
    width: 200,
  }];

// 值得注意的是,由於Excel是二維數據,所以我們的dataSource使用了二維數組去承載數據
excelExport({
  fileName: '表格數據',
  suffix: 'csv',
  titles: column.map(item => item.title),
  dataSource: selectedRows.map(({ name, age }) => [name, age])
})

  這里大家可以根據自己的具體業務邏輯去編寫代碼,希望對大家有所幫助~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM