234 lines
6.3 KiB
Go
234 lines
6.3 KiB
Go
package main
|
||
|
||
import (
|
||
"fmt"
|
||
"log"
|
||
"net/http"
|
||
"time"
|
||
|
||
"git.toowon.com/jimmy/go-common/excel"
|
||
"git.toowon.com/jimmy/go-common/factory"
|
||
"git.toowon.com/jimmy/go-common/tools"
|
||
)
|
||
|
||
// User 用户结构体示例
|
||
type User struct {
|
||
ID int `json:"id"`
|
||
Name string `json:"name"`
|
||
Email string `json:"email"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
Status int `json:"status"`
|
||
}
|
||
|
||
func main() {
|
||
// 创建工厂(可选,Excel导出不需要配置)
|
||
fac, err := factory.NewFactoryFromFile("./config/example.json")
|
||
if err != nil {
|
||
// Excel导出不需要配置,可以传nil
|
||
fac = factory.NewFactory(nil)
|
||
}
|
||
|
||
// 示例1:导出结构体切片到文件
|
||
fmt.Println("=== Example 1: Export Struct Slice to File ===")
|
||
example1(fac)
|
||
|
||
// 示例2:导出到HTTP响应
|
||
fmt.Println("\n=== Example 2: Export to HTTP Response ===")
|
||
example2(fac)
|
||
|
||
// 示例3:使用格式化函数
|
||
fmt.Println("\n=== Example 3: Export with Format Functions ===")
|
||
example3(fac)
|
||
|
||
// 示例4:使用ExportData接口
|
||
fmt.Println("\n=== Example 4: Export with ExportData Interface ===")
|
||
example4(fac)
|
||
}
|
||
|
||
// 示例1:导出结构体切片到文件
|
||
func example1(fac *factory.Factory) {
|
||
users := []User{
|
||
{ID: 1, Name: "Alice", Email: "alice@example.com", CreatedAt: time.Now(), Status: 1},
|
||
{ID: 2, Name: "Bob", Email: "bob@example.com", CreatedAt: time.Now().Add(-24 * time.Hour), Status: 1},
|
||
{ID: 3, Name: "Charlie", Email: "charlie@example.com", CreatedAt: time.Now().Add(-48 * time.Hour), Status: 0},
|
||
}
|
||
|
||
columns := []factory.ExportColumn{
|
||
{Header: "ID", Field: "ID", Width: 10},
|
||
{Header: "姓名", Field: "Name", Width: 20},
|
||
{Header: "邮箱", Field: "Email", Width: 30},
|
||
{Header: "创建时间", Field: "CreatedAt", Width: 20},
|
||
{Header: "状态", Field: "Status", Width: 10},
|
||
}
|
||
|
||
err := fac.ExportToExcelFile("users.xlsx", "用户列表", columns, users)
|
||
if err != nil {
|
||
log.Printf("Failed to export to file: %v", err)
|
||
} else {
|
||
fmt.Println("Excel file exported successfully: users.xlsx")
|
||
}
|
||
}
|
||
|
||
// 示例2:导出到HTTP响应
|
||
func example2(fac *factory.Factory) {
|
||
// 模拟HTTP响应
|
||
w := &mockResponseWriter{}
|
||
|
||
users := []User{
|
||
{ID: 1, Name: "Alice", Email: "alice@example.com", CreatedAt: time.Now(), Status: 1},
|
||
{ID: 2, Name: "Bob", Email: "bob@example.com", CreatedAt: time.Now(), Status: 1},
|
||
}
|
||
|
||
columns := []factory.ExportColumn{
|
||
{Header: "ID", Field: "ID"},
|
||
{Header: "姓名", Field: "Name"},
|
||
{Header: "邮箱", Field: "Email"},
|
||
}
|
||
|
||
// 设置HTTP响应头
|
||
w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
|
||
w.Header().Set("Content-Disposition", "attachment; filename=users.xlsx")
|
||
|
||
err := fac.ExportToExcel(w, "用户列表", columns, users)
|
||
if err != nil {
|
||
log.Printf("Failed to export to HTTP response: %v", err)
|
||
} else {
|
||
fmt.Printf("Excel exported to HTTP response successfully, size: %d bytes\n", len(w.data))
|
||
}
|
||
}
|
||
|
||
// 示例3:使用格式化函数
|
||
func example3(fac *factory.Factory) {
|
||
users := []User{
|
||
{ID: 1, Name: "Alice", Email: "alice@example.com", CreatedAt: time.Now(), Status: 1},
|
||
{ID: 2, Name: "Bob", Email: "bob@example.com", CreatedAt: time.Now().Add(-24 * time.Hour), Status: 0},
|
||
}
|
||
|
||
columns := []factory.ExportColumn{
|
||
{Header: "ID", Field: "ID", Width: 10},
|
||
{Header: "姓名", Field: "Name", Width: 20},
|
||
{Header: "邮箱", Field: "Email", Width: 30},
|
||
{
|
||
Header: "创建时间",
|
||
Field: "CreatedAt",
|
||
Width: 20,
|
||
Format: excel.AdaptTimeFormatter(tools.FormatDateTime), // 使用适配器直接调用tools函数
|
||
},
|
||
{
|
||
Header: "状态",
|
||
Field: "Status",
|
||
Width: 10,
|
||
Format: func(value interface{}) string {
|
||
// 自定义格式化函数
|
||
if status, ok := value.(int); ok {
|
||
if status == 1 {
|
||
return "启用"
|
||
}
|
||
return "禁用"
|
||
}
|
||
return ""
|
||
},
|
||
},
|
||
}
|
||
|
||
err := fac.ExportToExcelFile("users_formatted.xlsx", "用户列表", columns, users)
|
||
if err != nil {
|
||
log.Printf("Failed to export with format: %v", err)
|
||
} else {
|
||
fmt.Println("Excel file exported with format successfully: users_formatted.xlsx")
|
||
}
|
||
}
|
||
|
||
// 示例4:使用ExportData接口
|
||
func example4(fac *factory.Factory) {
|
||
// 创建实现了ExportData接口的数据对象
|
||
exportData := &UserExportData{
|
||
users: []User{
|
||
{ID: 1, Name: "Alice", Email: "alice@example.com", CreatedAt: time.Now(), Status: 1},
|
||
{ID: 2, Name: "Bob", Email: "bob@example.com", CreatedAt: time.Now(), Status: 1},
|
||
},
|
||
}
|
||
|
||
// 使用接口方法获取列定义和数据
|
||
columns := exportData.GetExportColumns()
|
||
|
||
err := fac.ExportToExcelFile("users_interface.xlsx", "用户列表", columns, exportData)
|
||
if err != nil {
|
||
log.Printf("Failed to export with interface: %v", err)
|
||
} else {
|
||
fmt.Println("Excel file exported with interface successfully: users_interface.xlsx")
|
||
}
|
||
}
|
||
|
||
// UserExportData 实现了ExportData接口的用户导出数据
|
||
type UserExportData struct {
|
||
users []User
|
||
}
|
||
|
||
// GetExportColumns 获取导出列定义
|
||
func (d *UserExportData) GetExportColumns() []excel.ExportColumn {
|
||
return []excel.ExportColumn{
|
||
{Header: "ID", Field: "ID", Width: 10},
|
||
{Header: "姓名", Field: "Name", Width: 20},
|
||
{Header: "邮箱", Field: "Email", Width: 30},
|
||
{
|
||
Header: "创建时间",
|
||
Field: "CreatedAt",
|
||
Width: 20,
|
||
Format: excel.AdaptTimeFormatter(tools.FormatDateTime),
|
||
},
|
||
{
|
||
Header: "状态",
|
||
Field: "Status",
|
||
Width: 10,
|
||
Format: func(value interface{}) string {
|
||
if status, ok := value.(int); ok {
|
||
if status == 1 {
|
||
return "启用"
|
||
}
|
||
return "禁用"
|
||
}
|
||
return ""
|
||
},
|
||
},
|
||
}
|
||
}
|
||
|
||
// GetExportRows 获取导出数据行
|
||
func (d *UserExportData) GetExportRows() [][]interface{} {
|
||
rows := make([][]interface{}, 0, len(d.users))
|
||
for _, user := range d.users {
|
||
row := []interface{}{
|
||
user.ID,
|
||
user.Name,
|
||
user.Email,
|
||
user.CreatedAt,
|
||
user.Status,
|
||
}
|
||
rows = append(rows, row)
|
||
}
|
||
return rows
|
||
}
|
||
|
||
// mockResponseWriter 模拟HTTP响应写入器(用于示例)
|
||
type mockResponseWriter struct {
|
||
header http.Header
|
||
data []byte
|
||
}
|
||
|
||
func (w *mockResponseWriter) Header() http.Header {
|
||
if w.header == nil {
|
||
w.header = make(http.Header)
|
||
}
|
||
return w.header
|
||
}
|
||
|
||
func (w *mockResponseWriter) Write(data []byte) (int, error) {
|
||
w.data = append(w.data, data...)
|
||
return len(data), nil
|
||
}
|
||
|
||
func (w *mockResponseWriter) WriteHeader(statusCode int) {
|
||
// 模拟实现
|
||
}
|