请选择 进入手机版 | 继续访问电脑版
 找回密码
 立即注册

QQ登录

只需一步,快速开始

裴松晨
注册会员   /  发表于:2025-4-1 10:56  /   查看:100  /  回复:3
200金币
本帖最后由 Wilson.Zhang 于 2025-4-2 09:18 编辑

问题描述:我原本的表样中存在数据源单元格的绑定,而导入进行的excel没有对应的数据单元格绑定,我目前只能通过如下代码循环行列的方式进行单元格赋值,有没有更好的赋值方式    mockGet() {
      
return new Promise((resolve) => {
        
// 模拟延迟用于模拟接口
setTimeout(() => {
          resolve({
data: 'mocked data' }) // 返回模拟数据
}, 50)
      })
    },
  //导入的方法
cancel(excelFile ) {
let excelIo = new ExcelIO.IO()
      var _this = this
      excelIo.open(excelFile, function(json) {_this.ImportInit(json)
      }, function(e) {alert(e.errorMessage)
      })
    }
  },//导入数据需要使用的方法
async ImportInit(json) {
      
// 开始加载动画
this.rowLoading = true
      // 获取spreadsheet页面,做数据的处理
var worksheet = this.spread.getActiveSheet()
      
//原表样的行列数
var rowCount = worksheet.getRowCount()
      
var columnCount = worksheet.getColumnCount()
      
// 使用模拟的接口调用 防止下面的单元格赋值出现卡死情况
await this.mockGet()
      
//导入表样进行赋值后获取行列
const spread = new GC.Spread.Sheets.Workbook();
      
spread.fromJSON(json);
      
var sheet = spread.getActiveSheet()
      
//原表样的行列数与导入的表样行列数一样进入
if(rowCount===sheet.getRowCount()&&columnCount=== sheet.getColumnCount()){
        
for (let row = 0; row < rowCount; row++) {
         
for (let col = 0; col < columnCount; col++) {
            
const value = sheet.getValue(row,col)
            
//判断是否是数值
if (this.isValidNumber(value)) {
              
worksheet.setValue(row, col, value)
            }
          }
        }
      }
else{
        
return this.$message({          message: '模板不对应',          type: 'warning',
         
duration: 1500
        })
      }
      
this.rowLoading = false // 关闭加载动画
//重新计算页面中的所有公式
worksheet.recalcAll(true)
    }


最佳答案

查看完整内容

那可以使用Worksheet:setValue()或Worksheet:setArray()填充数据,借助挂起/恢复绘制、挂起/恢复计算等机制优化性能。如果两个文件内部结构一致,且场景单一,那么可以在代码中可以记录内部结构特征,对连续单元格中的数据,使用Worksheet:getArray()获取后再用Worksheet:setArray()填充。

3 个回复

倒序浏览
最佳答案
最佳答案
Wilson.Zhang
超级版主   /  发表于:2025-4-1 10:56:12
来自 4#
裴松晨 发表于 2025-4-1 14:32
我导出的情况下使用的是ssjson,但是我的场景是别的用户是往excel里面填充数据,我将excel的数据导入赋值 ...

那可以使用Worksheet:setValue()或Worksheet:setArray()填充数据,借助挂起/恢复绘制挂起/恢复计算等机制优化性能。如果两个文件内部结构一致,且场景单一,那么可以在代码中可以记录内部结构特征,对连续单元格中的数据,使用Worksheet:getArray()获取后再用Worksheet:setArray()填充。
回复 使用道具 举报
Wilson.Zhang
超级版主   /  发表于:2025-4-1 14:25:36
2#
本帖最后由 Wilson.Zhang 于 2025-4-1 14:26 编辑

您好!从您提供的代码片段来看,主要是读入文件后通过Worksheet:setValue()逐个单元格填充数据。

请教下您是用SpreadJS设置了单元格绑定路径后保存为xlsx文件吗?这样的话,excel文件中不会保留绑定路径信息,因此再将其导入SpreadJS后没有可参考的绑定路径信息。此时,可以通过Worksheet:setValue()依次对单元格填充数据,或者Worksheet:setArray()批量为一个连续区域中的单元格填充数据。

如果您希望导出文件可以保留模板中设置的绑定路径信息,可以将工作簿保存为ssjson或sjs文件。这样,即可利用文件中的绑定路径实行数据绑定,快速高效填充数据。如下动图所示:
数据绑定.gif

回复 使用道具 举报
裴松晨
注册会员   /  发表于:2025-4-1 14:32:16
3#
Wilson.Zhang 发表于 2025-4-1 14:25
您好!从您提供的代码片段来看,主要是读入文件后通过Worksheet:setValue()逐个单元格填充数据。

请教下 ...

我导出的情况下使用的是ssjson,但是我的场景是别的用户是往excel里面填充数据,我将excel的数据导入赋值在我对应的ssjson模板绑定数据源的单元格中,然后将这个数据进行保存
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 立即注册
返回顶部