【go】Excelize处理excel表 带数据校验的文件导出

1 Excelize介绍

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

2 相关需求与实现

2.1 数据的excel文件导出

  • 需求:入参是一个map,其键是每个sheet页的名字,其值是一个二维切片。在每个sheet页中依次写入切片中的数据。返回文件名和错误信息。
  • 代码:
// 写入数据到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文件导出

  • 需求:入参是一个map,其键是每个sheet页的名字,其值是一个二维切片。在每个sheet页中依次写入切片中的数据。返回文件名和错误信息。
    数据校验: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)
}
  • 输出文件:
    在这里插入图片描述
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,我可以给你提供一些思路。 首先,你需要使用EasyExcel来读取Excel文件。EasyExcel是一个非常方便的Java库,可以帮助你读取和写入Excel文件。你可以在项目中添加以下依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.6</version> </dependency> ``` 然后,你需要编写代码来读取Excel文件并验证数据。你可以使用EasyExcel提供的读取器来读取Excel文件,然后使用自定义的校验器来验证数据。如果数据不符合要求,你可以将它们标记为红色并将它们导出到另一个Excel文件中。 以下是一个示例代码,它读取一个Excel文件并验证其中的数据: ```java public void validateExcel(InputStream inputStream, OutputStream outputStream) throws IOException { // 读取Excel文件 ExcelReader excelReader = EasyExcel.read(inputStream).build(); // 获取第一个Sheet Sheet sheet = excelReader.readSheet(0); // 获取头 List<String> header = sheet.getHeadRow().getHeadList(); // 获取数据行 List<List<Object>> rows = sheet.getHeadRow().getHeadList(); // 创建一个ExcelWriter,用于输出结果 ExcelWriter excelWriter = EasyExcel.write(outputStream).build(); // 创建一个Sheet Sheet resultSheet = new Sheet(0, 0); // 设置头 resultSheet.setHead(header); // 遍历数据行,验证数据 for (int i = 0; i < rows.size(); i++) { List<Object> row = rows.get(i); // 验证数据 if (!validateRow(row)) { // 如果数据不符合要求,将它们标记为红色 row.add(new FillStyleFiller(new FillPatternType(FillPatternType.SOLID_FOREGROUND), IndexedColors.RED.getIndex())); // 将行添加到结果Sheet中 resultSheet.appendRow(row); } } // 输出结果 excelWriter.write(resultSheet); // 关闭ExcelReader和ExcelWriter excelReader.finish(); excelWriter.finish(); } private boolean validateRow(List<Object> row) { // TODO: 编写校验逻辑 return true; } ``` 这个代码片段假设你已经实现了一个`validateRow`方法,它接收一个数据行作为参数,并返回一个布尔值,示该行是否符合要求。如果数据不符合要求,该方法应该返回false。在这个示例中,我们假设你已经实现了这个方法。 在上面的代码中,我们创建了一个ExcelWriter,用于输出结果。我们创建了一个Sheet,并设置了头。然后,我们遍历数据行,验证数据。如果数据不符合要求,我们将它们标记为红色,并将它们添加到结果Sheet中。最后,我们使用ExcelWriter将结果Sheet输出到另一个Excel文件中。 希望这个思路可以帮助到你!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微雨停了

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值