<template> <div> <hot-table ref="searchForm" :data="hotSettings.dataList" :context-menu="hotSettings.contextMenu" :col-headers="hotSettings.colHeaders" :start-rows="hotSettings.startRows" :start-cols="hotSettings.startCols" :row-headers="hotSettings.rowHeaders" :row-heights="hotSettings.rowHeights" :manual-row-resize="hotSettings.manualRowResize" :manual-column-resize="hotSettings.manualColumnResize" :manual-row-move="hotSettings.manualRowMove" :columns="hotSettings.columns" :before-remove-row="hotSettings.beforeRemoveRow" :after-create-row="hotSettings.afterCreateRow" :after-change="afterChangeMe" class="table_hot" license-key="non-commercial-and-evaluation" /> <button @click="saveSubmit">xxx</button> </div> </template> <script> import { HotTable } from '@handsontable-pro/vue' import Handsontable from 'handsontable' const validatorList = (rule, value, callback) => { for (let i = 0; i < value.length; i++) { if (!value[i].region || !value[i].destination) { callback(new Error('請輸入價格表中所有信息, 多余的可通過鼠標右擊進行刪除行')) return } } callback() } const riseWeightVal = function (value, callback) { if (/^\d+(?=\.{0,1}\d+$|$)/.test(value) || value === '') { callback(true) } else { alert('請輸入數字') callback(false) } } export default { name: 'app', components: { HotTable }, data() { return { // addressList: [{ // area: [] // }], arr:[], demo:['a','b','c','d'], hotSettings: { dataList: [], // colHeaders: [ '數據名稱','單位', '小數位', '最小值', '最大值', '最小原始值','最大原始值','寄存器類型','寄存器地址','數據格式','數據位','字節順序','UnitidID'], startRows: 8, startCols: 6, rowHeaders: true, rowHeights: 40, manualRowResize: true, manualColumnResize: true, manualRowMove: true, customBorders: true, columns: [ //data: dataList數組中對應的 鍵,readOnly: 只讀, type: 屬於什么類型 例:text, numeric, validator: 數據驗證 { data: 'name', //data上傳對應字段 }, { data: 'unit', //id type: 'dropdown', //下拉選擇 source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'], strict: false //是否嚴格匹配 }, { data: 'decimalPlace', //id type: 'dropdown', //下拉選擇 source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'], strict: false //是否嚴格匹配 }, { data: 'min', //data上傳對應字段 type: 'numeric', //數值 }, { data: 'max', //data上傳對應字段 type: 'numeric', //數值 }, { data: 'oddMin', //data上傳對應字段 type: 'numeric', //數值 }, { data: 'oddMax', //data上傳對應字段 type: 'numeric', //數值 }, { data: 'type', //id type: 'dropdown', //下拉選擇 source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'], strict: false , //是否嚴格匹配 }, { data: 'address', //data上傳對應字段 type: 'numeric', //數值 }, { data: 'format', //id type: 'dropdown', //下拉選擇 source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'], strict: false //是否嚴格匹配 }, { data: 'dataBits', type: 'dropdown', //下拉選擇 source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'], strict: false //是否嚴格匹配 }, { data: 'byteOrder', type: 'dropdown', //下拉選擇 source: ['BMW', 'Chrysler', 'Nissan', 'Suzuki', 'Toyota', 'Volvo'], strict: false //是否嚴格匹配 }, { data: 'unitId', //data上傳對應字段 type: 'numeric', //數值 }, ], contextMenu: { items: { 'row_above': { name: '在此行上方插入行' }, 'row_below': { name: '在此行下方插入行' }, 'separator': Handsontable.plugins.ContextMenu.SEPARATOR, 'copy': { name: '復制' }, 'undo': { name: '撤消' }, 'separator1': Handsontable.plugins.ContextMenu.SEPARATOR, 'remove_row': { name: '刪除行' }, 'clear_column': { name: '刪除列' }, 'clear_custom': { name: '刪除所有單元格', callback: function () { this.clear() } } } } }, expressCompanyList: [], dateRange: [], typeBol: false, searchParam: { supplierServiceRegionPriceVos: [] }, searchParamRules: { supplierServiceRegionPriceVos: [ { type: 'array', required: true, message: '請填寫價格表', trigger: 'blur' }, { validator: validatorList, required: true, message: '請輸入價格表中所有信息, 多余的可通過鼠標右擊進行刪除行', trigger: 'blur' } ] }, showContent: false, loadShow: false, saveLimit: false } }, mounted() { for(var i=0;i<10;i++){ let x = {riseWeight:11} this.hotSettings.dataList.push(x) } }, methods: { // 刪除行之前調用 beforeRemoveRowMe: function (changes, source) { // 數據改變時觸發此方法 this.hotSettings.dataList.splice(changes, source) }, // 添加行 afterCreateRowMe: function (changes) { this.hotSettings.dataList.splice(changes, 0, { region: '', destination: '', firstWeight: '', firstWeightPrice: '', riseWeight: '', riseWeightPrice: '' }) }, //新增行時,動態改變值 afterChangeMe: function (changes) { if (changes) { changes.forEach(([row, prop, oldValue, newValue]) => { // console.log(row, prop, oldValue, newValue) this.hotSettings.dataList[row][prop] = newValue }) } }, //查看-excel不可編輯 excalEdit() { this.hotSettings.columns.forEach(par => { par.readOnly = true }) }, definedShow() { this.showContent = true }, saveSubmit() { this.hotRef = this.$refs.searchForm.hotInstance //這個是百度到的 用於驗證紅色的驗證錯誤 this.arr = [] this.hotRef.validateCells((valid) => { if (valid) { this.hotSettings.dataList.forEach((item,index)=>{ //想獲取[{name:'vue'},{name:'vue'}] 這種形式必須用this.hotSettings.dataList 而且 columns 中每個對象中的 data :一定要設置成你后台需要的樣子! if(item.name || item.unit || item.decimalPlace || item.min || item.max || item.oddMin || item.oddMax || item.type || item.address || item.format || item.dataBits || item.byteOrder || item.unitId){ if(item.name && item.unit && item.decimalPlace && item.min && item.max && item.oddMin && item.oddMax && item.type && item.address && item.format && item.dataBits && item.byteOrder && item.unitId){ this.arr.push(item) }else{ alert(`請將第${index+1}行,填寫完整!`) } } }) window.console.log(this.arr,"讓我看看數據對不對是不是我想要的!") }else{ alert('請修改錯誤格式!') } }) }, // 導出文件 uploadFile() { // 可查看網址https://handsontable.com/docs/7.1.0/ExportFile.html const container = this.$refs.tableServer.hotInstance const exportPlugin = container.getPlugin('exportFile') exportPlugin.downloadFile('csv', { bom: 'UTF-8', // 允許您使用BOM簽名導出數據。 columnDelimiter: ',', // 允許您定義列分隔符。 columnHeaders: false, // 允許使用列標題導出數據。 exportHiddenColumns: true, // 允許您從隱藏列導出數據。 exportHiddenRows: true, // 允許您從隱藏行導出數據 fileExtension: 'csv', // 允許您定義文件擴展名。 filename: '供應商服務價格表[YYYY]-[MM]-[DD]', // 允許您定義文件名。 mimeType: 'text/csv', // 允許您定義MIME類型。 rowDelimiter: '\r\n', // 允許您定義行分隔符。 rowHeaders: true // 允許您使用行標題導出數據。 }) } } } </script> <style> @import '~handsontable/dist/handsontable.full.css'; </style>