Skip to content

Excel操作

uploadExcel

弹窗上传并解析 Excel 文件(支持 .xlsx 格式)。

语法:

js
uploadExcel(callback)

参数:

参数名类型必填说明
callbackfunction解析 excel 回调函数

示例:

js
// 上传并解析 Excel 文件
uploadExcel((excelData) => {
    console.log("Excel数据:", excelData);
    // 处理解析后的 Excel 数据
    processData(excelData);
});

export_byjson

根据 JSON 数据导出 Excel 文件,支持多工作簿、自定义格式化和表头合并。

语法:

js
export_byjson(fileName, sheets)

参数:

参数名类型必填说明
fileNamestring文件名(不用写扩展名),例如:"导出文件"
sheetsArray工作簿数据列表,支持多个工作簿

sheets 数组项参数说明:

参数名类型必填说明
namestring工作簿(sheet)名称
columnsArray列配置,格式:[{caption:"姓名", key:"id"}]
dataArray接口返回的数据
formatFunction自定义格式化函数
topsArray表头顶部内容,二维数组

columns 参数说明:

参数名类型说明
captionstring表头名称
keystring对应数据的字段名
widthnumber列宽
mergeboolean是否合并(true 合并,false 不合并)
mergecheckstring合并参考字段

format 函数说明:

js
obj.format = function(sheet, title_index) {
  // sheet:工作簿对象,参考 SheetJS 文档:
  // https://github.com/rockboom/SheetJS-docs-zh-CN#utility-functions
  // title_index:表头在 Excel 的行号
  //   小于该行号的是表头顶部(没有表头顶部则为 0)
  //   大于该行号的是表体部分

  return sheet; // 处理完必须 return 回去
};

tops 参数说明:

表头顶部内容,二维数组格式,每个子数组代表一行。

js
obj.tops = [
  ["某某某某报表"],                    // 表头顶部第一行
  ["客户信息","商品信息","商品信息","商品信息","价格","价格","价格","创建时间"]  // 表头顶部第二行
];

示例:

基础导出(多工作簿):

js
function json_exp() {
  // 指令读取数据
  var list = runCommand(getPageId(), "outuser", {});

  // 数据处理
  list = list.map((item) => {
    return {
      ...item,
      SEX: (item.SEX == 1) ? "男" : (item.SEX == 2 ? "女" : "")
    };
  });

  // 工作簿1
  var sheet_obj = new Object();
  sheet_obj.name = "工作簿A";
  sheet_obj.columns = [
    { "caption": "用户名", "key": "USERNAME", "width": 15 },
    { "caption": "姓名", "key": "NAME" },
    { "caption": "性别", "key": "SEX", "width": 12 },
    { "caption": "手机号", "key": "MOBILE" }
  ];
  sheet_obj.data = list;

  // 工作簿2
  var sheet_obj2 = new Object();
  sheet_obj2.name = "工作簿B";
  sheet_obj2.columns = [
    { "caption": "姓名", "key": "NAME" },
    { "caption": "创建时间", "key": "CREATE_TIME", "width": 20 },
    { "caption": "手机号", "key": "MOBILE" }
  ];
  sheet_obj2.data = list;

  // 封装列表
  var sheets = [];
  sheets.push(sheet_obj);
  sheets.push(sheet_obj2);

  // 调用导出
  export_byjson('导出de文件', sheets);
}

复杂表格导出(多表头、单元格合并、样式自定义、公式写入):

js
function multi_header_exp() {
  var sheets = [];

  // 定义单个工作簿对象
  var one_sheet = new Object();
  one_sheet.name = "报表";

  // 表头顶部内容(表头顶部可以有多行)
  one_sheet.tops = [
    ["某某某某报表"],
    ["客户信息", "商品信息", "商品信息", "商品信息", "价格", "价格", "价格", "创建时间"]
  ];

  // 表头的列(表头只有一行,就是表体上面的那行)
  // 参数:caption:文字 | key:字段 | merge:是否合并 | mergecheck:合并检查(不填默认自己) | width:宽度
  one_sheet.columns = [
    { caption: "客户", key: "cus", merge: true },
    { caption: "订单号", key: "ord", merge: true, mergecheck: ['cus', 'ord'] },
    { caption: "产品名称", key: "prod" },
    { caption: "供应商", key: "gys" },
    { caption: "采购单价", key: "price" },
    { caption: "数量", key: "num" },
    { caption: "总和", key: "total" },
    { caption: "创建时间", key: "time", width: 35 }
  ];

  // 表格数据(可以调指令获取)
  one_sheet.data = get_data();

  // 表格自定义格式化
  one_sheet.format = function(sheet, title_index) {
    // 遍历整个工作簿
    for (var key in sheet) {
      // 将 excel 坐标转换表格坐标
      var zb = XLSX.utils.decode_cell(key);
      var c = zb.c;
      var r = zb.r;

      if (r == 0) {
        // 标题样式
        sheet[key].s = get_style("title");
      } else if (r <= title_index && r > 0) {
        // 表头部分(含表头顶部自定义内容,部分单元格跟表头合并)
        sheet[key].s = get_style("head");
      } else {
        // 表体部分

        // 写入公式(G列:总和 = 采购单价 * 数量)
        if (/^G.*/ig.test(key)) {
          var num = key.replace(/[^0-9]/ig, '');
          sheet[key].t = 'n';
          sheet[key].f = 'E' + num + '*F' + num;
        }

        // 特定列颜色(B列:橙色)
        if (/^B.*/ig.test(key)) {
          sheet[key].s = get_style("orange");
        }

        // 数量颜色(F列:正数绿色,负数红色,零蓝色)
        if (/^F.*/ig.test(key)) {
          var num = sheet[key].v;
          if (parseInt(num) > 0) {
            sheet[key].s = get_style("green");
          } else if (parseInt(num) < 0) {
            sheet[key].s = get_style("red");
          } else {
            sheet[key].s = get_style("blue");
            sheet[key].v = 0;
            sheet[key].t = 'n';
          }
        }
      }
    }

    // 处理单元格合并
    // 顶部标题文字合并(第0行,合并8列)
    sheet['!merges'].push({ s: { r: 0, c: 0 }, e: { r: 0, c: 7 } });
    // 商品信息合并(第1行,1-3列)
    sheet['!merges'].push({ s: { r: 1, c: 1 }, e: { r: 1, c: 3 } });
    // 价格合并(第1行,4-6列)
    sheet['!merges'].push({ s: { r: 1, c: 4 }, e: { r: 1, c: 6 } });
    // 客户信息合并(第1-2行,0列)
    sheet['!merges'].push({ s: { r: 1, c: 0 }, e: { r: 2, c: 0 } });
    // 创建时间合并(第1-2行,7列)
    sheet['!merges'].push({ s: { r: 1, c: 7 }, e: { r: 2, c: 7 } });

    // 处理完后要把对象 return 回去
    return sheet;
  };

  sheets.push(one_sheet);

  // 通过 json 导出 excel
  export_byjson('导出', sheets);
}

format 函数中的合并参数说明:

参数类型说明
sObject合并起始位置,{r: 行号, c: 列号}
eObject合并结束位置,{r: 行号, c: 列号}

format 函数中的样式处理:

通过 sheet[key].s 设置单元格样式,get_style() 为自定义样式方法,可传入参数区分不同样式类型(如 "title""head""green""red" 等)。

selectFileNoUpload

选择文件但不上传(仅获取文件信息)。

语法:

js
selectFileNoUpload(params, callback)

参数:

参数名类型必填说明
paramsObject上传参数
callbackfunction回调函数

示例:

js
// 选择文件但不上传
var selectParams = {
    accept: ".xlsx,.xls"
};
selectFileNoUpload(selectParams, (fileInfo) => {
    console.log("选择的 Excel 文件:", fileInfo);
    // 可以在这里进行其他处理
});

基于 MIT 许可发布