Newer
Older
smart-metering-front / src / views / business / lab / excelEdit / excelEditDialog.vue
dutingting on 27 Mar 5 KB 图片、表单绑定
<!-- excel在线编辑 -->
<script setup lang="ts" name="ExcelEditDialog">
import '@grapecity-software/spread-sheets/styles/gc.spread.sheets.excel2013white.css'
import '@grapecity-software/spread-sheets-designer/styles/gc.spread.sheets.designer.min.css'
import GC from '@grapecity-software/spread-sheets'
import '@grapecity-software/spread-sheets-shapes'
import '@grapecity-software/spread-sheets-charts'
import '@grapecity-software/spread-sheets-slicers'
import '@grapecity-software/spread-sheets-print'
import '@grapecity-software/spread-sheets-barcode'
import '@grapecity-software/spread-sheets-pdf'
import '@grapecity-software/spread-sheets-pivot-addon'
import '@grapecity-software/spread-sheets-tablesheet'
import '@grapecity-software/spread-sheets-ganttsheet'
import '@grapecity-software/spread-sheets-formula-panel'
import '@grapecity-software/spread-sheets-reportsheet-addon'
import '@grapecity-software/spread-sheets-io'
import '@grapecity-software/spread-excelio'
import '@grapecity-software/spread-sheets-resources-zh'
// 注意:spread-sheets-designer-resources-cn 与 spread-sheets-designer 的先后顺序
import '@grapecity-software/spread-sheets-designer-resources-cn'
import '@grapecity-software/spread-sheets-designer'
import qrImg from '../../../../assets/images/qrExample.png'
import { exportFile, importFile } from './methods/file'
import bindForm from './methods/bind/bindForm'
import { bindPicture, getSpanInfo } from './methods/bind/bindPicture'
import { importSjsFile } from './index'
const emits = defineEmits(['initComplete'])
GC.Spread.Common.CultureManager.culture('zh-cn')
let designer: any = null
let spread: any = null
let sheet: any = null
const designerContainerRef = ref(null) // 引用Designer的宿主Dom元素
// ----------------------------------------初始化相关-----------------------------------------------
// designer初始化完成
async function initComplete() {
  emits('initComplete', spread)
}

// -----------------------------------导入导出-------------------------------------------------
// 执行导入文件
const handleImportFile = (file: any, data: any) => {
  // 导入完成
  importFile(spread, file).then(() => {
    // 绑定数据
    bindForm(spread, data)

    // getSpanInfo(sheet, 52, 20)
    // bindPicture(sheet, )
    handleBindPicture()
  })
}
// 执行导出文件
const handleExportFile = async () => {
  const blob = await exportFile(spread, 'xlsx', true)
  console.log('获取到文件', blob)
}

// -----------------------------------图片-------------------------------------------------------
function handleBindPicture() {
  const sheet = spread.getSheetFromName('证书首页') // 获取证书首页sheet页
  // 二维码章
  bindPicture(
    sheet,
    'qr',
    qrImg,
    150,
    150,
    51,
    19,
  )
  // 校准专用章
  bindPicture(
    sheet,
    'singer',
    'http://111.198.10.15:21408/test/校准专用章新_1711095570061.png',
    180,
    120,
    36,
    13,
  )
}

// -----------------------------------数据绑定-------------------------------------------------
// 表格绑定
function handleBindTable() {
  console.log('执行表格绑定')
  const datasource = {
    dw: '我是单位',
    dz: '我是地址',
  }
  // var datasource = [
  //   { name: 'Alice', age: 27, birthday: '1985/08/31', position: 'PM' },
  // ]
  // var colInfos = [
  //   { name: 'position', displayName: '姓名', size: 50, visible: false },
  //   { name: 'name', displayName: 'Display Name', size: 70 },
  //   { name: 'birthday', displayName: 'Birthday', formatter: 'd/M/yy', size: 120 },
  //   { name: 'age', displayName: 'Age', size: 40, resizable: false },
  // ]
  const sheet = spread.getSheet(1) // 获取第几个sheet页
  // sheet.autoGenerateColumns = false
  sheet.setDataSource(datasource)
  // sheet.bindColumns(colInfos)
}

// 表单绑定
function handleBindForm(formData: any) {
  console.log('执行表单绑定')
  const data = {
    certificateNo: '12345678987',
    dz: '我是地址',
  }
  const source = new GC.Spread.Sheets.Bindings.CellBindingSource(data)
  const sheet = spread.getSheet(2) // 获取第几个sheet页
  sheet.setDataSource(source)
}

// ----------------------------------弹窗基本操作-----------------------------------------------
const dialogVisible = ref(false) // 弹窗显示
const loading = ref(false)
// 初始化弹窗
const initDialog = (id: string, sampleid: string, orderid: string) => {
  dialogVisible.value = true
  nextTick(() => {
    designer = new GC.Spread.Sheets.Designer.Designer(designerContainerRef.value)
    spread = designer.getWorkbook() // 创建工作簿实例
    sheet = spread.getActiveSheet() // 获取当前活动工作表
    initComplete()
  })
}
const closeDialog = () => {
  dialogVisible.value = false
}

// -------------------------------------------------------------------------------------------
defineExpose({ initDialog, handleImportFile })
</script>

<template>
  <el-dialog v-model="dialogVisible" v-loding="loading" :z-index="1200" append-to-body class="excel-edit-dialog" :fullscreen="true" title="excel在线编辑" width="700" @close="closeDialog">
    <div id="designer-container" ref="designerContainerRef" />
    <template #footer>
      <el-button type="info" @click="closeDialog">
        关闭
      </el-button>
      <!-- <el-button type="info" @click="handleBindForm">
        绑定
      </el-button> -->
      <el-button type="info" @click="handleExportFile">
        导出
      </el-button>
    </template>
  </el-dialog>
</template>

<style lang="scss">
#designer-container {
  width: 100%;
  height: 86vh;
}
</style>