新的导入导出

This commit is contained in:
Silent YANG 2024-04-15 00:47:42 +08:00
parent cd2cbc5f0a
commit 9452eb8587
4 changed files with 257 additions and 8 deletions

View File

@ -37,7 +37,8 @@
"vue": "^3.2.40",
"vue-echarts": "^6.2.3",
"vue-i18n": "^9.2.2",
"vue-router": "^4.0.14"
"vue-router": "^4.0.14",
"xlsx": "^0.18.5"
},
"devDependencies": {
"@arco-plugins/vite-vue": "^1.4.5",

BIN
public/K5Channel.xlsx Normal file

Binary file not shown.

View File

@ -21,11 +21,28 @@
</a-col>
<a-col :span="12" style="text-align: right;">
<a-space>
<a-button type="primary" @click="saveChannel">
保存
<a-dropdown>
<a-button>
保存/加载即将废弃<icon-down />
</a-button>
<template #content>
<a-button style="width: 200px; margin: 10px; margin-bottom: 0px;" type="primary" @click="saveChannel">
保存
</a-button>
<br>
<a-button style="width: 200px; margin: 10px;" @click="restoreChannel">
加载
</a-button>
</template>
</a-dropdown>
<a-button type="text" @click="downloadExcelTemplate">
下载导入模板
</a-button>
<a-button @click="restoreChannel">
加载
<a-button type="primary" @click="restoreExcelChannel">
导入
</a-button>
<a-button @click="saveExcelChannel">
导出
</a-button>
</a-space>
</a-col>
@ -89,6 +106,7 @@
import { useAppStore } from '@/store';
import { MoveIcon } from 'tdesign-icons-vue-next';
import { toTraditional } from 'chinese-simple2traditional';
import { read as xlsxRead, writeFile as xlsxWrite, utils as xlsxUtils } from "xlsx";
const appStore = useAppStore();
@ -358,12 +376,12 @@
colKey: 'step',
align: 'left',
width: 150,
cell: (h, { row }) => state.stepOption.indexOf(row.step) >= 0 ? row.step?.toFixed(1) : undefined,
cell: (h, { row }) => state.stepOption.indexOf(row.step) >= 0 ? row.step?.toFixed(2) : undefined,
edit: {
component: Select,
props: {
clearable: true,
options: state.stepOption.map(e=>{return {value: e, label: e.toFixed(1)}}),
options: state.stepOption.map(e=>{return {value: e, label: e.toFixed(2)}}),
},
onEdited: (context: any) => {
const newData = [...cstate.renderData];
@ -646,12 +664,184 @@
const input = document.createElement('input');
input.type = 'file';
input.onchange = async() => {
const blob = new Blob([input.files[0]], {type: 'application/octet-stream' });
const blob = new Blob([input.files[0]], {type: 'application/octet-stream'});
const _json = await blob.text()
cstate.renderData = JSON.parse(_json)
};
input.click();
}
const downloadExcelTemplate = () => {
const a = document.createElement('a');
a.href = '/K5Channel.xlsx';
a.download = 'K5Channel.xlsx';
document.body.appendChild(a);
a.click();
document.body.removeChild(a);
};
const saveExcelChannel = async () => {
const template = await fetch('/K5Channel.xlsx');
const workbook = xlsxRead(await template.arrayBuffer());
const worksheet = workbook.Sheets[workbook.SheetNames[0]];
for(let i = 2; i < 202; i++){
if(cstate.renderData[i - 2]?.name){
worksheet['B' + i] = {}
worksheet['B' + i].v = cstate.renderData[i - 2]?.name
}
if(cstate.renderData[i - 2]?.bandwidth){
worksheet['C' + i] = {}
worksheet['C' + i].v = state.bandwidthOption[cstate.renderData[i - 2]?.bandwidth]
}
if(cstate.renderData[i - 2]?.rx){
worksheet['D' + i] = {}
worksheet['D' + i].v = cstate.renderData[i - 2]?.rx
}
if(cstate.renderData[i - 2]?.tx){
worksheet['E' + i] = {}
worksheet['E' + i].v = cstate.renderData[i - 2]?.tx
}
if(cstate.renderData[i - 2]?.power){
worksheet['F' + i] = {}
worksheet['F' + i].v = state.powerOption[cstate.renderData[i - 2]?.power]
}
if(cstate.renderData[i - 2]?.rxTone){
worksheet['G' + i] = {}
worksheet['G' + i].v = state.toneOption[cstate.renderData[i - 2]?.rxTone]
}
if(cstate.renderData[i - 2]?.rxCTCSS){
worksheet['H' + i] = {}
worksheet['H' + i].v = cstate.renderData[i - 2]?.rxCTCSS
}
if(cstate.renderData[i - 2]?.rxDCS){
worksheet['I' + i] = {}
worksheet['I' + i].v = cstate.renderData[i - 2]?.rxDCS
}
if(cstate.renderData[i - 2]?.txTone){
worksheet['J' + i] = {}
worksheet['J' + i].v = state.toneOption[cstate.renderData[i - 2]?.txTone]
}
if(cstate.renderData[i - 2]?.txCTCSS){
worksheet['K' + i] = {}
worksheet['K' + i].v = cstate.renderData[i - 2]?.txCTCSS
}
if(cstate.renderData[i - 2]?.txDCS){
worksheet['L' + i] = {}
worksheet['L' + i].v = cstate.renderData[i - 2]?.txDCS
}
if(cstate.renderData[i - 2]?.step){
worksheet['M' + i] = {}
worksheet['M' + i].v = cstate.renderData[i - 2]?.step
}
if(cstate.renderData[i - 2]?.reverse){
worksheet['N' + i] = {}
worksheet['N' + i].v = cstate.renderData[i - 2]?.reverse == true ? '开' : '关'
}
if(cstate.renderData[i - 2]?.scramb){
worksheet['O' + i] = {}
worksheet['O' + i].v = cstate.renderData[i - 2]?.scramb
}
if(cstate.renderData[i - 2]?.busy){
worksheet['P' + i] = {}
worksheet['P' + i].v = cstate.renderData[i - 2]?.busy == true ? '开' : '关'
}
if(cstate.renderData[i - 2]?.pttid){
worksheet['Q' + i] = {}
worksheet['Q' + i].v = cstate.renderData[i - 2]?.pttid
}
if(cstate.renderData[i - 2]?.mode){
worksheet['R' + i] = {}
worksheet['R' + i].v = state.modeOption[cstate.renderData[i - 2]?.mode]
}
if(cstate.renderData[i - 2]?.dtmf){
worksheet['S' + i] = {}
worksheet['S' + i].v = cstate.renderData[i - 2]?.dtmf == true ? '开' : '关'
}
if(cstate.renderData[i - 2]?.scanlist){
worksheet['T' + i] = {}
worksheet['T' + i].v = cstate.renderData[i - 2]?.scanlist.join(',')
}
}
xlsxWrite(workbook, 'K5Channel.xlsx');
}
const restoreExcelChannel = () => {
const input = document.createElement('input');
input.type = 'file';
input.onchange = async() => {
const blob = new Blob([input.files[0]], {type: 'application/octet-stream'});
const reader = new FileReader();
reader.onload = function(e) {
const renderData : any = Array.from({length: 200}).map(e=>{return {scanlist: []}})
var data = e.target?.result;
var workbook = xlsxRead(data);
for(let i = 2; i < 202; i++){
if(workbook.Sheets.Sheet1['B' + i]?.w){
renderData[i - 2]['name'] = workbook.Sheets.Sheet1['B' + i]?.w
}
if(workbook.Sheets.Sheet1['C' + i]?.w){
renderData[i - 2]['bandwidth'] = Object.keys(state.bandwidthOption).find(key=>state.bandwidthOption[key]==workbook.Sheets.Sheet1['C' + i]?.w)
}
if(workbook.Sheets.Sheet1['D' + i]?.w){
renderData[i - 2]['rx'] = workbook.Sheets.Sheet1['D' + i]?.w
}
if(workbook.Sheets.Sheet1['E' + i]?.w){
renderData[i - 2]['tx'] = workbook.Sheets.Sheet1['E' + i]?.w
}
if(workbook.Sheets.Sheet1['F' + i]?.w){
renderData[i - 2]['power'] = Object.keys(state.powerOption).find(key=>state.powerOption[key]==workbook.Sheets.Sheet1['F' + i]?.w)
}
if(workbook.Sheets.Sheet1['G' + i]?.w){
renderData[i - 2]['rxTone'] = Object.keys(state.toneOption).find(key=>state.toneOption[key]==workbook.Sheets.Sheet1['G' + i]?.w)
}
if(workbook.Sheets.Sheet1['H' + i]?.w){
renderData[i - 2]['rxCTCSS'] = parseFloat(workbook.Sheets.Sheet1['H' + i]?.w)
}
if(workbook.Sheets.Sheet1['I' + i]?.w){
renderData[i - 2]['rxDCS'] = parseFloat(workbook.Sheets.Sheet1['I' + i]?.w)
}
if(workbook.Sheets.Sheet1['J' + i]?.w){
renderData[i - 2]['txTone'] = Object.keys(state.toneOption).find(key=>state.toneOption[key]==workbook.Sheets.Sheet1['J' + i]?.w)
}
if(workbook.Sheets.Sheet1['K' + i]?.w){
renderData[i - 2]['txCTCSS'] = parseFloat(workbook.Sheets.Sheet1['K' + i]?.w)
}
if(workbook.Sheets.Sheet1['L' + i]?.w){
renderData[i - 2]['txDCS'] = parseFloat(workbook.Sheets.Sheet1['L' + i]?.w)
}
if(workbook.Sheets.Sheet1['M' + i]?.w){
renderData[i - 2]['step'] = parseFloat(workbook.Sheets.Sheet1['M' + i]?.w)
}
if(workbook.Sheets.Sheet1['N' + i]?.w){
renderData[i - 2]['reverse'] = workbook.Sheets.Sheet1['N' + i]?.w == '开' ? true : false
}
if(workbook.Sheets.Sheet1['O' + i]?.w){
renderData[i - 2]['scramb'] = parseFloat(workbook.Sheets.Sheet1['O' + i]?.w)
}
if(workbook.Sheets.Sheet1['P' + i]?.w){
renderData[i - 2]['busy'] = workbook.Sheets.Sheet1['P' + i]?.w == '开' ? true : false
}
if(workbook.Sheets.Sheet1['Q' + i]?.w){
renderData[i - 2]['pttid'] = workbook.Sheets.Sheet1['Q' + i]?.w
}
if(workbook.Sheets.Sheet1['R' + i]?.w){
renderData[i - 2]['mode'] = Object.keys(state.modeOption).find(key=>state.modeOption[key]==workbook.Sheets.Sheet1['R' + i]?.w)
}
if(workbook.Sheets.Sheet1['S' + i]?.w){
renderData[i - 2]['dtmf'] = workbook.Sheets.Sheet1['S' + i]?.w == '开' ? true : false
}
if(workbook.Sheets.Sheet1['T' + i]?.w){
if(workbook.Sheets.Sheet1['T' + i]?.w.split(',').indexOf('I') >= 0){
renderData[i - 2]['scanlist'].push('I')
}
if(workbook.Sheets.Sheet1['T' + i]?.w.split(',').indexOf('II') >= 0){
renderData[i - 2]['scanlist'].push('II')
}
}
}
cstate.renderData = renderData
};
reader.readAsArrayBuffer(blob);
};
input.click();
}
</script>
<script lang="ts">

View File

@ -1606,6 +1606,11 @@ acorn@^8.10.0, acorn@^8.11.2, acorn@^8.11.3, acorn@^8.4.1:
resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
adler-32@~1.3.0:
version "1.3.1"
resolved "https://repo.vicicode.com/repository/npm-proxy/adler-32/-/adler-32-1.3.1.tgz#1dbf0b36dda0012189a32b3679061932df1821e2"
integrity sha512-ynZ4w/nUUv5rrsR8UUGoe1VC9hZj6V5hU9Qw1HlMDJGEJw5S7TfTErWTjMys6M7vr0YWcPqs3qAr4ss0nDfP+A==
aegis-web-sdk@^1.39.1:
version "1.39.1"
resolved "https://registry.yarnpkg.com/aegis-web-sdk/-/aegis-web-sdk-1.39.1.tgz#885531ad855ff7340a1728f0a6d4bf7ef1e6705e"
@ -2174,6 +2179,14 @@ caw@^2.0.0, caw@^2.0.1:
tunnel-agent "^0.6.0"
url-to-options "^1.0.1"
cfb@~1.2.1:
version "1.2.2"
resolved "https://repo.vicicode.com/repository/npm-proxy/cfb/-/cfb-1.2.2.tgz#94e687628c700e5155436dac05f74e08df23bc44"
integrity sha512-KfdUZsSOw19/ObEWasvBP/Ac4reZvAGauZhs6S/gqNhXhI7cKwvlH7ulj+dOEYnca4bm4SGo8C1bTAQvnTjgQA==
dependencies:
adler-32 "~1.3.0"
crc-32 "~1.2.0"
chalk@^1.0.0:
version "1.1.3"
resolved "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz#a8115c55e4a702fe4d150abd3872822a7e09fc98"
@ -2313,6 +2326,11 @@ clone@^1.0.2:
resolved "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz#da309cc263df15994c688ca902179ca3c7cd7c7e"
integrity sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==
codepage@~1.15.0:
version "1.15.0"
resolved "https://repo.vicicode.com/repository/npm-proxy/codepage/-/codepage-1.15.0.tgz#2e00519024b39424ec66eeb3ec07227e692618ab"
integrity sha512-3g6NUTPd/YtuuGrhMnOMRjFc+LJw/bnMp3+0r/Wcz3IXUuCosKRJvMphm5+Q+bvTVGcJJuRvVLuYba+WojaFaA==
color-convert@^1.9.0, color-convert@^1.9.3:
version "1.9.3"
resolved "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz#bb71850690e1f136567de629d2d5471deda4c1e8"
@ -2526,6 +2544,11 @@ cosmiconfig@^8.0.0:
parse-json "^5.2.0"
path-type "^4.0.0"
crc-32@~1.2.0, crc-32@~1.2.1:
version "1.2.2"
resolved "https://repo.vicicode.com/repository/npm-proxy/crc-32/-/crc-32-1.2.2.tgz#3cad35a934b8bf71f25ca524b6da51fb7eace2ff"
integrity sha512-ROmzCKrTnOwybPcJApAA6WBWij23HVfGVNKqqrZpuyZOHqK2CwHSvpGuyt/UNNvaIjEd8X5IFGp4Mh+Ie1IHJQ==
create-require@^1.1.0:
version "1.1.1"
resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
@ -3758,6 +3781,11 @@ form-data@^4.0.0:
combined-stream "^1.0.8"
mime-types "^2.1.12"
frac@~1.1.2:
version "1.1.2"
resolved "https://repo.vicicode.com/repository/npm-proxy/frac/-/frac-1.1.2.tgz#3d74f7f6478c88a1b5020306d747dc6313c74d0b"
integrity sha512-w/XBfkibaTl3YDqASwfDUqkna4Z2p9cFSr1aHDt0WoMTECnRfBOv2WArlZILlqgWlmdIlALXGpM2AOhEk5W3IA==
from2@^2.1.1:
version "2.3.0"
resolved "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz#8bfb5502bde4a4d36cfdeea007fcca21d7e382af"
@ -6791,6 +6819,13 @@ squeak@^1.0.0:
console-stream "^0.1.1"
lpad-align "^1.0.1"
ssf@~0.11.2:
version "0.11.2"
resolved "https://repo.vicicode.com/repository/npm-proxy/ssf/-/ssf-0.11.2.tgz#0b99698b237548d088fc43cdf2b70c1a7512c06c"
integrity sha512-+idbmIXoYET47hH+d7dfm2epdOMUDjqcB4648sTZ+t2JwoyBFL/insLfB/racrDmsKB3diwsDA696pZMieAC5g==
dependencies:
frac "~1.1.2"
ssri@^9.0.0:
version "9.0.1"
resolved "https://registry.yarnpkg.com/ssri/-/ssri-9.0.1.tgz#544d4c357a8d7b71a19700074b6883fcb4eae057"
@ -7586,11 +7621,21 @@ wide-align@^1.1.5:
dependencies:
string-width "^1.0.2 || 2 || 3 || 4"
wmf@~1.0.1:
version "1.0.2"
resolved "https://repo.vicicode.com/repository/npm-proxy/wmf/-/wmf-1.0.2.tgz#7d19d621071a08c2bdc6b7e688a9c435298cc2da"
integrity sha512-/p9K7bEh0Dj6WbXg4JG0xvLQmIadrner1bi45VMJTfnbVHsc7yIajZyoSoK60/dtVBs12Fm6WkUI5/3WAVsNMw==
word-wrap@^1.2.3:
version "1.2.5"
resolved "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.5.tgz#d2c45c6dd4fbce621a66f136cbe328afd0410b34"
integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==
word@~0.3.0:
version "0.3.0"
resolved "https://repo.vicicode.com/repository/npm-proxy/word/-/word-0.3.0.tgz#8542157e4f8e849f4a363a288992d47612db9961"
integrity sha512-OELeY0Q61OXpdUfTp+oweA/vtLVg5VDOXh+3he3PNzLGG/y0oylSOC1xRVj0+l4vQ3tj/bB1HVHv1ocXkQceFA==
wrap-ansi@^6.2.0:
version "6.2.0"
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz#e9393ba07102e6c91a3b221478f0257cd2856e53"
@ -7614,6 +7659,19 @@ wrappy@1:
resolved "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz#b5243d8f3ec1aa35f1364605bc0d1036e30ab69f"
integrity sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==
xlsx@^0.18.5:
version "0.18.5"
resolved "https://repo.vicicode.com/repository/npm-proxy/xlsx/-/xlsx-0.18.5.tgz#16711b9113c848076b8a177022799ad356eba7d0"
integrity sha512-dmg3LCjBPHZnQp5/F/+nnTa+miPJxUXB6vtk42YjBBKayDNagxGEeIdWApkYPOf3Z3pm3k62Knjzp7lMeTEtFQ==
dependencies:
adler-32 "~1.3.0"
cfb "~1.2.1"
codepage "~1.15.0"
crc-32 "~1.2.1"
ssf "~0.11.2"
wmf "~1.0.1"
word "~0.3.0"
xmlbuilder@^15.1.1:
version "15.1.1"
resolved "https://registry.yarnpkg.com/xmlbuilder/-/xmlbuilder-15.1.1.tgz#9dcdce49eea66d8d10b42cae94a79c3c8d0c2ec5"