Newer
Older
smart-metering-front / src / components / excelEdit / index.vue
<!-- 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 { importFile } from './index'
const emits = defineEmits(['initComplete'])
GC.Spread.Common.CultureManager.culture('zh-cn')
// const config = GC.Spread.Sheets.Designer.DefaultConfig
let designer: any = null
let spread: any = null
let sheet: any = null
const designerContainerRef = ref(null) // 引用Designer的宿主Dom元素
// ----------------------------------------初始化相关-----------------------------------------------
// // 左上角按钮事件
// config.commandMap = {
//   Welcome: {
//     title: '执行表格绑定',
//     text: 'Welcome',
//     iconClass: 'ribbon-button-welcome',
//     bigButton: 'true',
//     commandName: 'Welcome',
//     execute: async (context, propertyName, fontItalicChecked) => {
//       handleBindForm()
//     },
//   },
// }
// // 左上角按钮配置
// config.ribbon[0].buttonGroups.unshift({
//   label: 'NewDesigner',
//   thumbnailClass: 'welcome',
//   commandGroup: {
//     children: [
//       {
//         direction: 'vertical',
//         commands: ['Welcome'],
//       },
//     //   // This is custom button ----------------end-------------
//     ],
//   },
// })

// const styleInfo = { height: '86vh', width: '100%' }
// const spreadOptions = {
//   sheetCount: 1, // 表格初始化的时候有几个sheet页
// }

// designer初始化完成
const designerInitialized = async (value: any) => {
  designer.value = value
  spread.value = designer.value!.getWorkbook() // 获取设计器的工作簿
  sheet.value = spread.value!.getActiveSheet() // 获取当前表单
  // excelIO.value = new GC.Spread.Excel.IO()
  console.log('designer.value', designer.value)
  console.log('spread', spread.value)
  console.log('sheet', sheet.value)
  // emits('initComplete', spread.value)

  const res = await fetch('http://111.198.10.15:21408/test/压力表-新_1741080567308.xlsx')
  const file: any = await res.blob()
  importFile(spread.value, file)
}

// -----------------------------------一些表格操作-------------------------------------------------
const handleImportFile = (file: any) => {
  importFile(spread.value, file).then(() => {
    // handleBindForm()
  })
}

// 表格绑定
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.value.getSheet(1) // 获取第几个sheet页
  // sheet.autoGenerateColumns = false
  sheet.setDataSource(datasource)
  // sheet.bindColumns(colInfos)
}

// 表单绑定
function handleBindForm() {
  console.log('执行表单绑定')
  const data = {
    dw: '我是单位',
    dz: '我是地址',
  }
  const source = new GC.Spread.Sheets.Bindings.CellBindingSource(data)
  const sheet = spread.value.getSheet(0) // 获取第几个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()
    designerInitialized1()
  })
}
const closeDialog = () => {
  dialogVisible.value = false
}
// designer初始化完成
async function designerInitialized1() {
  const res = await fetch('http://111.198.10.15:21408/test/压力表-新_1741080567308.xlsx')
  const file = await res.blob()
  spread.import(
    file,
    () => {
      console.log('spread:导入文件成功')
    },
    (e) => {
      console.log('spread:上传文件发生错误', e)
    },
    {
      fileType: GC.Spread.Sheets.FileType.excel,
    },
  )
}
// -------------------------------------------------------------------------------------------
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>
    </template> -->
  </el-dialog>
</template>

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