【go】ExcelizeはExcelストラップデータ検証のファイルエクスポートを処理します

1 Excelize の概要

  • Excelize は、Office Excel ドキュメントを操作するために Go 言語で書かれた基本的なライブラリです。公式ドキュメント: https://xuri.me/excelize/zh-hans/

  • インポート方法

go get "github.com/xuri/excelize/v2"

2 関連する要件と実装

2.1 Excel ファイルへのデータのエクスポート

  • 要件: 入力パラメーターは、キーが各シート ページの名前であり、値が 2 次元スライスであるマップです。スライス内のデータをシートの各ページに順番に書き込みます。ファイル名とエラーメッセージを返します。
  • コード:
// 写入数据到export/*.xlsx
// datas: map[sheet]每个sheet页的数据
// return: 文件名, error

func WriteExcel(datas map[string][][]string) (string, error) {
    
    
	file := excelize.NewFile()

	for sheetName, data := range datas {
    
    
		index, _ := file.NewSheet(sheetName)
		for i, row := range data {
    
    
			for j, val := range row {
    
    
				// 列行数字索引转excel坐标索引
				cellName, _ := excelize.CoordinatesToCellName(j+1, i+1)
				//fmt.Println("cellName:", cellName)
				// 设置,写入
				file.SetCellValue(sheetName, cellName, val)
			}
		}
		// 创建表格
		file.SetActiveSheet(index)
	}
	filename := "aaa" + ".xlsx"

	_, err := os.ReadDir("aaa/")
	if err != nil {
    
    
		// 不存在就创建
		err = os.MkdirAll("aaa/", fs.ModePerm)
		if err != nil {
    
    
			fmt.Println(err)
		}
	}
	// 删除默认工作表
	file.DeleteSheet("Sheet1")
	err = file.SaveAs("aaa/" + filename)
	if err != nil {
    
    
		return "", err
	}
	return filename, nil
}

func main() {
    
    
	datas := make(map[string][][]string)
	datas["xxx"] = [][]string{
    
    {
    
    "A1", "B1", "C1", "d1", "E1", "G1", "H1", "I1"}, {
    
    "A2", "B2", "C2"}, {
    
    "A3", "B3", "C3"}}
	datas["yyy"] = [][]string{
    
    {
    
    "X1", "Y1", "Z1"}, {
    
    "X2", "Y2", "Z2"}, {
    
    "X3", "Y3", "Z3"}}
	fileName, err := WriteExcel(datas)
	if err != nil {
    
    
		fmt.Println("Write excel error: ", err)
		return
	}

	fmt.Println("Write excel success, file name is: ", fileName)
  • 出力ファイル:
    ここに画像の説明を挿入
    ここに画像の説明を挿入

2.2 データ検証付きの Excel ファイルのエクスポート

  • 要件: 入力パラメーターは、キーが各シート ページの名前であり、値が 2 次元スライスであるマップです。スライス内のデータをシートの各ページに順番に書き込みます。ファイル名とエラーメッセージを返します。
    データ検証: A 列には a、aa、aaa、aaaa のみ、B 列には b、bb のみ、C 列には c、cc、ccc のみ入力できます。
  • コード:
func WriteExcelValidation(datas map[string][][]string, validations map[string][]string) (string, error) {
    
    
	file := excelize.NewFile()

	for sheetName, data := range datas {
    
    

		// 创建sheet
		index, _ := file.NewSheet(sheetName)

		// 有效性校验
		for col, validation := range validations {
    
    
			dv := excelize.NewDataValidation(true)
			dv.SetSqref(col + "2:" + col + "1048576")
			err := dv.SetDropList(validation)
			if err != nil {
    
    
				return "", err
			}
			file.AddDataValidation(sheetName, dv)
		}

		for i, row := range data {
    
    
			for j, val := range row {
    
    
				// 列行数字索引转excel坐标索引
				cellName, _ := excelize.CoordinatesToCellName(j+1, i+1)
				// 设置,写入
				file.SetCellValue(sheetName, cellName, val)
			}
		}

		// 创建表格
		file.SetActiveSheet(index)
	}
	filename := "bbb" + ".xlsx"

	// 创建目录
	_, err := os.ReadDir("aaa/")
	if err != nil {
    
    
		// 不存在就创建
		err = os.MkdirAll("aaa/", fs.ModePerm)
		if err != nil {
    
    
			return "", err
		}
	}

	file.DeleteSheet("Sheet1")
	err = file.SaveAs("aaa/" + filename)
	if err != nil {
    
    
		return "", err
	}
	return filename, nil
}

func main() {
    
    
	validations := make(map[string][]string)
	validations["A"] = []string{
    
    "a", "aa", "aaa", "aaaa"}
	validations["B"] = []string{
    
    "b", "bb"}
	validations["E"] = []string{
    
    "c", "cc", "ccc"}

	datas := make(map[string][][]string)
	datas["xxx"] = [][]string{
    
    {
    
    "A1", "B1", "C1", "d1", "E1", "G1", "H1", "I1"}, {
    
    "A2", "B2", "C2"}, {
    
    "A3", "B3", "C3"}}
	datas["yyy"] = [][]string{
    
    {
    
    "X1", "Y1", "Z1"}, {
    
    "X2", "Y2", "Z2"}, {
    
    "X3", "Y3", "Z3"}}
	fileName, err := WriteExcelValidation(datas, validations)
	if err != nil {
    
    
		fmt.Println("Write excel error: ", err)
		return
	}

	fmt.Println("Write excel success, file name is: ", fileName)
}
  • 出力ファイル:
    ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/qq_45859826/article/details/131330139