Appearance
Excel操作
uploadExcel
弹窗上传并解析 Excel 文件(支持 .xlsx 格式)。
语法:
js
uploadExcel(callback)参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| callback | function | 是 | 解析 excel 回调函数 |
示例:
js
// 上传并解析 Excel 文件
uploadExcel((excelData) => {
console.log("Excel数据:", excelData);
// 处理解析后的 Excel 数据
processData(excelData);
});export_byjson
根据 JSON 数据导出 Excel 文件,支持多工作簿、自定义格式化和表头合并。
语法:
js
export_byjson(fileName, sheets)参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| fileName | string | 是 | 文件名(不用写扩展名),例如:"导出文件" |
| sheets | Array | 是 | 工作簿数据列表,支持多个工作簿 |
sheets 数组项参数说明:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| name | string | 是 | 工作簿(sheet)名称 |
| columns | Array | 是 | 列配置,格式:[{caption:"姓名", key:"id"}] |
| data | Array | 是 | 接口返回的数据 |
| format | Function | 否 | 自定义格式化函数 |
| tops | Array | 否 | 表头顶部内容,二维数组 |
columns 参数说明:
| 参数名 | 类型 | 说明 |
|---|---|---|
| caption | string | 表头名称 |
| key | string | 对应数据的字段名 |
| width | number | 列宽 |
| merge | boolean | 是否合并(true 合并,false 不合并) |
| mergecheck | string | 合并参考字段 |
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 函数中的合并参数说明:
| 参数 | 类型 | 说明 |
|---|---|---|
| s | Object | 合并起始位置,{r: 行号, c: 列号} |
| e | Object | 合并结束位置,{r: 行号, c: 列号} |
format 函数中的样式处理:
通过 sheet[key].s 设置单元格样式,get_style() 为自定义样式方法,可传入参数区分不同样式类型(如 "title"、"head"、"green"、"red" 等)。
selectFileNoUpload
选择文件但不上传(仅获取文件信息)。
语法:
js
selectFileNoUpload(params, callback)参数:
| 参数名 | 类型 | 必填 | 说明 |
|---|---|---|---|
| params | Object | 是 | 上传参数 |
| callback | function | 是 | 回调函数 |
示例:
js
// 选择文件但不上传
var selectParams = {
accept: ".xlsx,.xls"
};
selectFileNoUpload(selectParams, (fileInfo) => {
console.log("选择的 Excel 文件:", fileInfo);
// 可以在这里进行其他处理
});