Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Contribute to GitLab
Sign in
Toggle navigation
T
topsun-baoshen-excel
Project
Project
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
何远江
topsun-baoshen-excel
Commits
8131d776
Commit
8131d776
authored
Dec 05, 2023
by
何远江
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
标记区域功能,添加区域关联配置
parent
a75d4dcc
Show whitespace changes
Inline
Side-by-side
Showing
5 changed files
with
480 additions
and
101 deletions
+480
-101
excel.ts
src/api/excel.ts
+29
-0
global.d.ts
src/types/global.d.ts
+6
-1
luckyexcel.d.ts
src/types/luckyexcel.d.ts
+1
-0
ExcelOperate.vue
...ws/comment-excel/components/ExcelOperate/ExcelOperate.vue
+443
-99
tsconfig.app.json
tsconfig.app.json
+1
-1
No files found.
src/api/excel.ts
View file @
8131d776
...
@@ -178,3 +178,32 @@ export const getExcelAreaByFileId = (orderFileId: string) => {
...
@@ -178,3 +178,32 @@ export const getExcelAreaByFileId = (orderFileId: string) => {
headers
:
formHeader
headers
:
formHeader
})
})
}
}
export
const
removeExcelArea
=
(
excelAreaId
:
string
)
=>
{
return
axios
.
get
(
'/api/excelMark/removeExcelArea'
,
{
params
:
{
excelAreaId
},
headers
:
formHeader
})
}
export
const
getExcelConnectByFileId
=
(
orderFileId
:
string
)
=>
{
return
axios
.
get
(
'/api/excelMark/getExcelAreaConnectByFileID'
,
{
params
:
{
orderFileId
},
headers
:
formHeader
})
}
export
const
removeExcelAreaConnect
=
(
excelAreaConnectId
:
string
)
=>
{
return
axios
.
get
(
'/api/excelMark/removeExcelAreaConnect'
,
{
params
:
{
excelAreaConnectId
},
headers
:
formHeader
})
}
export
const
addExcelAreaConnect
=
(
data
:
any
)
=>
{
return
axios
.
post
(
'/api/excelMark/addExcelAreaConnect'
,
data
)
}
export
const
excelMarkRun
=
(
orderFileId
:
string
)
=>
{
return
axios
.
get
(
'/api/excelMark/run'
,
{
params
:
{
orderFileId
},
headers
:
formHeader
})
}
src/types/global.d.ts
View file @
8131d776
declare
module
'luckyexcel'
declare
module
'luckyexcel'
;
export
type
Nullable
<
T
>
=
T
|
null
export
type
Nullable
<
T
>
=
T
|
null
export
type
NonNullable
<
T
>
=
T
extends
null
|
undefined
?
never
:
T
export
type
NonNullable
<
T
>
=
T
extends
null
|
undefined
?
never
:
T
...
@@ -6,3 +6,8 @@ export type Recordable<T = any> = Record<string, T>
...
@@ -6,3 +6,8 @@ export type Recordable<T = any> = Record<string, T>
export
type
ReadonlyRecordable
<
T
=
any
>
=
{
export
type
ReadonlyRecordable
<
T
=
any
>
=
{
readonly
[
key
:
string
]:
T
readonly
[
key
:
string
]:
T
}
}
declare
interface
Window
{
luckusheet
:
any
}
\ No newline at end of file
src/types/luckyexcel.d.ts
0 → 100644
View file @
8131d776
declare
module
'luckyexcel'
;
\ No newline at end of file
src/views/comment-excel/components/ExcelOperate/ExcelOperate.vue
View file @
8131d776
...
@@ -2,6 +2,7 @@
...
@@ -2,6 +2,7 @@
<div
class=
"flex h-full"
>
<div
class=
"flex h-full"
>
<div
id=
"luckysheet"
class=
"flex-1"
></div>
<div
id=
"luckysheet"
class=
"flex-1"
></div>
<el-scrollbar
height=
"100%"
>
<div
class=
"w-[400px] h-full bg-white"
>
<div
class=
"w-[400px] h-full bg-white"
>
<p
class=
"pl-2 text-lg font-bold leading-[40px] bg-slate-200"
>
标注配置
</p>
<p
class=
"pl-2 text-lg font-bold leading-[40px] bg-slate-200"
>
标注配置
</p>
...
@@ -39,6 +40,7 @@
...
@@ -39,6 +40,7 @@
<p
class=
"text-slate-600"
>
区域类型:
{{
cachAreaMark
.
excelAreaType
||
'--'
}}
</p>
<p
class=
"text-slate-600"
>
区域类型:
{{
cachAreaMark
.
excelAreaType
||
'--'
}}
</p>
<p
class=
"text-slate-600"
>
区域别称:
{{
cachAreaMark
.
excelAreaNicname
||
'--'
}}
</p>
<p
class=
"text-slate-600"
>
区域别称:
{{
cachAreaMark
.
excelAreaNicname
||
'--'
}}
</p>
<vxe-table
<vxe-table
class=
"mb-2"
:row-config=
"
{ isCurrent: true }"
:row-config=
"
{ isCurrent: true }"
border
border
:data="cachHeadAreaData"
:data="cachHeadAreaData"
...
@@ -52,13 +54,13 @@
...
@@ -52,13 +54,13 @@
</
template
>
</
template
>
</vxe-column>
</vxe-column>
</vxe-table>
</vxe-table>
<el-button
type=
"primary"
size=
"small"
@
click=
"resetCachArea()"
>
重置选区
</el-button>
<el-button
type=
"primary"
size=
"small"
@
click=
"resetCachHeadArea"
>
重置标题区
</el-button>
<el-button
type=
"primary"
size=
"small"
@
click=
"saveAreaMark"
>
保存
</el-button>
<el-button
type=
"primary"
size=
"small"
@
click=
"saveAreaMark"
>
保存
</el-button>
<el-button
type=
"default"
size=
"small"
@
click=
"resetCachArea()"
>
重置选区
</el-button>
<el-button
type=
"default"
size=
"small"
@
click=
"resetCachHeadArea"
>
重置标题区
</el-button>
</div>
</div>
<div
class=
"p-2 text-sm
"
>
<div
class=
"mt-6 pl-2 pr-2 pb-2 text-sm border-b-2
"
>
<p
class=
"font-bold"
>
已标记记录:
</p>
<p
class=
"font-bold"
>
标记区域
</p>
<vxe-table
<vxe-table
@
cell-click=
"cellClick"
@
cell-click=
"cellClick"
:row-config=
"{ isCurrent: true }"
:row-config=
"{ isCurrent: true }"
...
@@ -74,14 +76,98 @@
...
@@ -74,14 +76,98 @@
{{
getRangetxt
(
row
.
beginRow
,
row
.
endRow
,
row
.
beginColum
,
row
.
endColum
)
}}
{{
getRangetxt
(
row
.
beginRow
,
row
.
endRow
,
row
.
beginColum
,
row
.
endColum
)
}}
</
template
>
</
template
>
</vxe-column>
</vxe-column>
<vxe-column
title=
"操作"
field=
"action"
width=
"90"
>
<
template
#
default=
"{ row }"
>
<el-link
class=
"mr-1"
style=
"font-size: 12px"
type=
"primary"
@
click
.
stop=
"chooseConnect(row)"
>
关联
</el-link
>
<el-link
style=
"font-size: 12px"
type=
"danger"
@
click=
"delAreaMark(row)"
>
删除
</el-link
>
</
template
>
</vxe-column>
</vxe-table>
</vxe-table>
</div>
</div>
<div
class=
"p-2 text-sm"
>
<p
class=
"font-bold"
>
区域关联信息
</p>
<vxe-table
border
:data=
"connectList"
size=
"mini"
height=
"200"
>
<vxe-column
title=
"关联名称"
field=
"excelAreaId_dictText"
></vxe-column>
<vxe-column
title=
"别关联名称"
field=
"excelAreaBeId_dictText"
></vxe-column>
<vxe-column
title=
"操作"
field=
"action"
width=
"60"
>
<
template
#
default=
"{ row, $rowIndex }"
>
<el-link
style=
"font-size: 12px"
type=
"danger"
@
click=
"delConnect(row, $rowIndex)"
>
删除
</el-link
>
</
template
>
</vxe-column>
</vxe-table>
</div>
</div>
<el-button
type=
"primary"
size=
"small"
@
click=
"toRun"
>
执行解析
</el-button>
</div>
</el-scrollbar>
<vxe-modal
width=
"600"
@
hide=
"chooseConnectOnHide"
v-model=
"chooseVisible"
title=
"选择被关联的区域"
show-footer
>
<vxe-table
ref=
"beConnectTable"
border
size=
"mini"
:data=
"beConnectData"
height=
"400"
>
<vxe-column
type=
"radio"
width=
"40"
></vxe-column>
<vxe-column
title=
"sheet"
field=
"sheetNum"
width=
"60"
></vxe-column>
<vxe-column
title=
"别称"
field=
"excelAreaNicname"
></vxe-column>
<vxe-column
title=
"区域"
field=
"area"
width=
"90"
>
<
template
#
default=
"{ row }"
>
{{
getRangetxt
(
row
.
beginRow
,
row
.
endRow
,
row
.
beginColum
,
row
.
endColum
)
}}
</
template
>
</vxe-column>
</vxe-table>
<
template
#
footer
>
<el-button
type=
"primary"
@
click=
"confirmBeConnect"
>
确认
</el-button>
</
template
>
</vxe-modal>
<vxe-modal
v-model=
"connectVisible"
width=
"700"
title=
"关联信息配置"
show-footer
>
<p>
关联区域信息:
</p>
<p>
被关联信息:
</p>
<vxe-table
class=
"mt-2"
size=
"mini"
:data=
"connectConfigData"
border
height=
"400"
ref=
"xTableConnect"
>
<vxe-column
type=
"checkbox"
width=
"40"
></vxe-column>
<vxe-column
title=
"关联title"
field=
"title"
></vxe-column>
<vxe-column
title=
"被关联title"
field=
"betitle"
>
<
template
#
default=
"{ row }"
>
<el-select
v-model=
"row.betitle"
size=
"small"
@
change=
"(v) => changeBeConnect(v, row)"
>
<template
v-for=
"item in beConnectSelectOptions"
:key=
"item.title"
>
<el-option
:value=
"item.title"
:label=
"item.title"
></el-option>
</
template
>
</el-select>
</template>
</vxe-column>
</vxe-table>
<
template
#
footer
>
<el-button
type=
"primary"
@
click=
"confirmConnect"
>
确认
</el-button>
</
template
>
</vxe-modal>
</div>
</div>
</template>
</template>
<
script
lang=
"ts"
setup
>
<
script
lang=
"ts"
setup
>
import
{
ref
,
onMounted
,
onUnmounted
,
reactive
,
unref
,
computed
}
from
'vue'
import
{
ref
,
onMounted
,
onUnmounted
,
reactive
,
unref
,
computed
,
watch
}
from
'vue'
import
LuckyExcel
from
'luckyexcel'
import
LuckyExcel
from
'luckyexcel'
import
{
import
{
areaMarksColor
,
areaMarksColor
,
...
@@ -96,12 +182,38 @@ import { useCommentExcel } from '@/stores/commentExcel'
...
@@ -96,12 +182,38 @@ import { useCommentExcel } from '@/stores/commentExcel'
import
{
storeToRefs
}
from
'pinia'
import
{
storeToRefs
}
from
'pinia'
import
{
isFunction
}
from
'@/utils/is'
import
{
isFunction
}
from
'@/utils/is'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
{
ElMessage
,
ElMessageBox
}
from
'element-plus'
import
{
addExcelArea
,
getExcelAreaByFileId
}
from
'@/api/excel'
import
{
addExcelArea
,
addExcelAreaConnect
,
excelMarkRun
,
getExcelAreaByFileId
,
getExcelConnectByFileId
,
removeExcelArea
,
removeExcelAreaConnect
}
from
'@/api/excel'
import
type
{
Recordable
}
from
'@/types/global'
import
type
{
Recordable
}
from
'@/types/global'
import
{
getRangetxt
}
from
'@/utils/excel'
import
{
getRangetxt
}
from
'@/utils/excel'
import
type
{
VxeTableInstance
}
from
'vxe-table'
const
connectVisible
=
ref
(
false
)
const
xTableConnect
=
ref
<
VxeTableInstance
>
()
const
beConnectTable
=
ref
<
VxeTableInstance
>
()
const
luckysheet
=
(
window
as
any
).
luckysheet
const
commentExcelStore
=
useCommentExcel
()
const
commentExcelStore
=
useCommentExcel
()
const
{
getFileInfo
}
=
storeToRefs
(
commentExcelStore
)
const
{
getFileInfo
}
=
storeToRefs
(
commentExcelStore
)
const
connectList
=
ref
<
any
[]
>
([])
const
chooseVisible
=
ref
(
false
)
const
currentConnectInfo
=
reactive
<
Recordable
>
({
excelAreaConnectId
:
''
,
excelAreaId
:
''
,
excelAreaBeId
:
''
,
connectFiled
:
[],
beConnectFiled
:
[],
fileId
:
''
})
const
beConnectData
=
computed
(()
=>
areaList
.
value
.
filter
((
v
:
any
)
=>
v
.
excelAreaId
!=
currentConnectInfo
.
excelAreaId
)
)
const
formState
=
reactive
({
const
formState
=
reactive
({
excelAreaId
:
''
,
excelAreaId
:
''
,
fileId
:
''
,
fileId
:
''
,
...
@@ -114,6 +226,11 @@ const formState = reactive({
...
@@ -114,6 +226,11 @@ const formState = reactive({
excelAreaNicname
:
''
excelAreaNicname
:
''
})
})
const
isSetSheetMark
=
ref
<
any
>
([])
const
initIsSetSheetMark
=
(
length
:
number
)
=>
{
isSetSheetMark
.
value
=
Array
.
from
({
length
}).
fill
(
false
)
}
/**
/**
* 存储在本地的区域标记
* 存储在本地的区域标记
* locaExcelAreaMarks = {
* locaExcelAreaMarks = {
...
@@ -123,7 +240,7 @@ const formState = reactive({
...
@@ -123,7 +240,7 @@ const formState = reactive({
const
locaExcelAreaMarks
:
Recordable
=
reactive
({})
const
locaExcelAreaMarks
:
Recordable
=
reactive
({})
const
areaList
=
computed
(()
=>
flatten
(
Object
.
values
(
locaExcelAreaMarks
)))
const
areaList
=
computed
(()
=>
flatten
(
Object
.
values
(
locaExcelAreaMarks
)))
const
initExcelAreaMarksKey
=
(
len
)
=>
{
const
initExcelAreaMarksKey
=
(
len
:
number
)
=>
{
Array
.
from
({
length
:
len
}).
forEach
((
item
,
index
)
=>
{
Array
.
from
({
length
:
len
}).
forEach
((
item
,
index
)
=>
{
Reflect
.
set
(
locaExcelAreaMarks
,
index
,
[])
Reflect
.
set
(
locaExcelAreaMarks
,
index
,
[])
})
})
...
@@ -142,16 +259,16 @@ const setSheetAuthority = (exportJson: any) => {
...
@@ -142,16 +259,16 @@ const setSheetAuthority = (exportJson: any) => {
const
cellClick
=
({
row
})
=>
{
const
cellClick
=
({
row
})
=>
{
// 判断是否是当前sheet页标记
// 判断是否是当前sheet页标记
const
sheet
=
window
.
luckysheet
.
getSheet
()
const
sheet
=
luckysheet
.
getSheet
()
if
(
sheet
.
order
!=
=
row
.
sheetNum
)
{
if
(
sheet
.
order
!=
row
.
sheetNum
)
{
window
.
luckysheet
.
setSheetActive
(
row
.
sheetNum
)
luckysheet
.
setSheetActive
(
row
.
sheetNum
)
}
}
window
.
luckysheet
.
scroll
({
luckysheet
.
scroll
({
targetRow
:
row
.
beginRow
,
targetRow
:
row
.
beginRow
,
targetColumn
:
row
.
beginColum
targetColumn
:
row
.
beginColum
})
})
setTimeout
(()
=>
{
setTimeout
(()
=>
{
window
.
luckysheet
.
setRangeShow
({
luckysheet
.
setRangeShow
({
row
:
[
row
.
beginRow
,
row
.
endRow
],
row
:
[
row
.
beginRow
,
row
.
endRow
],
column
:
[
row
.
beginColum
,
row
.
endColum
]
column
:
[
row
.
beginColum
,
row
.
endColum
]
})
})
...
@@ -173,7 +290,7 @@ const setAreaMark = async (type: 'data' | 'head' = 'data') => {
...
@@ -173,7 +290,7 @@ const setAreaMark = async (type: 'data' | 'head' = 'data') => {
})
})
resetCachArea
(()
=>
{
resetCachArea
(()
=>
{
// 设置当前选区
// 设置当前选区
window
.
luckysheet
.
setRangeShow
({
luckysheet
.
setRangeShow
({
row
:
[
formState
.
beginRow
,
formState
.
endRow
],
row
:
[
formState
.
beginRow
,
formState
.
endRow
],
column
:
[
formState
.
beginColum
,
formState
.
endColum
]
column
:
[
formState
.
beginColum
,
formState
.
endColum
]
})
})
...
@@ -198,7 +315,7 @@ const setAreaMark = async (type: 'data' | 'head' = 'data') => {
...
@@ -198,7 +315,7 @@ const setAreaMark = async (type: 'data' | 'head' = 'data') => {
* 判断是否有重复的单元格添加,如有重复无需添加此单元格
* 判断是否有重复的单元格添加,如有重复无需添加此单元格
*/
*/
const
result
=
[]
const
result
=
[]
const
rangeData
=
window
.
luckysheet
.
getRangeValue
()
const
rangeData
=
luckysheet
.
getRangeValue
()
console
.
log
(
'rangeData'
,
rangeData
)
console
.
log
(
'rangeData'
,
rangeData
)
const
{
beginColum
,
beginRow
,
endColum
,
endRow
}
=
formState
const
{
beginColum
,
beginRow
,
endColum
,
endRow
}
=
formState
for
(
let
i
=
beginRow
,
r
=
0
;
i
<=
endRow
;
i
++
)
{
for
(
let
i
=
beginRow
,
r
=
0
;
i
<=
endRow
;
i
++
)
{
...
@@ -222,7 +339,7 @@ const setAreaMark = async (type: 'data' | 'head' = 'data') => {
...
@@ -222,7 +339,7 @@ const setAreaMark = async (type: 'data' | 'head' = 'data') => {
setTimeout
(()
=>
{
setTimeout
(()
=>
{
// 设置区域颜色
// 设置区域颜色
window
.
luckysheet
.
setRangeFormat
(
'bg'
,
areaMarksColor
[
type
])
luckysheet
.
setRangeFormat
(
'bg'
,
areaMarksColor
[
type
])
},
100
)
},
100
)
}
}
const
resetCachAreaState
=
()
=>
{
const
resetCachAreaState
=
()
=>
{
...
@@ -243,7 +360,7 @@ const resetCachAreaState = () => {
...
@@ -243,7 +360,7 @@ const resetCachAreaState = () => {
}
}
const
resetCachArea
=
(
fn
?:
Function
)
=>
{
const
resetCachArea
=
(
fn
?:
Function
)
=>
{
// 清除区域颜色
// 清除区域颜色
window
.
luckysheet
.
setRangeShow
(
luckysheet
.
setRangeShow
(
{
{
row
:
[
cachAreaMark
.
beginRow
,
cachAreaMark
.
endRow
],
row
:
[
cachAreaMark
.
beginRow
,
cachAreaMark
.
endRow
],
column
:
[
cachAreaMark
.
beginColum
,
cachAreaMark
.
endColum
]
column
:
[
cachAreaMark
.
beginColum
,
cachAreaMark
.
endColum
]
...
@@ -251,7 +368,7 @@ const resetCachArea = (fn?: Function) => {
...
@@ -251,7 +368,7 @@ const resetCachArea = (fn?: Function) => {
{
{
show
:
false
,
show
:
false
,
success
:
()
=>
{
success
:
()
=>
{
window
.
luckysheet
.
setRangeFormat
(
'bg'
,
areaMarksColor
[
'default'
])
luckysheet
.
setRangeFormat
(
'bg'
,
areaMarksColor
[
'default'
])
resetCachAreaState
()
resetCachAreaState
()
fn
&&
fn
()
fn
&&
fn
()
}
}
...
@@ -260,7 +377,7 @@ const resetCachArea = (fn?: Function) => {
...
@@ -260,7 +377,7 @@ const resetCachArea = (fn?: Function) => {
}
}
const
resetCachHeadArea
=
()
=>
{
const
resetCachHeadArea
=
()
=>
{
// 清除标题区域颜色 -> 设置成数据区域颜色
// 清除标题区域颜色 -> 设置成数据区域颜色
window
.
luckysheet
.
setRangeShow
(
luckysheet
.
setRangeShow
(
{
{
row
:
[
cachAreaMark
.
beginRow
,
cachAreaMark
.
endRow
],
row
:
[
cachAreaMark
.
beginRow
,
cachAreaMark
.
endRow
],
column
:
[
cachAreaMark
.
beginColum
,
cachAreaMark
.
endColum
]
column
:
[
cachAreaMark
.
beginColum
,
cachAreaMark
.
endColum
]
...
@@ -268,13 +385,14 @@ const resetCachHeadArea = () => {
...
@@ -268,13 +385,14 @@ const resetCachHeadArea = () => {
{
{
show
:
false
,
show
:
false
,
success
:
()
=>
{
success
:
()
=>
{
window
.
luckysheet
.
setRangeFormat
(
'bg'
,
areaMarksColor
[
'data'
])
luckysheet
.
setRangeFormat
(
'bg'
,
areaMarksColor
[
'data'
])
// 删除 excelAreaTitle 属性
// 删除 excelAreaTitle 属性
delete
cachAreaMark
.
excelAreaTitle
delete
cachAreaMark
.
excelAreaTitle
}
}
}
}
)
)
}
}
const
saveAreaMark
=
async
()
=>
{
const
saveAreaMark
=
async
()
=>
{
cachAreaMark
.
fileId
=
getFileInfo
.
value
.
orderFileId
cachAreaMark
.
fileId
=
getFileInfo
.
value
.
orderFileId
const
{
data
}
=
await
addExcelArea
(
cachAreaMark
)
const
{
data
}
=
await
addExcelArea
(
cachAreaMark
)
...
@@ -283,27 +401,183 @@ const saveAreaMark = async () => {
...
@@ -283,27 +401,183 @@ const saveAreaMark = async () => {
resetCachAreaState
()
resetCachAreaState
()
}
}
const
cachDelOtherSheetArea
=
reactive
<
Recordable
>
({})
const
delAreaMark
=
async
(
row
:
any
)
=>
{
// 调用接口删除
await
removeExcelArea
(
row
.
excelAreaId
)
const
sheet
=
luckysheet
.
getSheet
()
/**
* 如果在本sheet那么直接删除,并且改变区域颜色
* 如果不在当前sheet,保存删除的数据,在切换sheet的hook中删除颜色
*/
if
(
row
.
sheetNum
==
sheet
.
order
)
{
const
range
:
Recordable
=
{
row
:
[
row
.
beginRow
,
row
.
endRow
],
column
:
[
row
.
beginColum
,
row
.
endColum
]
}
luckysheet
.
setRangeShow
(
range
)
setTimeout
(()
=>
{
luckysheet
.
setRangeFormat
(
'bg'
,
areaMarksColor
[
'default'
])
},
100
)
}
else
{
// 保存本地
if
(
!
Reflect
.
has
(
cachDelOtherSheetArea
,
row
.
sheetNum
))
{
cachDelOtherSheetArea
[
row
.
sheetNum
]
=
[]
}
cachDelOtherSheetArea
[
row
.
sheetNum
].
push
(
row
)
}
// 删除本地标记 locaExcelAreaMark[row.sheetNum] 对应的区域
const
index
=
locaExcelAreaMarks
[
row
.
sheetNum
].
findIndex
(
(
item
:
any
)
=>
item
.
excelAreaId
==
row
.
excelAreaId
)
locaExcelAreaMarks
[
row
.
sheetNum
].
splice
(
index
,
1
)
}
const
queryArea
=
async
()
=>
{
const
queryArea
=
async
()
=>
{
const
{
data
}
=
await
getExcelAreaByFileId
(
getFileInfo
.
value
.
orderFileId
)
const
{
data
}
=
await
getExcelAreaByFileId
(
getFileInfo
.
value
.
orderFileId
)
data
.
result
.
forEach
((
item
)
=>
locaExcelAreaMarks
[
item
.
sheetNum
].
push
(
item
))
data
.
result
.
forEach
((
item
:
any
)
=>
locaExcelAreaMarks
[
item
.
sheetNum
||
0
].
push
(
item
))
}
const
confirmConnect
=
()
=>
{
/**
* 1. 验证是否选择了要关联的title
* 2. 验证选择的title是否有被关联的title
* 3. 添加关联关系
*/
const
list
=
xTableConnect
.
value
?.
getCheckboxRecords
()
if
(
!
list
?.
length
)
{
addConnect
([])
return
// return ElMessage.warning('请选择有效数据!')
}
try
{
list
.
forEach
((
item
)
=>
{
if
(
!
item
.
betitle
)
{
throw
new
Error
(
'请选择被关联的title!!'
)
}
})
}
catch
(
e
:
any
)
{
ElMessage
.
warning
(
e
.
message
)
}
addConnect
(
list
)
}
const
addConnect
=
async
(
list
:
any
)
=>
{
list
.
forEach
((
item
:
any
)
=>
{
currentConnectInfo
.
connectFiled
.
push
({
title
:
item
.
title
,
sheet
:
item
.
sheet
,
row
:
item
.
row
,
colum
:
item
.
colum
})
currentConnectInfo
.
beConnectFiled
.
push
({
title
:
item
.
betitle
,
sheet
:
item
.
besheet
,
row
:
item
.
berow
,
colum
:
item
.
becolum
})
})
currentConnectInfo
.
fileId
=
getFileInfo
.
value
.
orderFileId
const
{
data
}
=
await
addExcelAreaConnect
(
currentConnectInfo
)
if
(
!
data
?.
success
)
{
ElMessage
.
error
(
data
?.
message
||
'操作失败!'
)
return
}
ElMessage
.
success
(
'添加成功!'
)
connectVisible
.
value
=
false
// 添加成功 手动更新页面数据
connectList
.
value
.
push
(
data
.
result
)
}
const
chooseConnect
=
(
row
:
any
)
=>
{
currentConnectInfo
.
excelAreaId
=
row
.
excelAreaId
chooseVisible
.
value
=
true
}
}
const
connectConfigData
=
ref
([])
const
beConnectSelectOptions
=
computed
(
()
=>
areaList
.
value
.
find
((
v
:
any
)
=>
v
.
excelAreaId
==
currentConnectInfo
.
excelAreaBeId
)
?.
excelAreaTitle
||
[]
)
watch
(
connectVisible
,
(
val
)
=>
{
if
(
val
)
{
const
titles
=
areaList
.
value
.
find
((
v
:
any
)
=>
v
.
excelAreaId
==
currentConnectInfo
.
excelAreaId
)
?.
excelAreaTitle
connectConfigData
.
value
=
titles
.
map
((
item
:
any
)
=>
{
return
{
title
:
item
.
title
,
sheet
:
item
.
sheet
,
row
:
item
.
row
,
colum
:
item
.
colum
,
betitle
:
''
,
berow
:
''
,
becolum
:
''
,
besheet
:
''
}
})
}
})
const
changeBeConnect
=
(
v
:
string
,
row
:
any
)
=>
{
const
option
=
beConnectSelectOptions
.
value
.
find
((
item
:
any
)
=>
item
.
title
==
v
)
console
.
log
(
'option'
,
option
)
row
.
becolum
=
option
.
colum
row
.
besheet
=
option
.
sheet
row
.
berow
=
option
.
row
row
.
betitle
=
option
.
title
}
const
confirmBeConnect
=
()
=>
{
const
data
=
beConnectTable
.
value
?.
getRadioRecord
()
if
(
!
data
)
{
return
ElMessage
.
warning
(
'请选择有效数据!'
)
}
currentConnectInfo
.
excelAreaBeId
=
data
.
excelAreaId
// 打开关联弹窗。
chooseVisible
.
value
=
false
connectVisible
.
value
=
true
}
const
chooseConnectOnHide
=
()
=>
{
Object
.
assign
(
currentConnectInfo
,
{
// excelAreaConnectId: '',
// excelAreaId: '',
// excelAreaBeId: '',
connectFiled
:
[],
beConnectFiled
:
[],
// fileId: ''
})
}
const
delConnect
=
async
(
row
:
any
,
index
:
number
)
=>
{
const
{
data
}
=
await
removeExcelAreaConnect
(
row
.
excelAreaConnectId
)
if
(
data
?.
success
)
{
ElMessage
.
success
(
'删除成功!'
)
}
// 手动删除
connectList
.
value
.
splice
(
index
,
1
)
}
const
queryConnectList
=
async
()
=>
{
const
{
data
}
=
await
getExcelConnectByFileId
(
getFileInfo
.
value
.
orderFileId
)
connectList
.
value
=
data
.
result
}
const
loadExcel
=
()
=>
{
const
loadExcel
=
()
=>
{
LuckyExcel
.
transformExcelToLuckyByUrl
(
LuckyExcel
.
transformExcelToLuckyByUrl
(
'/api/sys/static/'
+
getFileInfo
.
value
.
mergeFilePath
,
'/api/sys/static/'
+
getFileInfo
.
value
.
mergeFilePath
,
new
Date
().
getTime
()
+
'.xlsx'
,
new
Date
().
getTime
()
+
'.xlsx'
,
async
(
exportJson
:
any
)
=>
{
async
(
exportJson
:
any
)
=>
{
console
.
log
(
'---exportJson'
,
exportJson
)
console
.
log
(
'---exportJson'
,
exportJson
)
initIsSetSheetMark
(
exportJson
.
sheets
.
length
)
initExcelAreaMarksKey
(
exportJson
.
sheets
.
length
)
initExcelAreaMarksKey
(
exportJson
.
sheets
.
length
)
// 查询区域标记
// 查询区域标记
await
queryArea
()
await
queryArea
()
setSheetAuthority
(
exportJson
)
setSheetAuthority
(
exportJson
)
isFunction
(
window
?.
luckysheet
?.
destroy
)
&&
window
.
luckysheet
.
destroy
()
isFunction
((
window
as
any
)?.
luckysheet
?.
destroy
)
&&
luckysheet
.
destroy
()
luckysheet
.
create
({
window
.
luckysheet
.
create
({
container
:
'luckysheet'
,
//luckysheet is the container id
container
:
'luckysheet'
,
//luckysheet is the container id
showinfobar
:
false
,
showinfobar
:
false
,
showtoolbar
:
false
,
showtoolbar
:
false
,
...
@@ -331,22 +605,83 @@ const loadExcel = () => {
...
@@ -331,22 +605,83 @@ const loadExcel = () => {
formState
.
endRow
=
endRow
formState
.
endRow
=
endRow
}
}
},
},
sheetActivate
:
()
=>
{},
sheetActivate
:
(
index
:
any
)
=>
{
const
sheet
=
luckysheet
.
getSheet
({
index
})
if
(
!!
isSetSheetMark
.
value
[
sheet
.
order
])
{
return
}
isSetSheetMark
.
value
[
sheet
.
order
]
=
true
console
.
log
(
isSetSheetMark
,
locaExcelAreaMarks
)
if
(
locaExcelAreaMarks
[
sheet
.
order
].
length
)
{
locaExcelAreaMarks
[
sheet
.
order
].
forEach
((
item
:
any
)
=>
{
// 设置数据区标记
setTimeout
(()
=>
{
luckysheet
.
menuButton
.
customUpdateFormat
(
null
,
'bg'
,
areaMarksColor
[
'data'
],
item
.
beginRow
,
item
.
endRow
,
item
.
beginColum
,
item
.
endColum
,
false
)
},
50
)
if
(
item
.
excelAreaTitle
.
length
)
{
item
.
excelAreaTitle
.
forEach
((
cell
:
any
)
=>
{
// 设置数据区head标记
setTimeout
(()
=>
{
luckysheet
.
menuButton
.
customUpdateFormat
(
null
,
'bg'
,
areaMarksColor
[
'head'
],
cell
.
row
,
cell
.
row
,
cell
.
colum
,
cell
.
colum
,
false
)
},
50
)
})
}
})
}
},
workbookCreateAfter
:
()
=>
{
workbookCreateAfter
:
()
=>
{
// 修改当前sheet 已经标记
isSetSheetMark
.
value
[
0
]
=
true
// 判断本地是否有第一个sheet页的标记
// 判断本地是否有第一个sheet页的标记
if
(
locaExcelAreaMarks
[
0
].
length
)
{
if
(
locaExcelAreaMarks
[
0
].
length
)
{
locaExcelAreaMarks
[
0
].
forEach
((
item
)
=>
{
locaExcelAreaMarks
[
0
].
forEach
((
item
:
any
)
=>
{
// 设置数据区标记
// 设置数据区标记
window
.
luckysheet
.
menuButton
.
customUpdateFormat
(
luckysheet
.
menuButton
.
customUpdateFormat
(
null
,
null
,
'bg'
,
'bg'
,
areaMarksColor
[
'data'
],
areaMarksColor
[
'data'
],
item
.
beginRow
,
item
.
beginRow
,
item
.
endRow
,
item
.
endRow
,
item
.
beginColum
,
item
.
beginColum
,
item
.
endColum
item
.
endColum
,
false
)
)
if
(
item
.
excelAreaTitle
.
length
)
{
item
.
excelAreaTitle
.
forEach
((
cell
:
any
)
=>
{
// 设置数据区head标记
// luckysheet.setCellValue()
luckysheet
.
menuButton
.
customUpdateFormat
(
null
,
'bg'
,
areaMarksColor
[
'head'
],
cell
.
row
,
cell
.
row
,
cell
.
colum
,
cell
.
colum
,
false
)
})
}
})
})
}
}
}
}
...
@@ -355,11 +690,20 @@ const loadExcel = () => {
...
@@ -355,11 +690,20 @@ const loadExcel = () => {
}
}
)
)
}
}
const
toRun
=
async
()
=>
{
const
{
data
}
=
await
excelMarkRun
(
getFileInfo
.
value
.
orderFileId
)
if
(
data
?.
code
!=
200
)
{
ElMessage
.
error
(
data
?.
message
||
'操作失败!'
)
return
}
}
onMounted
(()
=>
{
onMounted
(()
=>
{
loadExcel
()
loadExcel
()
queryConnectList
()
})
})
onUnmounted
(()
=>
{
onUnmounted
(()
=>
{
isFunction
(
window
?.
luckysheet
?.
destroy
)
&&
window
.
luckysheet
.
destroy
()
isFunction
(
(
window
as
any
)?.
luckysheet
?.
destroy
)
&&
luckysheet
.
destroy
()
})
})
</
script
>
</
script
>
<
style
lang=
"scss"
scoped
>
<
style
lang=
"scss"
scoped
>
...
...
tsconfig.app.json
View file @
8131d776
{
{
"extends"
:
"@vue/tsconfig/tsconfig.dom.json"
,
"extends"
:
"@vue/tsconfig/tsconfig.dom.json"
,
"include"
:
[
"env.d.ts"
,
"src/**/*"
,
"src/**/*.vue"
,
"src/**/*.ts"
],
"include"
:
[
"env.d.ts"
,
"
global.d.ts"
,
"
src/**/*"
,
"src/**/*.vue"
,
"src/**/*.ts"
],
"exclude"
:
[
"src/**/__tests__/*"
],
"exclude"
:
[
"src/**/__tests__/*"
],
"compilerOptions"
:
{
"compilerOptions"
:
{
"composite"
:
true
,
"composite"
:
true
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment