Skip to main content

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 步

  1. 打开 excel 文件
  2. 读 sheet-处理行-列
  3. 关闭

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) // 如果保存过程中出错,打印错误
}
}

代码流程

  1. 导入必要的包

    • fmt:用于打印错误信息。
    • github.com/xuri/excelize/v2:用于操作 Excel 文件。
  2. 创建新的 Excel 文件

    • 使用 excelize.NewFile() 创建一个新的 Excel 文件对象。
    • 使用 defer 确保在函数结束时关闭文件。
  3. 添加数据到工作表

    • 使用 for 循环遍历数据行。
    • 使用 excelize.CoordinatesToCellName 将坐标转换为单元格名称。
    • 使用 SetSheetRow 方法将数据行写入到 "Sheet1" 工作表中。
  4. 添加图表到工作表

    • 使用 AddChart 方法在 "Sheet1" 工作表中的 "E1" 单元格位置添加一个 3D 聚簇柱形图。
    • 定义图表的类型、数据系列和标题。
  5. 保存文件

    • 使用 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)
}
}

代码解释

  1. 导入必要的包

    • fmt:用于打印错误信息。
    • github.com/xuri/excelize/v2:用于操作 Excel 文件。
  2. 创建新的 Excel 文件

    • 使用 excelize.NewFile() 创建一个新的 Excel 文件对象。
    • 使用 defer 确保在函数结束时关闭文件。
  3. 定义要插入的数据

    • 数据以二维切片的形式存储。
  4. 使用循环自动计算位置并插入数据

    • 外层循环遍历每一行数据。
    • 内层循环遍历每一行中的每一个单元格。
    • 使用 excelize.CoordinatesToCellName 将坐标转换为单元格名称。
    • 使用 SetCellValue 方法将数据插入到相应的单元格中。
  5. 保存文件

    • 使用 SaveAs 方法将 Excel 文件保存为 "Book1.xlsx"。

通过这种方式,你可以批量插入数据而无需每次都手动标记位置,从而简化代码和提高效率。如果你有更多问题或需要进一步的解释,请随时告诉我。