pl-export-excel

简单、高效、灵活的 JavaScript Excel 导出工具

简单易用

极简 API 设计,一行代码即可实现 Excel 导出,无需复杂配置和学习成本

高度灵活

支持自定义表头、多级表头、单元格合并、样式定制等高级功能,满足各种导出需求

跨平台兼容

兼容所有现代浏览器,支持桌面端和移动端使用

轻量高效

体积小巧,无冗余依赖,导出速度快,即使处理大量数据也能保持流畅体验

样式定制

支持自定义字体、颜色、背景、边框等样式,导出的 Excel 美观专业

灵活扩展

支持自定义回调函数,可根据需求扩展功能,满足复杂业务场景

快速开始

只需三步,即可实现 Excel 导出功能

1

安装或引入

通过NPM or CDN 直接引入

<!-- npm 引入 -->
npm i pl-export-excel

<!-- CDN 引入 -->
<script src="https://gcore.jsdelivr.net/npm/pl-export-excel/dist/index.full.min.js"></script>
                
2

准备数据

准备表头和表格数据,支持数组格式

// 表头配置
const headers = [
  { title: "经销商名称", key: "names" },
  { title: "下单时间", key: "date" },
  { title: "订单编号", key: "orderNumber" },
  { title: "客户名称", key: "customerName" }
];

// 表格数据
const datas = Array.from({ length: 10 }, (_, idx) => ({
  names: "娃哈哈",
  date: "2023-11-20",
  orderNumber: idx + 1,
  customerName: "王小虎" + idx + 1
}));
3

调用导出函数

调用 exportJsonToExcel 函数,即可完成导出

// 导出 Excel
import { exportJsonToExcel } from 'pl-export-excel'
exportJsonToExcel({
  headers,
  datas,
  filename: "订单表格" // 可选,指定文件名
});

API 文档

详细的 API 配置说明,满足各种导出需求

exportJsonToExcel(options)

Excel 导出主函数,接收配置参数对象,方法返回Promise<void>

参数名 类型 是否必填 说明
datas Array 表格数据
headers Array 表头部配置, 配置描述请看文档下面
titleConfig Object 主标题配置, 配置描述请看文档下面
merges Array 合并单元格配置, 配置描述请看文档下面
multiHeader Array 多级头, 给表格设置多行头部,需要自己去合并单元格。
filename String 导出文件名称,默认值为 "excel-list"
autoWidth Boolean 宽度是否自适应, 默认值为false
bookType String 文件类型,默认值为 "xlsx"
styleCb Function 样式表? 自定义回调函数,可自定义单元格样式
xlsxStyleResourceUrl String 自定义xlsx样式资源地址,基本用不到

excelToJson(options)

把一个Excel File转成数组Json, 方法返回Promise<{ originalList: any[]; formatList: any[] }>

参数名 类型 是否必填 说明
file File 转换的文件
startRow number 指定某一行之前为消除标题条目;当表格有标题时,或者某些行你想跳过时这是非常有用的。
keys Array 转成数组对象必填,单元格每列它所对应的key值
xlsxStyleResourceUrl String 自定义xlsx样式资源地址,基本用不到

ts type declare

```ts
/** 主标题配置 */
export type ISubTitle = {
  /** 标题文本 */
  title: string | number;
  /** 需要合并行数 */
  rowNum: number;
  /** 需要合并列数-默认为headers字段的长度 */
  colNum?: number;
};

/** 表头部配置, 导出后表格头部的顺序就是数组的顺序 */
export type IHeaders = {
  /** 表头标题文本 */
  title: string | number;
  /** key值: 对应表格数据中的字段key名 */
  key: string;
}[];

/**
 * 合并单元格配置: c or r: 0开始计算
 * 示例:
 * {
     s: {
        // s为开始
        c: 0, //开始列, 0开始计算
        r: 0 //开始行, 0开始计算
      },
     e: {
        // e结束
        c: 5, //结束列, 0开始计算
        r: 1 //结束行, 0开始计算
      }
   }
 */
export type IMerges = { s: { c: number; r: number }; e: { c: number; r: number } };
```

示例演示

点击下方按钮,体验不同场景下的 Excel 导出效果

基础导出

最简单的 Excel 导出,包含基本表头和数据

// 指定某些字段导出
const headers = [
  { title: "经销商名称", key: "names" },
  { title: "下单时间", key: "date" },
  { title: "订单编号", key: "orderNumber" },
  { title: "客户名称", key: "customerName" }
];

const datas = Array.from({ length: 200 }, (_, idx) => ({
  names: "娃哈哈",
  date: "2023-11-20",
  orderNumber: idx + 1,
  orderState: "在线",
  orderPayState: "全付款",
  customerName: "王小虎" + idx + 1
}));

exportJsonToExcel({ headers, datas });

带标题导出

导出带有标题的 Excel,支持设置标题占用行数

exportJsonToExcel({
  headers: [
    { title: "经销商名称", key: "names" },
    { title: "下单时间", key: "date" },
    { title: "订单编号", key: "orderNumber" },
    { title: "客户名称", key: "customerName" },
    { title: "城市", key: "city" },
    { title: "地址", key: "address" }
  ],
  datas: list,
  filename: "11月订单表格",
  // 标题配置
  titleConfig: {
    title: "11月订单表格",
    rowNum: 2 // 标题占用2行
  }
});

高级导出(合并单元格 + 自定义样式)

支持多级表头、单元格合并和自定义样式的高级导出功能

exportJsonToExcel({
  headers: [
    { title: "经销商名称", key: "names" },
    { title: "下单时间", key: "date" },
    { title: "订单编号", key: "orderNumber" },
    { title: "客户名称", key: "customerName" },
    { title: "城市", key: "city" },
    { title: "地址", key: "address" }
  ],
  datas: list,
  filename: "12月订单表格",
  // 多级头, 二维数组里面的每一个数组代表一行
  multiHeader: [
    ["标题1", "", "", "", "", ""],
    // 为了合并头,需要设置当前行的每一个单元格,属于占位单元格
    ["", "", "", "", "", ""],
    ["标题2", "", "", "", "", ""]
  ],
  // 合并多级头为一个单元
  merges: [
    {
      s: {
        //s为开始
        c: 0, //开始列, 0开始计算
        r: 0 //开始行, 0开始计算
      },
      e: {
        //e结束
        c: 5, //结束列, 0开始计算
        r: 1 //结束行, 0开始计算
      }
    },
    {
      s: {
        //s为开始
        c: 0, //开始列, 0开始计算
        r: 2 //开始行, 0开始计算
      },
      e: {
        //e结束
        c: 5, //结束列, 0开始计算
        r: 2 //结束行, 0开始计算
      }
    }
  ],
  // 自定义单元格样式
  styleCb: function (cellKeys) {
    console.log(cellKeys)
    const obj = {};
    /**
      * 返回一个如obj = {
        // A1代表第一个单元格,对象为一个样式对象类型为:(IOriginalStyles)
      A1: {
        ...
      }
      }
    */
    obj[cellKeys[0]] = {
      fontFamily: "微软雅黑",
      fontSize: 16,
      color: "#CD0000",
      isBold: true,
      fgColor: "#AEEEEE"
    };
    obj[cellKeys[2]] = {
      fontFamily: "微软雅黑",
      fontSize: 16,
      color: "#33ff99",
      fgColor: "#CD950C"
    };

    for (let i = 0; i < cellKeys.length; i++) {
      // 给地址这一列设置样式
      if (cellKeys[i].includes("F")) {
        obj[cellKeys[i]] = {
          wrapText: true
        }
      }
    }

    return obj;
  }
});

excelToJson的使用

假如传入电子表格如图:

调用如下方法

const res = await excelToJson({
  file,
  startRow: 3,
  keys: ["names", "date", "orderNumber", "customerName", "city", "address"]
});
console.log(res);
/**
输出res:
[
 {
  address: "上海金沙江路200号",
  city: "上海",
  customerName: "王小虎01",
  date: "2023-11-20",
  names: "娃哈哈",
  orderNumber: "1"
 },
 ....
 ....
]
*/