Ellia.Duan 发表于 2024-10-29 15:16:38

报表插件(ReportSheet)实现添加记录时弹窗输入表单内容

在ReportSheet预览模式下,如果需要添加记录,我们此时可以右键,出现上下文菜单,选择“添加记录”。发现会出现一个空白行进行数据填报。

但是当列很多,希望弹窗一个窗口,用Form表单的形式去添加记录,该如何实现呢?
下文,我们将探索这个需求。

首先,我们需要引入一个弹窗组件,本文以Element-UI组件中的Drawer组件为例进行介绍。
接下来,我将介绍如何在添加记录的时候,弹窗,进行表单的填写,确定后,回填到报表中。
一、设置数据源、报表
在designerInitialized方法中,设置数据源,初始化报表,以及设置模板
designerInitialized(designer) {
      this.designer = designer;
      const spread = designer.getWorkbook()
      this.spreadDom = spread.getHost()
      spread.suspendPaint()
      const reportSheet = spread.addSheetTab(0, '报表1', GC.Spread.Sheets.SheetType.reportSheet);
      const templateSheet = reportSheet.getTemplate();
      templateSheet.getRange(0, 0, 2, 4).backColor('pink')
      let data = [
      {id: 1, name: "张三", age: 27, sex: 0},
      {id: 2, name: "李四", age: 31, sex: 1},
      {id: 3, name: "小王", age: 22, sex: 1},
      {id: 4, name: "小韩", age: 45, sex: 0},
      {id: 5, name: "小明", age: 25, sex: 0},
      ];
      const ordersTable = spread.dataManager().addTable('person', {data});
      ordersTable.fetch().then(() => {
      const columns = ['id', 'name', 'age', 'sex'];
      columns.forEach((columnName, i) => {
          templateSheet.setValue(0, i, columnName);
          let obj = {
            type: 'List',
            binding: `person[${columnName}]`,
          };
          if (i == 0) {
            obj.defaultValue = "=sjs.uuid()"
          }
          templateSheet.setTemplateCell(1, i, obj);
      });
      templateSheet.getRange(0, 0, 2, 4).hAlign(GC.Spread.Sheets.HorizontalAlign.center);
      templateSheet.getRange(0, 0, 2, 4).borderLeft(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
      templateSheet.getRange(0, 0, 2, 4).borderRight(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
      templateSheet.getRange(0, 0, 2, 4).borderTop(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
      templateSheet.getRange(0, 0, 2, 4).borderBottom(new GC.Spread.Sheets.LineBorder("black", GC.Spread.Sheets.LineStyle.thin));
      templateSheet.setFormatter(1,3,'[=0]男;[=1]女')
      templateSheet.setColumnVisible(0,false)

      reportSheet.refresh();

      });
      reportSheet.renderMode('Preview');
      spread.resumePaint()
    },在上述代码中,我们设置了静态数据源,添加了报表,并且在template中设置了字段,添加了样式。
上述代码中,需要注意的是,我们为id设置了默认值,=sjs.uuid(),所以在数据填报时,可以将此字段隐藏。
二、设置弹窗
<el-drawer
      title="请添加记录!"
      :before-close="handleClose"
      :visible.sync="dialog"
      direction="rtl"
      custom-class="demo-drawer"
      ref="drawer"
    >
      <div class="demo-drawer__content">
      <el-form :model="form">
          <el-form-item label="姓名" :label-width="formLabelWidth">
            <el-input v-model="form.name" autocomplete="off"></el-input>
          </el-form-item>
          <el-form-item label="年龄" :label-width="formLabelWidth">
            <el-input v-model="form.age" autocomplete="off"></el-input>
          </el-form-item>
          <el-form-item label="性别" :label-width="formLabelWidth">
            <el-select v-model="form.sex">
            <el-option label="男" value="0"></el-option>
            <el-option label="女" value="1"></el-option>
            </el-select>
          </el-form-item>
      </el-form>
      <div class="demo-drawer__footer">
          <el-button @click="cancelForm">取 消</el-button>
          <el-button type="primary" @click="$refs.drawer.closeDrawer()" :loading="loading">
            {{ loading ? '提交中 ...' : '确 定' }}
          </el-button>
      </div>
      </div>
    </el-drawer>下面是data数据

data: function () {

    return {
      dialog: false,
      loading: false,
      form: {
      name: '',
      age: "",
      sex: ""
      },
      formLabelWidth: '80px',
      timer: null,
      styleInfo: {height: "98vh", width: '100%'},
      designer: null,
      spreadDom: null
    };

三、设置右键菜单
我们需要修改下“添加记录”对应的逻辑,使dialog参数为true
var designerConfig = JSON.parse(JSON.stringify(GC.Spread.Sheets.Designer.DefaultConfig))
      let newCommand = GC.Spread.Sheets.Designer.getCommand('reportSheetAddRecord');
      newCommand.execute = () => {
      console.log('this.dialog', this.dialog)
      this.dialog = true
      }
      designerConfig.commandMap = {"reportSheetAddRecord": newCommand};
      designer.setConfig(designerConfig)
四、设置添加记录
   handleClose(done) {
      if (this.loading) {
      return;
      }
      let spread = GC.Spread.Sheets.findControl(this.spreadDom)
      let reportSheet = spread.getActiveSheetTab()
      let sheet = reportSheet.getSheet();
      letactiveCellRow = sheet.getActiveRowIndex() ;
      letactiveCellColumn = sheet.getActiveColumnIndex();
      reportSheet.addRecordAt(activeCellRow, activeCellColumn);
      //addRecordAt会改变active cell 所以需要重新获取下activeCellRow和activeCellColumn
      activeCellRow = sheet.getActiveRowIndex();
      activeCellColumn = sheet.getActiveColumnIndex();
      reportSheet.updateCellValue(activeCellRow, activeCellColumn , this.form.name)
      reportSheet.updateCellValue(activeCellRow, activeCellColumn + 1, this.form.age)
      reportSheet.updateCellValue(activeCellRow, activeCellColumn + 2, this.form.sex)
      this.form.name = ''
      this.form.age = ''
      this.form.sex = ''
      done()
    },
最后结果:

demo:





页: [1]
查看完整版本: 报表插件(ReportSheet)实现添加记录时弹窗输入表单内容