excel读写
创建 excel, 读取 excel
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
// 创建一个新的 Excel 文件
f := excelize.NewFile()
// 创建"Departments"工作表并添加部门信息
index, err := f.NewSheet("Departments")
if err != nil {
fmt.Println(err)
return
}
f.SetCellValue("Departments", "A1", "DepartmentID")
f.SetCellValue("Departments", "B1", "DepartmentName")
f.SetCellValue("Departments", "A2", "1")
f.SetCellValue("Departments", "B2", "HR")
f.SetCellValue("Departments", "A3", "2")
f.SetCellValue("Departments", "B3", "Engineering")
f.SetCellValue("Departments", "A4", "3")
f.SetCellValue("Departments", "B4", "Marketing")
// 创建"EmployeeDept"工作表并添加人员与部门关系信息
_, err = f.NewSheet("EmployeeDept")
if err != nil {
fmt.Println(err)
return
}
f.SetCellValue("EmployeeDept", "A1", "EmployeeID")
f.SetCellValue("EmployeeDept", "B1", "EmployeeName")
f.SetCellValue("EmployeeDept", "C1", "DepartmentID")
f.SetCellValue("EmployeeDept", "A2", "101")
f.SetCellValue("EmployeeDept", "B2", "Alice")
f.SetCellValue("EmployeeDept", "C2", "1")
f.SetCellValue("EmployeeDept", "A3", "102")
f.SetCellValue("EmployeeDept", "B3", "Bob")
f.SetCellValue("EmployeeDept", "C3", "2")
f.SetCellValue("EmployeeDept", "A4", "103")
f.SetCellValue("EmployeeDept", "B4", "Charlie")
f.SetCellValue("EmployeeDept", "C4", "3")
// 设置默认工作表
f.SetActiveSheet(index)
// 保存文件
fileName := "YourFile.xlsx"
if err := f.SaveAs(fileName); err != nil {
fmt.Println(err)
return
}
// 打开刚刚创建的 Excel 文件
f, err = excelize.OpenFile(fileName)
if err != nil {
fmt.Println(err)
return
}
defer func() {
// 关闭电子表格
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 读取“Departments”工作表中的所有行
departments, err := f.GetRows("Departments")
if err != nil {
fmt.Println(err)
return
}
fmt.Println(departments)
fmt.Println("Departments:")
for _, row := range departments {
for _, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
// 读取“EmployeeDept”工作表中的所有行
employeeDept, err := f.GetRows("EmployeeDept")
if err != nil {
fmt.Println(err)
return
}
fmt.Println("EmployeeDept:")
for _, row := range employeeDept {
for _, colCell := range row {
fmt.Print(colCell, "\t")
}
fmt.Println()
}
}
读取 3 步
- 打开 excel 文件
- 读 sheet-处理行-列
- 关闭
excel 增加图表
好的,下面我将逐行注释你的代码,以便你更好地理解每一部分的功能和作用。
package main
import (
"fmt" // 导入 fmt 包,用于打印错误信息
"github.com/xuri/excelize/v2" // 导入 excelize 库,用于操作 Excel 文件
)
func main() {
f := excelize.NewFile() // 创建一个新的 Excel 文件对象
defer func() { // 使用 defer 确保在函数结束时关闭文件
if err := f.Close(); err != nil { // 关闭文件时,如果有错误则打印
fmt.Println(err)
}
}()
// 添加数据到工作表
for idx, row := range [][]interface{}{
{nil, "Apple", "Orange", "Pear"}, // 第一行,标题行,第一列为空
{"Small", 2, 3, 3}, // 第二行,数据行,表示不同大小的水果数量
{"Normal", 5, 2, 4}, // 第三行,数据行
{"Large", 6, 7, 8}, // 第四 行,数据行
} {
// 将行索引和数据行进行遍历
cell, err := excelize.CoordinatesToCellName(1, idx+1) // 将坐标转换为单元格名称
if err != nil { // 如果转换过程中出错,打印错误并返回
fmt.Println(err)
return
}
// 将数据行写入到工作表 "Sheet1" 中,从指定的单元格开始
f.SetSheetRow("Sheet1", cell, &row)
}
// 添加图表到工作表
if err := f.AddChart("Sheet1", "E1", &excelize.Chart{
// 定义图表类型为 3D 聚簇柱形图
Type: excelize.Col3DClustered,
// 定义图表的数据系列
Series: []excelize.ChartSeries{
{
Name: "Sheet1!$A$2", // 系列名称,引用工作表中的单元格 A2
Categories: "Sheet1!$B$1:$D$1", // 类别标签,引用工作表中的单元格范围 B1 到 D1
Values: "Sheet1!$B$2:$D$2", // 数据点,引用工作表中的单元格范围 B2 到 D2
},
{
Name: "Sheet1!$A$3", // 系列名称,引用工作表中的单元格 A3
Categories: "Sheet1!$B$1:$D$1", // 类别标签,引用工作表中的单元格范围 B1 到 D1
Values: "Sheet1!$B$3:$D$3", // 数据点,引用工作表中的单元格范围 B3 到 D3
},
{
Name: "Sheet1!$A$4", // 系列名称,引用工作表中的单元格 A4
Categories: "Sheet1!$B$1:$D$1", // 类别标签,引用工作表中的单元格范围 B1 到 D1
Values: "Sheet1!$B$4:$D$4", // 数据点,引用工作表中的单元格范围 B4 到 D4
}},
// 定义图表的标题
Title: []excelize.RichTextRun{
{
Text: "Fruit 3D Clustered Column Chart", // 图表标题文本
},
},
}); err != nil { // 如果添加图表过程中出错,打印错误并返回
fmt.Println(err)
return
}
// 保存文件到指定路径
if err := f.SaveAs("Book1.xlsx"); err != nil { // 保存 Excel 文件为 "Book1.xlsx"
fmt.Println(err) // 如果保存过程中出错,打印错误
}
}
代码流程
-
导入必要的包:
fmt:用于打印错误信息。github.com/xuri/excelize/v2:用于操作 Excel 文件。
-
创建新的 Excel 文件:
- 使用
excelize.NewFile()创建一个新的 Excel 文件对象。 - 使用
defer确保在函数结束时关闭文件。
- 使用
-
添加数据到工作表:
- 使用
for循环遍历数据行。 - 使用
excelize.CoordinatesToCellName将坐标转换为单元格名称。 - 使用
SetSheetRow方法将数据行写入到 "Sheet1" 工作表中。
- 使用
-
添加图表到工作表:
- 使用
AddChart方法在 "Sheet1" 工作表中的 "E1" 单元格位置添加一个 3D 聚簇柱形图。 - 定义图表的类型、数据系列和标题。
- 使用
-
保存文件:
- 使用
SaveAs方法将 Excel 文件保存为 "Book1.xlsx"。
- 使用
关键点
excelize.ChartSeries用于定义图表中的数据系列,包括系列名称、类别标签和数据点。AddChart方法用于在工作表中添加图表,并定义图表的类型、数据系列和标题。- 使用
defer确保资源(如文件)在不再需要时被正确释放。
希望这些注释和解释能够帮助你更好地理解代码的每一部分。如果你有任何问题或需要进一步的解释,请随时告诉我。
自动计算位置插入数据
明白了,如果你只需要自动计算位置并插入数据,这里是一个更加简化的示例代码,展示了如何使用 excelize 库自动计算位置并批量插入数据:
简化后的示例代码
package main
import (
"fmt"
"github.com/xuri/excelize/v2"
)
func main() {
f := excelize.NewFile() // 创建一个新的 Excel 文件对象
defer func() { // 使用 defer 确保在函数结束时关闭文件
if err := f.Close(); err != nil {
fmt.Println(err)
}
}()
// 定义要插入的数据
data := [][]interface{}{
{nil, "Apple", "Orange", "Pear"}, // 第一行,标题行,第一列为空
{"Small", 2, 3, 3}, // 第二行,数据行,表示不同大小的水果数量
{"Normal", 5, 2, 4}, // 第三行,数据行
{"Large", 6, 7, 8}, // 第四行,数据行
}
// 使用循环自动计算位置并插入数据
for rowIndex, row := range data {//行
for colIndex, cellValue := range row {//列
// 找位置
cell, err := excelize.CoordinatesToCellName(colIndex+1, rowIndex+1)
if err != nil {
fmt.Println(err)
return
}
// 往位置中插入数据
f.SetCellValue("Sheet1", cell, cellValue)
}
}
// 保存文件到指定路径
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
代码解释
-
导入必要的包:
fmt:用于打印错误信息。github.com/xuri/excelize/v2:用于操作 Excel 文件。
-
创建新的 Excel 文件:
- 使用
excelize.NewFile()创建一个新的 Excel 文件对象。 - 使用
defer确保在函数结束时关闭文件。
- 使用
-
定义要插入的数据:
- 数据以二维切片的形式存储。
-
使用循环自动计算位置并插入数据:
- 外层循环遍历每一行数据。
- 内层循环遍历每一行中的每一个单元格。
- 使用
excelize.CoordinatesToCellName将坐标转换为单元格名称。 - 使用
SetCellValue方法将数据插入到相应的单元格中。
-
保存文件:
- 使用
SaveAs方法将 Excel 文件保存为 "Book1.xlsx"。
- 使用
通过这种方式,你可以批量插入数据而无需每次都手动标记位置,从而简化代码和提高效率。如果你有更多问题或需要进一步的解释,请随时告诉我。