|
@@ -1,5 +1,6 @@
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
import { ref, reactive, nextTick } from 'vue'
|
|
import { ref, reactive, nextTick } from 'vue'
|
|
|
|
+import * as XLSX from 'xlsx';
|
|
import { Delete } from '@element-plus/icons-vue'
|
|
import { Delete } from '@element-plus/icons-vue'
|
|
import Drawer from '@/components/Drawer/index.vue'
|
|
import Drawer from '@/components/Drawer/index.vue'
|
|
import type { FormInstance, FormRules } from 'element-plus'
|
|
import type { FormInstance, FormRules } from 'element-plus'
|
|
@@ -92,6 +93,49 @@ const addDeviceSn = (id: number, type: number) => {
|
|
}
|
|
}
|
|
drawerSnRef.value?.openDrawer()
|
|
drawerSnRef.value?.openDrawer()
|
|
}
|
|
}
|
|
|
|
+
|
|
|
|
+const drawer = ref(false)
|
|
|
|
+/**
|
|
|
|
+ * 导入xlsx
|
|
|
|
+ */
|
|
|
|
+
|
|
|
|
+// 组件状态变化的回调
|
|
|
|
+const uploadExcelFile = (event:any) => {
|
|
|
|
+ const files = event.target.files;
|
|
|
|
+ if (files.length === 0) return;
|
|
|
|
+ const file = files[0];
|
|
|
|
+ const reader = new FileReader();
|
|
|
|
+ reader.onload = (e:any) => {
|
|
|
|
+ const data = new Uint8Array(e.target.result);
|
|
|
|
+ const workbook = XLSX.read(data, { type: 'array' });
|
|
|
|
+ // 假设我们知道第一个工作表包含我们需要的数据
|
|
|
|
+ const firstSheetName = workbook.SheetNames[0];
|
|
|
|
+ const worksheet:any = workbook.Sheets[firstSheetName];
|
|
|
|
+ // 假设我们知道 t_sn 是第一列
|
|
|
|
+ const tSnColumn = 'A'; // 或者使用 XLSX.utils.decode_col(columnNumber) 来从列号获取列名
|
|
|
|
+ const columnNumber = XLSX.utils.decode_col(tSnColumn); // 但实际上我们可能直接知道列号,如 0
|
|
|
|
+ // 使用 sheet_to_json 但只选择我们需要的列
|
|
|
|
+ const json = XLSX.utils.sheet_to_json(worksheet, { header: 1, range: XLSX.utils.decode_range(worksheet['!ref']) });
|
|
|
|
+ // 如果表头不是第一行,或者你不想要表头,可以调整 header 选项
|
|
|
|
+ // 提取 t_sn 列的数据(假设表头在第一行,且 t_sn 是第一列)
|
|
|
|
+ let tSnData:any = json.map((row:any) => row[0]); // 假设 t_sn 是第一列,所以使用 row[0]
|
|
|
|
+ let snArray = tSnData.map((sn:any) => ({ sn: sn }));
|
|
|
|
+ snArray = snArray.slice(1)
|
|
|
|
+ let arrs = [...tableSnData.value,...snArray]
|
|
|
|
+ // 去重
|
|
|
|
+ let seen = new Set();
|
|
|
|
+ tableSnData.value = arrs.filter((item:any) => {
|
|
|
|
+ return seen.has(item.sn) ? false : seen.add(item.sn) || true;
|
|
|
|
+ });
|
|
|
|
+
|
|
|
|
+ console.log('打印',tableSnData.value)
|
|
|
|
+ // 注意:如果 t_sn 列不是第一列,你需要调整索引号
|
|
|
|
+ // 例如,如果 t_sn 是第三列,则使用 row[2]
|
|
|
|
+ };
|
|
|
|
+
|
|
|
|
+ reader.readAsArrayBuffer(file);
|
|
|
|
+
|
|
|
|
+};
|
|
const getDeviceSn = () => SNDataMap
|
|
const getDeviceSn = () => SNDataMap
|
|
const clearDeviceSn = () => SNDataMap.clear()
|
|
const clearDeviceSn = () => SNDataMap.clear()
|
|
const deleteDeviceSn = (id: number) => SNDataMap.delete(id)
|
|
const deleteDeviceSn = (id: number) => SNDataMap.delete(id)
|
|
@@ -104,7 +148,7 @@ defineExpose({
|
|
</script>
|
|
</script>
|
|
|
|
|
|
<template>
|
|
<template>
|
|
- <Drawer ref="drawerSnRef" :handleClose="callbackSnDrawer" size="30%">
|
|
|
|
|
|
+ <Drawer ref="drawerSnRef" :handleClose="callbackSnDrawer" size="50%">
|
|
<el-card class="box-card" shadow="never">
|
|
<el-card class="box-card" shadow="never">
|
|
<template #header>
|
|
<template #header>
|
|
<div class="sn-header">
|
|
<div class="sn-header">
|
|
@@ -114,6 +158,7 @@ defineExpose({
|
|
</el-form-item>
|
|
</el-form-item>
|
|
</el-form>
|
|
</el-form>
|
|
<el-button type="primary" @click="addSn(ruleSnFormRef)">添加</el-button>
|
|
<el-button type="primary" @click="addSn(ruleSnFormRef)">添加</el-button>
|
|
|
|
+ <el-button type="success" @click="drawer = true">导入xlsx</el-button>
|
|
</div>
|
|
</div>
|
|
</template>
|
|
</template>
|
|
<el-table
|
|
<el-table
|
|
@@ -143,7 +188,11 @@ defineExpose({
|
|
</template>
|
|
</template>
|
|
</el-table>
|
|
</el-table>
|
|
</el-card>
|
|
</el-card>
|
|
|
|
+ <el-drawer v-model="drawer" title="导入xlsx" size="50%" :destroy-on-close="true">
|
|
|
|
+ <input type="file" @change="uploadExcelFile" accept=".xlsx, .xls" />
|
|
|
|
+ </el-drawer>
|
|
</Drawer>
|
|
</Drawer>
|
|
|
|
+
|
|
</template>
|
|
</template>
|
|
|
|
|
|
<style scoped lang="scss">
|
|
<style scoped lang="scss">
|