编程技术文章分享与教程

网站首页 > 技术文章 正文

国产开源,GoLang也可以高效处理Excel的利器了

hmc789 2024-11-15 19:35:20 技术文章 2 ℃

在一些情况下我们需要通过程序操作 Excel 文档,例如:打开读取已有 Excel 文档内容、创建新的 Excel 文档、基于已有文档(模版)生成新的 Excel 文档、向 Excel 文档中插入图片、图表和表格等元素,有时还需要跨平台实现这些操作。

Excelize 是 Go 语言编写的用于操作 Office Excel 文档基础库。可以用来读写电子表格文档。

支持 XLAM / XLSM / XLSX / XLTM / XLTX 等多种文档格式,兼容带有样式、图片(表)、透视表、切片器等复杂组件的文档,并提供流式读写 API,用于处理包含大规模数据的工作簿。

使用本类库要求使用的 Go 语言为 1.15 或更高版本。

安装

go get github.com/xuri/excelize/v2

创建 Excel 文档

package main

import (
   "github.com/xuri/excelize/v2"
   "log"
)

func main() {
   //NewFile提供了一个按默认模板创建新文件的函数。
   f := excelize.NewFile()
   sheetName := "成绩表"
   //NewSheet提供通过给定工作表名称创建新工作表的功能,并在附加工作表后返回工作簿中工作表的索引。
   //创建新工作簿时,将创建名为“Sheet1”的默认工作表。
   index := f.NewSheet(sheetName)
   //SetActiveSheet提供了一个函数,用于按给定索引设置工作簿的默认活动工作表。
   f.SetActiveSheet(index)
   //SetCellValue提供一个函数来设置单元格的值。指定的坐标不应在表格的第一行,可以用字符串文本设置复数。
   f.SetCellValue(sheetName, "A1", "倚天屠龙记攻击力排行榜")
   //SetSheetRow通过给定的工作表名称、起始坐标和指向数组类型“slice”的指针将数组写入行。
   f.SetSheetRow(sheetName, "A2", &[]interface{}{"序号", "编码", "姓名", "派别", "物理攻击", "魔法攻击", "总攻击力", "平均攻击力"})
   f.SetSheetRow(sheetName, "A3", &[]interface{}{1, 10001, "张无忌", "明教", 68, 96, nil, nil})
   f.SetSheetRow(sheetName, "A4", &[]interface{}{2, 10002, "张三丰", "武当派", 28, 86, nil, nil})
   f.SetSheetRow(sheetName, "A5", &[]interface{}{3, 10003, "周芷若", "峨眉派", 38, 76, nil, nil})
   f.SetSheetRow(sheetName, "A6", &[]interface{}{4, 10004, "杨逍", "明教", 48, 66, nil, nil})
   f.SetSheetRow(sheetName, "A7", &[]interface{}{5, 10005, "赵敏", "元朝", 58, 56, nil, nil})
   _type, _ref := "shared", "G4:G8"
   //SetCellFormula提供了一个函数,用于根据给定的工作表名称和单元格公式设置设置单元格上的公式。
   f.SetCellFormula(sheetName, "G3", "=SUM(E3:F3)", excelize.FormulaOpts{
      Type: &_type,
      Ref:  &_ref,
   })
   _type, _ref = "shared", "H4:H8"
   f.SetCellFormula(sheetName, "H3", "=AVERAGE(E3:F3)", excelize.FormulaOpts{
      Type: &_type,
      Ref:  &_ref,
   })
   //MergeCell提供了一个按给定坐标区域和图纸名称合并单元格的函数。
   f.MergeCell(sheetName, "A1", "H1")
   //NewStyle提供了一个函数,用于通过给定的JSON或结构指针为单元格创建样式。
   //颜色字段使用RGB颜色代码。
   style, _ := f.NewStyle(&excelize.Style{
      //设置边框样式
      Border: []excelize.Border{
         {Type: "left", Color: "#000000", Style: 1},
         {Type: "right", Color: "#000000", Style: 1},
         {Type: "top", Color: "#000000", Style: 1},
         {Type: "bottom", Color: "#000000", Style: 1},
      },
      //设置字体大小样式
      Font: &excelize.Font{
         Size: 11,
      },
      //设置垂直居中和水平居中
      Alignment: &excelize.Alignment{
         Horizontal: "center",
         Vertical:   "center",
      },
   })
   //SetCellStyle提供了一个函数,用于根据给定的工作表名称、坐标区域和样式ID为单元格添加样式属性。
   //在同一坐标区域中,对角线向下和对角线向上类型的边框应使用相同的颜色。
   //SetCellStyle将覆盖单元格的现有样式,不会附加或合并样式
   if err := f.SetCellStyle(sheetName, "A1", "H7", style); err != nil {
      log.Panicln(err)
   }
   //设置标题字体大小
   style, _ = f.NewStyle(&excelize.Style{
      //设置字体大小样式
      Font: &excelize.Font{
         Bold:   true,
         Italic: false,
         Size:   15,
      },
      //设置垂直居中和水平居中
      Alignment: &excelize.Alignment{
         Horizontal: "center",
         Vertical:   "center",
      },
   })
   //SetCellStyle提供了一个函数,用于根据给定的工作表名称、坐标区域和样式ID为单元格添加样式属性。
   //在同一坐标区域中,对角线向下和对角线向上类型的边框应使用相同的颜色。
   //SetCellStyle将覆盖单元格的现有样式,不会附加或合并样式
   if err := f.SetCellStyle(sheetName, "A1", "A1", style); err != nil {
      log.Panicln(err)
   }
   //SetRowHeight提供一个函数来设置单行的高度。
   for i := 1; i < 10; i++ {
      if err := f.SetRowHeight(sheetName, i, 25); err != nil {
         log.Panicln(err)
      }
   }

   //SaveAs提供了一个函数,用于在提供的路径创建或更新电子表格。
   if err := f.SaveAs("demo701.xlsx"); err != nil {
      log.Panicln(err)
   }
}
标签列表
最新留言