github.com/easysoft/zendata@v0.0.0-20240513203326-705bd5a7fd67/cmd/test/others/func/export/export-english_given.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/name/en.given.v1.xlsx"
    16  	sheetName := "english_given"
    17  
    18  	fileUtils.MkDirIfNeeded(filepath.Dir(filePath))
    19  
    20  	db := comm.GetDB()
    21  	db.AutoMigrate(
    22  		&model.DataEnglishGiven{},
    23  	)
    24  
    25  	pos := make([]model.DataEnglishGiven, 0)
    26  	db.Order("id ASC").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.DataEnglishGiven{}.TableName()).Scan(&infos)
    37  
    38  	excelColNameArr, excelColNameHeader := comm.GetExcelColsByTableDef(infos)
    39  	fieldNames := comm.GetStructFields(model.DataEnglishGiven{})
    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.Bool {
    59  				val = fmt.Sprintf("%t", reflect.ValueOf(po).FieldByName(fieldName).Bool())
    60  			} else {
    61  				val = reflect.ValueOf(po).FieldByName(fieldName).String()
    62  			}
    63  
    64  			excelColName := excelColNameArr[fieldIndex]
    65  			excelColId := fmt.Sprintf("%s%d", excelColName, rowIndex+2)
    66  
    67  			f.SetCellValue(sheetName, excelColId, val)
    68  		}
    69  	}
    70  
    71  	f.SaveAs(filePath)
    72  }