调整Excel导出时使用的方法

This commit is contained in:
2025-12-28 12:15:37 +08:00
parent 47cbdbb2de
commit e3d9bbbcc5
4 changed files with 142 additions and 66 deletions

View File

@@ -6,6 +6,7 @@ import (
"reflect"
"time"
"git.toowon.com/jimmy/go-common/tools"
"github.com/xuri/excelize/v2"
)
@@ -94,21 +95,33 @@ func (e *Excel) ExportToWriter(w io.Writer, sheetName string, columns []ExportCo
sheetName = "Sheet1"
}
// 删除默认工作表(如果存在
index, err := e.file.GetSheetIndex("Sheet1")
if err == nil && index > 0 {
e.file.DeleteSheet("Sheet1")
}
// 检查工作表是否已存在
sheetIndex, err := e.file.GetSheetIndex(sheetName)
if err != nil || sheetIndex == 0 {
// 工作表不存在,需要创建
// 如果sheetName不是"Sheet1",且默认"Sheet1"存在,则删除它
if sheetName != "Sheet1" {
defaultIndex, _ := e.file.GetSheetIndex("Sheet1")
if defaultIndex > 0 {
e.file.DeleteSheet("Sheet1")
}
}
// 创建新工作表
_, err = e.file.NewSheet(sheetName)
if err != nil {
return fmt.Errorf("failed to create sheet: %w", err)
// 创建新工作表
_, err = e.file.NewSheet(sheetName)
if err != nil {
return fmt.Errorf("failed to create sheet: %w", err)
}
// 重新获取工作表索引
sheetIndex, err = e.file.GetSheetIndex(sheetName)
if err != nil {
return fmt.Errorf("failed to get sheet index: %w", err)
}
}
// 设置活动工作表
sheetIndex, err := e.file.GetSheetIndex(sheetName)
if err == nil && sheetIndex > 0 {
if sheetIndex > 0 {
e.file.SetActiveSheet(sheetIndex)
}
@@ -210,21 +223,33 @@ func (e *Excel) ExportToFile(filePath string, sheetName string, columns []Export
sheetName = "Sheet1"
}
// 删除默认工作表(如果存在
index, err := e.file.GetSheetIndex("Sheet1")
if err == nil && index > 0 {
e.file.DeleteSheet("Sheet1")
}
// 检查工作表是否已存在
sheetIndex, err := e.file.GetSheetIndex(sheetName)
if err != nil || sheetIndex == 0 {
// 工作表不存在,需要创建
// 如果sheetName不是"Sheet1",且默认"Sheet1"存在,则删除它
if sheetName != "Sheet1" {
defaultIndex, _ := e.file.GetSheetIndex("Sheet1")
if defaultIndex > 0 {
e.file.DeleteSheet("Sheet1")
}
}
// 创建新工作表
_, err = e.file.NewSheet(sheetName)
if err != nil {
return fmt.Errorf("failed to create sheet: %w", err)
// 创建新工作表
_, err = e.file.NewSheet(sheetName)
if err != nil {
return fmt.Errorf("failed to create sheet: %w", err)
}
// 重新获取工作表索引
sheetIndex, err = e.file.GetSheetIndex(sheetName)
if err != nil {
return fmt.Errorf("failed to get sheet index: %w", err)
}
}
// 设置活动工作表
sheetIndex, err := e.file.GetSheetIndex(sheetName)
if err == nil && sheetIndex > 0 {
if sheetIndex > 0 {
e.file.SetActiveSheet(sheetIndex)
}
@@ -451,31 +476,49 @@ func (e *Excel) getColumnMaxWidth(sheetName string, colIndex int, maxRow int) fl
return maxWidth
}
// FormatDateTime 格式化日期时间(便捷函数)
// 用于ExportColumn的Format字段
func FormatDateTime(layout string) func(interface{}) string {
// AdaptTimeFormatter 适配器函数将tools包的格式化函数转换为Excel Format字段需要的函数类型
// 允许直接使用tools包的任何格式化函数
//
// 示例:
//
// // 直接使用tools.FormatDate
// Format: excel.AdaptTimeFormatter(tools.FormatDate)
//
// // 使用自定义格式化函数
// Format: excel.AdaptTimeFormatter(func(t time.Time) string {
// return tools.Format(t, "2006-01-02 15:04:05", "Asia/Shanghai")
// })
func AdaptTimeFormatter(fn func(time.Time, ...string) string) func(interface{}) string {
return func(value interface{}) string {
if t, ok := value.(time.Time); ok {
return t.Format(layout)
return fn(t)
}
return ""
}
}
// FormatDate 格式化日期便捷函数)
// 用于ExportColumn的Format字段格式2006-01-02
func FormatDate(value interface{}) string {
if t, ok := value.(time.Time); ok {
return t.Format("2006-01-02")
}
return ""
// formatDateTime 格式化日期时间(内部便捷函数)
// 用于ExportColumn的Format字段
// layout: 时间格式,如 "2006-01-02 15:04:05"
// timezone: 可选时区,如果为空则使用时间对象本身的时区
// 直接调用 tools.Format() 方法
func formatDateTime(layout string, timezone ...string) func(interface{}) string {
return AdaptTimeFormatter(func(t time.Time, _ ...string) string {
return tools.Format(t, layout, timezone...)
})
}
// FormatDateTimeDefault 格式化日期时间(便捷函数)
// formatDate 格式化日期(内部便捷函数)
// 用于ExportColumn的Format字段格式2006-01-02
// 直接调用 tools.FormatDate() 方法
var formatDate = AdaptTimeFormatter(tools.FormatDate)
// formatDateTimeDefault 格式化日期时间(内部便捷函数)
// 用于ExportColumn的Format字段格式2006-01-02 15:04:05
func FormatDateTimeDefault(value interface{}) string {
if t, ok := value.(time.Time); ok {
return t.Format("2006-01-02 15:04:05")
}
return ""
}
// 直接调用 tools.FormatDateTime() 方法
var formatDateTimeDefault = AdaptTimeFormatter(tools.FormatDateTime)
// formatTime 格式化时间(内部便捷函数)
// 用于ExportColumn的Format字段格式15:04:05
// 直接调用 tools.FormatTime() 方法
var formatTime = AdaptTimeFormatter(tools.FormatTime)