feat(export): 前端生成 xlsx 前把对象/数组单元格 JSON 序列化

后端 export 改为只发原始对象后,前端在 json_to_sheet 前通用地 stringify 非标量单元格
(覆盖 tab 等),避免 [object Object];import 时由后端 reqFilter 还原。
This commit is contained in:
2026-06-29 21:47:10 +08:00
parent 35abfd831c
commit c44f2a159e
2 changed files with 11 additions and 2 deletions
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "shrimp-admin", "name": "shrimp-admin",
"version": "0.3.9", "version": "0.3.10",
"private": true, "private": true,
"description": "Shrimp 框架前端 — 消费 ShrimpServer + ShrimpTable 契约的经典 Vue3 + Element Plus 实现", "description": "Shrimp 框架前端 — 消费 ShrimpServer + ShrimpTable 契约的经典 Vue3 + Element Plus 实现",
"main": "src/index.ts", "main": "src/index.ts",
+10 -1
View File
@@ -442,7 +442,16 @@ async function handleExport() {
} }
if (ownerId.value) query.ownerId = ownerId.value if (ownerId.value) query.ownerId = ownerId.value
const list = await api.export(query) const list = await api.export(query)
const ws = XLSX.utils.json_to_sheet(list) // 后端只发原始对象;xlsx 单元格放不下对象/数组(会变 [object Object]),这里通用地 JSON 序列化
// (覆盖 tab 等结构化字段)。import 时这些字符串由后端各类型 reqFilter 还原。
const rows = list.map((row: Record<string, any>) => {
const out: Record<string, any> = {}
for (const [k, v] of Object.entries(row)) {
out[k] = (v !== null && typeof v === 'object') ? JSON.stringify(v) : v
}
return out
})
const ws = XLSX.utils.json_to_sheet(rows)
const wb = XLSX.utils.book_new() const wb = XLSX.utils.book_new()
XLSX.utils.book_append_sheet(wb, ws, props.moduleKey) XLSX.utils.book_append_sheet(wb, ws, props.moduleKey)
XLSX.writeFile(wb, `${props.moduleKey}_export_${Date.now()}.xlsx`) XLSX.writeFile(wb, `${props.moduleKey}_export_${Date.now()}.xlsx`)