Richard.Huang 发表于 2024-2-26 15:25:03

离线填报下数据源和模板的导出方案

背景
我们通过数据绑定实现的填报都是需要先绑定一个空的数据源,然后填报结束后通过getDataSource()方法获取到这个数据源,并传给后端进行持久化。我们在后端的存储也往往是数据源和空模板进行分开存储的。但会偶尔有小伙伴有这种离线填报的需求,我无法跟后端建立连接,但是我需要提前将大量的数据填写好,等待可以传输给后端时再给后端传输数据。这期间就会有,导出填报内容,再导入的情景,在第二次导入后,如果我们的逻辑是绑定一个空数据源,那么用户填报的数据就丢失了,如果不填报数据源 ,那么就无法将用户填报的数据拿出来传给后端进行持久化,这种情况下应该怎么做呢?这里我们可以借助导出的json这个自由的结构体来实现。

实现方式
1. 导入文件
var reader = new FileReader();
let jsonFile = _getElementById("jsonFile").files;
reader.addEventListener("loadend", function (e) {
    var json = JSON.parse(reader.result);
    spread.fromJSON(json);
    let data = json.mydatasource || {};
    let sheet = spread.getActiveSheet()
    let len = sheet.tables.all().length;
    for (let i = 0; i < len; i++) {
      let bp = sheet.tables.all().bindingPath();
      if (!(bp in data)) {
            data = [{}];
      }
    }
    let source = new GC.Spread.Sheets.Bindings.CellBindingSource(data);
    sheet.setDataSource(source);
})
reader.readAsText(jsonFile);2. 导出文件
// 处理数据源
let json = spread.toJSON()
let sheet = spread.getActiveSheet()
let mydatasource = {}
if (sheet.getDataSource()) {
    mydatasource = sheet.getDataSource().getSource();
}
let outputspread = new GC.Spread.Sheets.Workbook();
json.mydatasource = mydatasource;
// 将字符串转换为Blob对象
let blob = new Blob(, { type: 'application/json' });
// 创建一个指向该Blob的URL
let fileUrl = URL.createObjectURL(blob);
// 创建一个临时的a标签用于触发下载
let downloadLink = document.createElement('a');
downloadLink.href = fileUrl;
downloadLink.download = _getElementById("exportFileName").value; // 指定下载文件名

// 将a标签插入到文档中并模拟点击进行下载
document.body.appendChild(downloadLink);
downloadLink.click();

// 清理临时的URL和下载链接
document.body.removeChild(downloadLink);
URL.revokeObjectURL(fileUrl);实现效果

完整代码


页: [1]
查看完整版本: 离线填报下数据源和模板的导出方案