当前位置:网站首页>Go-Excelize API源码阅读(六)—— DeleteSheet(sheet string)
Go-Excelize API源码阅读(六)—— DeleteSheet(sheet string)
2022-08-10 16:49:00 【InfoQ】
Go-Excelize API源码阅读(六)—— DeleteSheet(sheet string)
一、Go-Excelize简介
二、DeleteSheet(sheet string)
func (f *File) DeleteSheet(sheet string)
func (f *File) DeleteSheet(name string) {
if f.SheetCount == 1 || f.GetSheetIndex(name) == -1 {
return
}
sheetName := trimSheetName(name)
wb := f.workbookReader()
wbRels := f.relsReader(f.getWorkbookRelsPath())
activeSheetName := f.GetSheetName(f.GetActiveSheetIndex())
deleteLocalSheetID := f.GetSheetIndex(name)
deleteAndAdjustDefinedNames(wb, deleteLocalSheetID)
for idx, sheet := range wb.Sheets.Sheet {
if !strings.EqualFold(sheet.Name, sheetName) {
continue
}
wb.Sheets.Sheet = append(wb.Sheets.Sheet[:idx], wb.Sheets.Sheet[idx+1:]...)
var sheetXML, rels string
if wbRels != nil {
for _, rel := range wbRels.Relationships {
if rel.ID == sheet.ID {
sheetXML = f.getWorksheetPath(rel.Target)
rels = "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[sheetName], "xl/worksheets/") + ".rels"
}
}
}
target := f.deleteSheetFromWorkbookRels(sheet.ID)
f.deleteSheetFromContentTypes(target)
f.deleteCalcChain(sheet.SheetID, "")
delete(f.sheetMap, sheet.Name)
f.Pkg.Delete(sheetXML)
f.Pkg.Delete(rels)
f.Relationships.Delete(rels)
f.Sheet.Delete(sheetXML)
delete(f.xmlAttr, sheetXML)
f.SheetCount--
}
f.SetActiveSheet(f.GetSheetIndex(activeSheetName))
}
if f.SheetCount == 1 || f.GetSheetIndex(name) == -1 {
return
}
func (f *File) GetSheetIndex(name string) int {
for index, sheet := range f.GetSheetList() {
if strings.EqualFold(sheet, trimSheetName(name)) {
return index
}
}
return -1
}
GetSheetIndexsheetName := trimSheetName(name)func trimSheetName(name string) string {
if strings.ContainsAny(name, ":\\/?*[]") || utf8.RuneCountInString(name) > 31 {
r := make([]rune, 0, 31)
for _, v := range name {
switch v {
case 58, 92, 47, 63, 42, 91, 93: // replace :\/?*[]
continue
default:
r = append(r, v)
}
if len(r) == 31 {
break
}
}
name = string(r)
}
return name
}
\/?*[] wb := f.workbookReader()
wbRels := f.relsReader(f.getWorkbookRelsPath())
workbookReaderrelsReader activeSheetName := f.GetSheetName(f.GetActiveSheetIndex())
deleteLocalSheetID := f.GetSheetIndex(name)
deleteAndAdjustDefinedNames(wb, deleteLocalSheetID)

GetActiveSheetIndexfunc deleteAndAdjustDefinedNames(wb *xlsxWorkbook, deleteLocalSheetID int) {
if wb == nil || wb.DefinedNames == nil {
return
}
for idx := 0; idx < len(wb.DefinedNames.DefinedName); idx++ {
dn := wb.DefinedNames.DefinedName[idx]
if dn.LocalSheetID != nil {
localSheetID := *dn.LocalSheetID
if localSheetID == deleteLocalSheetID {
wb.DefinedNames.DefinedName = append(wb.DefinedNames.DefinedName[:idx], wb.DefinedNames.DefinedName[idx+1:]...)
idx--
} else if localSheetID > deleteLocalSheetID {
wb.DefinedNames.DefinedName[idx].LocalSheetID = intPtr(*dn.LocalSheetID - 1)
}
}
}
}

for idx, sheet := range wb.Sheets.Sheet {
if !strings.EqualFold(sheet.Name, sheetName) {
continue
}
wb.Sheets.Sheet = append(wb.Sheets.Sheet[:idx], wb.Sheets.Sheet[idx+1:]...)
var sheetXML, rels string
if wbRels != nil {
for _, rel := range wbRels.Relationships {
if rel.ID == sheet.ID {
sheetXML = f.getWorksheetPath(rel.Target)
rels = "xl/worksheets/_rels/" + strings.TrimPrefix(f.sheetMap[sheetName], "xl/worksheets/") + ".rels"
}
}
}
target := f.deleteSheetFromWorkbookRels(sheet.ID)
f.deleteSheetFromContentTypes(target)
f.deleteCalcChain(sheet.SheetID, "")
delete(f.sheetMap, sheet.Name)
f.Pkg.Delete(sheetXML)
f.Pkg.Delete(rels)
f.Relationships.Delete(rels)
f.Sheet.Delete(sheetXML)
delete(f.xmlAttr, sheetXML)
f.SheetCount--
}
sheetNamef.SetActiveSheet(f.GetSheetIndex(activeSheetName))三、结语
边栏推荐
猜你喜欢

docker中安装mysql

直播预告|从新手村到魔王城,高效默契的敏捷团队如何炼成

什么是开源中的 “胖虎效应”

在 Istio 服务网格内连接外部 MySQL 数据库

How to realize full backup and incremental backup of MySQL database

C语言按位运算符如何使用

Embedded Development: Embedded Basics - Mapping Peripherals Using Arrays of Pointers

shell之正则表达式及三剑客awk命令

网易云信亮相LiveVideoStackCon2022,解构基于WebRTC的开源低延时播放器实践

百日刷题挑战--错题01day
随机推荐
如何构建一个自己的代理ip池
1001 A+B Format(字符串处理)
Yi Gene|In-depth review: epigenetic regulation of m6A RNA methylation in brain development and disease
剑指OfferⅡ 045.二叉树最底层最左边的值 dfs
个人博客部署注意的几点问题
ARM开发(三)ARM寻址方式,异常中断,异常向量表
软件工程基础知识--需求分析
网易云信亮相LiveVideoStackCon2022,解构基于WebRTC的开源低延时播放器实践
Basic knowledge of software engineering--requirements analysis
神经网络有哪些激活函数,卷积神经网络有哪些
String compression (3) short string compression
开源生态与AI芯片的碰撞&Dragonfly基于P2P的镜像加速系统 | 第 39-40 期
【荣耀智慧服务】快捷服务开发指南
国内油价四连跌,但下跌趋势可能终止
shell之正则表达式及三剑客awk命令
在 Istio 服务网格内连接外部 MySQL 数据库
leetcode:1137. 第 N 个泰波那契数
App自动化测试框架设计与实现
生成树协议(STP---Spanning Tree Protocol)
聊聊云原生数据平台