github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/cmd/test/others/func/export/export-poetry_ancient.go (about)

     1  package main
     2  
     3  import (
     4  	"fmt"
     5  	"path/filepath"
     6  	"reflect"
     7  
     8  	"github.com/360EntSecGroup-Skylar/excelize/v2"
     9  	"github.com/easysoft/zendata/cmd/test/others/func/comm"
    10  	"github.com/easysoft/zendata/cmd/test/others/func/model"
    11  	fileUtils "github.com/easysoft/zendata/pkg/utils/file"
    12  )
    13  
    14  func main() {
    15  	filePath := "data/poetry_ancient/v1.xlsx"
    16  	sheetName := "poetry_ancient"
    17  
    18  	fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
    19  
    20  	db := comm.GetDB()
    21  	db.AutoMigrate(
    22  		&model.PoetryAncient{},
    23  	)
    24  
    25  	pos := make([]model.PoetryAncient, 0)
    26  	db.Where("NOT deleted").Find(&pos)
    27  
    28  	f := excelize.NewFile()
    29  	index := f.NewSheet(sheetName)
    30  	f.SetActiveSheet(index)
    31  
    32  	sheet1 := f.GetSheetName(0)
    33  	f.DeleteSheet(sheet1)
    34  
    35  	var infos []model.TableInfo
    36  	db.Raw("desc " + model.PoetryAncient{}.TableName()).Scan(&infos)
    37  
    38  	excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
    39  	fieldNames := comm.GetStructFields(model.PoetryAncient{})
    40  
    41  	// gen headers
    42  	for index, name := range excelColNameHeader {
    43  		excelColName := excelColNameArr[index]
    44  		excelColId := fmt.Sprintf("%s%d", excelColName, 1)
    45  
    46  		f.SetCellValue(sheetName, excelColId, name)
    47  	}
    48  
    49  	// gen rows
    50  	for rowIndex, po := range pos {
    51  		for fieldIndex, fieldName := range fieldNames {
    52  			val := ""
    53  
    54  			kind := reflect.ValueOf(po).FieldByName(fieldName).Kind()
    55  
    56  			if fieldName == "Id" {
    57  				val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
    58  			} else if kind == reflect.Int {
    59  				val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Int())
    60  			} else if kind == reflect.Uint {
    61  				val = fmt.Sprintf("%d", reflect.ValueOf(po).FieldByName(fieldName).Uint())
    62  			} else {
    63  				val = fmt.Sprintf("%v", reflect.ValueOf(po).FieldByName(fieldName))
    64  			}
    65  
    66  			excelColName := excelColNameArr[fieldIndex]
    67  			excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
    68  
    69  			f.SetCellValue(sheetName, excelColId, val)
    70  		}
    71  	}
    72  
    73  	f.SaveAs(filePath)
    74  }