一.csv与xlsx格式基本介绍
 
    csv即comma seperate values - 逗号分隔值,文件以纯文本形式来存储表格数据,它可以由任意数目的记录组成,记录之间通过某种换行符来分隔如 ’\r\n’,而每条记录由字段组成,字段之间的分隔符一般通过逗号来分隔即  ’,’,因此csv是一种比较简单的文件格式,在编辑器中打开如下所示
   
    
    xlsx是Microsoft Excel 2007之后的扩展名,其本身是一种新的基于XML的压缩文件,相对于传统的xls文件占用空间更小,在后缀名之后添加.zip即可解压缩,如下所示:
 
二. 前端导出csv格式文件
 
     csv格式 - csv格式本身比较简单,所以前端只需要对数据按照格式(记录之间通过换行符分隔,记录中的字段之间通过逗号分隔)进行处理即可,一般不需要引入额外的库,基本的使用方法如下:
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
</head>
<body>
<button id="btn">下载</button>
<a id="downloadCsv"></a>
<script>
const btn = document.getElementById('btn');
btn.addEventListener('click', function () {
  let headers = ['时段', '2018-08-01', '2018-08-01', '2018-08-01'];
  let dataSource = [
    ['00时', 345, 65, 8],
    ['06时', 23, 56, 89],
    ['12时', 21, 4, 7],
    ['18时', 67, 9, 34],
  ];
  let csv = '\uFEFF';
  csv += headers.join(',') + '\r\n';
  dataSource.forEach( (record) => {
    csv += (record.join(',') + '\r\n');
  });
  const blob = new window.Blob([csv], { type: 'text/csv,charset=UTF-8' });
  const downloadCsv = document.getElementById('downloadCsv');
  downloadCsv.href = window.URL.createObjectURL(blob);
  downloadCsv.click();
  window.URL.revokeObjectURL(blob);
})
</script>
</body>
</html>
 
值得注意的有以下几点:
  1. 在csv文件的开头需要添加BOM,这里使用\uFEFF表示此文件使用UTF-16进行编码
  2. 在创建Blob时,第一个参数必须是数组
  3. 在下载完成最后,需要及时清除Blob占用的内存
可以在https://jsfiddle.net/veh7asqk/1/查看效果
 
 
 
三.前端导出excel格式文件
    excel格式文件比较复杂,在实现上一般可以引用第三方库https://github.com/sheetjs/js-xlsx,它可以简化xlsx文件的各种操作:读取、预览、web sql查询、编辑、导出,可以访问https://sheetjs.com/opensource查看更多;这里主要陈述如何导出xlsx类型的文件
    打开一个excel表,可以发现其主要的格式如下:
      A     B      C     D      E
1    A1   B1    C1   D1    E1
2    A2   B2    C2   D2    E2
3    A3   B3    C3   D3    E3
4    A4   B4    C4   D4    E4
    所以前端对于数据的处理过程就是将数据按照上面的格式进行匹配,一个简单的例子如下所示:
 
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>Document</title>
  <!-- XLSX -->
  <!-- fileSaver saveAs -->
</head>
<body>
  <button id="btn"/>下载</button>
  <script>
  function createWorkSheet (XLSX, tableCols, tableData) {
    var EMPTY_XSLX_BASE64 = '';
    var workbook = XLSX.read(EMPTY_XSLX_BASE64, { type: 'base64' });
    var sheets = {
    Sheet1: {},
    };
    var sheetNames = ['Sheet1'];
    var idx = 0;
    var colNum = tableCols.length;
    var rowNum = tableData.length;
    // 输入表头
    for (idx = 0; idx < colNum; idx++) {
      var title = tableCols[idx];
      sheets.Sheet1[String.fromCharCode(65 + idx) + '1'] = {
        t: 's',
        v: title.name,
      };
    }
    // 插入每行的数据值
    for (let n = 0; n < rowNum; n++) {
      let key = tableCols[0].key;
      let v = tableData[n][key] + '';
      sheets.Sheet1[String.fromCharCode(65) + (n + 2)] = {
        t: 'n',
        v: v,
      };
    }
    for (let n = 0; n < rowNum; n++) {
      let key = tableCols[1].key;
      let v = tableData[n][key] + '';
      sheets.Sheet1[String.fromCharCode(65 + 1) + (n + 2)] = {
        t: 's’,  
        v: v,
      }
    }
    for (let n = 0; n < rowNum; n++) {
      for (idx = 2; idx < colNum; idx++) {
        let key = tableCols[idx].key;
        let v = tableData[n][key];
          sheets.Sheet1[String.fromCharCode(65 + idx) + (n + 2)] = {
            t: 'n',
            v: v,
        };
      }
    }
    sheets.Sheet1['!ref'] = 'A1:' + String.fromCharCode(65 + colNum - 1) + (rowNum + 1);
    workbook.Sheets = sheets;
    workbook.SheetNames = sheetNames;
    return workbook;
  }
 
  function a2ab (s) {
    var buf = new ArrayBuffer(s.length);
    var view = new Uint8Array(buf);
    for (var i = 0; i !== s.length; ++i) {
      view[i] = s.charCodeAt(i) & 0xFF;
    }
    return buf;
  }
 
  const headers = [
    {
      name: '序号',
      key: 'No',
    },
    {
      name: '应用名称',
      key: 'AppName',
    },
    {
      name: '日活跃用户数(万)',
      key: 'DAU',
    },
    {
      name: '月数(万)',
      key: 'MAU',
    }
  ];
 
  const dataSource = [
    {
      No: 1,
      AppName:  ‘a',
      DAU: 17900,
      MAU: 50000,
    },
    {
      No: 2,
      AppName:  ‘b',
      DAU: 12500,
      MAU: 40000,
    },
    {
      No: 3,
      AppName:  ‘c',
      DAU: 4400,
      MAU: 15000,
    },
    {
      No: 4,
      AppName:  ‘d',
      DAU: 4800,
      MAU: 17000,
    },
  ];
 
  function download (fileName) {
    let wb = createWorkSheet(XLSX, headers, dataSource);
    let wbout = XLSX.write(wb, {bookType: 'xlsx', bookSST: true, type: 'binary'});
    saveAs(new Blob([a2ab(wbout)], {type: 'application/octet-stream'}), fileName);
  }
  let btn = document.getElementById('btn');
  btn.addEventListener('click', function () {
  const fileName = 'example.xlsx';
    download(fileName);
  })
</script>
</body>
</html>
这里导出的是一个工作簿,工作簿中包含多个表,所以通过这种方式可以输出多个表从而方便用户查看;另外,在格式化过程中可以针对导出表格式需要来规定每个字段的type来做类型的限定,保证类型的确定性以及减少前端相应工作量;
可以在https://jsfiddle.net/q8dgvL3w/2/查看效果
 
 
四. 总结
    csv文件格式简单,在前端实现上相对简单,无需引入额外的库文件,对于一般的表格导出均可满足需求;xlsx文件格式复杂,需要引用第三方库文件进行处理,其可以文件预览、类型限定、SQL查询、内容包含图表、一个工作簿中包含多个表等,使用场景更大。
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

csv与xlsx导出的更多相关文章

  1. Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和导出. 该 ...

  2. 在 Laravel 5 中使用 Laravel Excel 实现 Excel/CSV 文件导入导出功能

    1.简介 Laravel Excel 在 Laravel 5 中集成 PHPOffice 套件中的 PHPExcel ,从而方便我们以优雅的.富有表现力的代码实现Excel/CSV文件的导入和 导出  ...

  3. Laravel 5使用Laravel Excel实现Excel/CSV文件导入导出的功能详解

    1.简介 本文主要给大家介绍了关于Laravel 5用Laravel Excel实现Excel/CSV文件导入导出的相关内容,下面话不多说了,来一起看看详细的介绍吧. Laravel Excel 在 ...

  4. Data_r_and_w(csv,json,xlsx)

    import osimport sysimport argparsetry:    import cStringIO as StringIOexcept:    import StringIOimpo ...

  5. MySql csv文件导入导出

    一.导出到csv(本地导出) 通过mysql客户端shell连接到服务器,选择使用的数据库,输入sql代码: select * from test_info into outfile '/tmp/te ...

  6. CSV文件导入导出MySQL

    使用SQLyog 工具导入文件数据到MySQL: Excel文件导入导出: 需要驱动:Microsoft Office 2007驱动 导入需要注意的问题:1.Excel里数值列,默认导入会变成浮点型. ...

  7. thinkphp5 csv格式导入导出(多数据处理)

    关于csv文件格式的导出导入个人见解 先上代码: <?php namespace think; class Csv { /** * 导出csv文件 * @param $list 数据源 * @p ...

  8. 完整代码:安卓小软件“CSV联系人导入导出工具”

    完整代码:安卓小软件"CSV联系人导入导出工具" 开发了一个安卓小软件"CSV联系人导入导出工具",欢迎测试.本软件可以帮你快速备份和恢复联系人,不用担心号码遗 ...

  9. 开发了一个安卓小软件“CSV联系人导入导出工具”,欢迎测试

    开发了一个安卓小软件"CSV联系人导入导出工具",欢迎测试.本软件可以帮你快速备份和恢复联系人,不用担心号码遗失,软件操作简单,使用方便. 下载地址: 百度网盘:https://p ...

随机推荐

  1. java日期格式的常用操作

    顾晓北 | 大侠五级 |园豆:9353 | 2016-08-04 16:17     其他回答(1) 0 public class DateUtils extends PropertyEditorSu ...

  2. Scikit-learn 安装

    Scikit-Learn 3 pip 安装 如果安装了Python,没有安装pip,使用Windows + R,输入cmd,回车打开命令行,输入 python -m pip install -U pi ...

  3. reactjs 学习笔记

    1.安装 npm install -g create-react-app create-react-app my-app cd my-app npm start

  4. 移动端canvas文字图片合成并生成图片(canvas宽度自适应移动端屏幕)

    这是我之前做的一个关于文字图片合成的代码,供大家参考,不足支出还望体谅:具体的注释在代码里都有,有什么不懂了可以留言互相交流.<!DOCTYPE html> <html lang=& ...

  5. 信号量(Semaphore)

    在python的多线程体系中,一共有4种锁: 同步锁(互斥锁):Lock: 递归锁:RLock: 信号量:Semaphore: 同步条件锁:Condition. 信号量(semaphore)是一种可以 ...

  6. CentOS 6下升级Python版本

    CentOS6.8默认的python版本是2.6,而现在好多python组件开始只支持2.7以上的版本,比如说我今天遇到的pip install pysqlite,升级python版本是一个痛苦但又常 ...

  7. Paper | 量化CV任务的关联性,寻找最佳迁移策略(Taskonomy)

    目录 1. 问题 2. 方法 3. 实验设计 3.1. 解决词典内部(一组已知)任务的能力 3.2. 解决新任务(少量标记数据)的能力 4. 讨论和启发 论文:Taskonomy: Disentang ...

  8. 再谈docker基本命令

    子曰,温故而知新 今日,再次看书之际,又寻得docker的几条使用命令,用小本本记下来 配置docker镜像源 当我们在拉去一些共有镜像时,默认,docker会向docker.io去获取,如果在拉取的 ...

  9. 宝塔Linux面板 - 7月4日更新 - 5.9免费版

    官网地址:https://www.bt.cn/bbs/thread-1186-1-1.html 安装要求: Python版本: 2.6/2.7(安装宝塔时会自动安装) 内存:128M以上,推荐512M ...

  10. Redis Cluster [WARNING] Node 127.0.0.1:7003 has slots in migrating state (15495).

    错误描述 在迁移一个节点上的slot到另一个节点的时候卡在其中的一个slot报错,截图如下: 查询发现在15495的这个slot上面存在一个key,但是并没有发现这个key有什么问题.使用fix进行修 ...