news 2026/4/16 12:25:37

go语言合并两个excel的sheet为一个excel

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
go语言合并两个excel的sheet为一个excel

在 Go 语言中合并两个 Excel 文件的 sheet,推荐使用excelize库(功能强大且活跃维护)。以下是完整解决方案,包含多种场景:

一、安装依赖

bash

复制

go get github.com/xuri/excelize/v2

二、场景 1:两个 Sheet 合并到新文件(不同 Sheet)

file1.xlsx的 Sheet1 和file2.xlsx的 Sheet1 合并到merged.xlsx的两个独立 Sheet 中。

go

复制

package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { // 1. 打开源文件 file1, err := excelize.OpenFile("file1.xlsx") if err != nil { panic(err) } defer file1.Close() file2, err := excelize.OpenFile("file2.xlsx") if err != nil { panic(err) } defer file2.Close() // 2. 创建新文件 merged := excelize.NewFile() streamWriter, err := merged.NewStreamWriter("Sheet1") if err != nil { panic(err) } // 3. 复制第一个文件的 Sheet1 copySheet(file1, "Sheet1", merged, "Sheet1") // 4. 添加第二个 Sheet 并复制 merged.NewSheet("Sheet2") copySheet(file2, "Sheet1", merged, "Sheet2") // 5. 删除默认 Sheet merged.DeleteSheet("Sheet1") // 6. 保存 if err := merged.SaveAs("merged.xlsx"); err != nil { panic(err) } fmt.Println("合并成功!") } // copySheet 复制整个 Sheet 的内容 func copySheet(src *excelize.File, srcSheet string, dst *excelize.File, dstSheet string) { // 获取源 Sheet 所有单元格 rows, err := src.GetRows(srcSheet) if err != nil { panic(err) } // 遍历并复制数据 for rowIdx, row := range rows { for colIdx, cellValue := range row { // 转换列索引为字母 (0 -> A, 1 -> B) colName, _ := excelize.ColumnNumberToName(colIdx + 1) cellAxis := fmt.Sprintf("%s%d", colName, rowIdx+1) // 设置单元格值 dst.SetCellValue(dstSheet, cellAxis, cellValue) } } // 复制列宽 cols, err := src.GetCols(srcSheet) if err != nil { return } for colIdx := range cols { colName, _ := excelize.ColumnNumberToName(colIdx + 1) width, _ := src.GetColWidth(srcSheet, colName) dst.SetColWidth(dstSheet, colName, colName, width) } }

三、场景 2:两个 Sheet 合并为单个 Sheet(追加数据)

file2.xlsx的数据追加到file1.xlsx的 Sheet 末尾(垂直方向)。

go

复制

package main import ( "fmt" "github.com/xuri/excelize/v2" ) func main() { // 1. 打开主文件(作为基础) mainFile, err := excelize.OpenFile("file1.xlsx") if err != nil { panic(err) } defer mainFile.Close() // 2. 打开要合并的文件 mergeFile, err := excelize.OpenFile("file2.xlsx") if err != nil { panic(err) } defer mergeFile.Close() // 3. 获取主文件Sheet1的最后一行 rows, _ := mainFile.GetRows("Sheet1") lastRow := len(rows) + 1 // 追加的起始行 // 4. 获取合并文件的行(可选择跳过表头) mergeRows, _ := mergeFile.GetRows("Sheet1") // 假设第一行是表头,从第二行开始复制 startRow := 2 if len(mergeRows) <= 1 { startRow = 0 // 如果没有表头,全部复制 } // 5. 追加数据 for rowIdx := startRow; rowIdx < len(mergeRows); rowIdx++ { row := mergeRows[rowIdx] for colIdx, cellValue := range row { colName, _ := excelize.ColumnNumberToName(colIdx + 1) cellAxis := fmt.Sprintf("%s%d", colName, lastRow) mainFile.SetCellValue("Sheet1", cellAxis, cellValue) } lastRow++ } // 6. 保存 if err := mainFile.SaveAs("merged_single_sheet.xlsx"); err != nil { panic(err) } fmt.Println("合并成功!数据已追加到单个Sheet") }

四、场景 3:高级版(保留样式、公式、图片)

go

复制

package main import ( "fmt" "github.com/xuri/excelize/v2" ) func mergeWithStyle() { file1, _ := excelize.OpenFile("file1.xlsx") file2, _ := excelize.OpenFile("file2.xlsx") merged := excelize.NewFile() // 复制 Sheet1 并保留样式 copySheetWithStyle(file1, "Sheet1", merged, "File1_Data") // 复制 Sheet2 并保留样式 copySheetWithStyle(file2, "Sheet1", merged, "File2_Data") merged.SaveAs("merged_with_style.xlsx") } // copySheetWithStyle 高级复制(保留样式) func copySheetWithStyle(src *excelize.File, srcSheet string, dst *excelize.File, dstSheet string) { index, _ := dst.NewSheet(dstSheet) // 获取源 Sheet 所有单元格 rows, _ := src.GetRows(srcSheet, excelize.Options{ RawCellValue: true, }) for rIdx, row := range rows { for cIdx, cellValue := range row { colName, _ := excelize.ColumnNumberToName(cIdx + 1) cellAxis := fmt.Sprintf("%s%d", colName, rIdx+1) // 复制值 dst.SetCellValue(dstSheet, cellAxis, cellValue) // 复制样式 styleID, _ := src.GetCellStyle(srcSheet, cellAxis) dst.SetCellStyle(dstSheet, cellAxis, cellAxis, styleID) } } // 激活 Sheet dst.SetActiveSheet(index) }

五、关键注意事项

1.大数据量处理

对于超过 10 万行的数据,使用流式写入避免内存溢出:

go

复制

func streamMerge() { file1, _ := excelize.OpenFile("file1.xlsx") merged := excelize.NewFile() sw, _ := merged.NewStreamWriter("Sheet1") rows, _ := file1.GetRows("Sheet1") for rIdx, row := range rows { cell, _ := excelize.CoordinatesToCellName(1, rIdx+1) sw.SetRow(cell, []interface{}{row}) } sw.Flush() merged.SaveAs("stream_merged.xlsx") }

2.处理不同 Sheet 名称

通过索引获取 Sheet 名:

go

复制

sheetName := file1.GetSheetName(0) // 获取第一个 Sheet

3.错误处理

生产环境建议完整的错误处理:

go

复制

if err != nil { // 记录日志、回滚操作 log.Printf("Error: %v", err) return }

4.内存优化

  • 使用streamWriter处理大文件

  • 及时调用file.Close()释放资源


六、完整项目示例

复制

project/ ├── main.go ├── file1.xlsx # 源文件1 ├── file2.xlsx # 源文件2 └── go.mod

运行

bash

复制

go mod init excel-merge go get github.com/xuri/excelize/v2 go run main.go

选择适合你场景的方案即可。对于简单数据合并,推荐场景 2;对于需要保留格式的情况,使用场景 3copySheetWithStyle函数。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 14:21:20

DownKyi快速上手:3步完成B站视频高质量下载

DownKyi快速上手&#xff1a;3步完成B站视频高质量下载 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&#xff09;。 …

作者头像 李华
网站建设 2026/4/15 4:27:39

Windows平台PDF处理终极指南:Poppler零配置快速上手

Windows平台PDF处理终极指南&#xff1a;Poppler零配置快速上手 【免费下载链接】poppler-windows Download Poppler binaries packaged for Windows with dependencies 项目地址: https://gitcode.com/gh_mirrors/po/poppler-windows 在Windows平台上高效处理PDF文档一…

作者头像 李华
网站建设 2026/4/16 23:57:14

轻松高效视频下载:IwaraDownloadTool 5分钟快速上手指南

轻松高效视频下载&#xff1a;IwaraDownloadTool 5分钟快速上手指南 【免费下载链接】IwaraDownloadTool Iwara 下载工具 | Iwara Downloader 项目地址: https://gitcode.com/gh_mirrors/iw/IwaraDownloadTool 还在为Iwara视频下载效率低下而烦恼吗&#xff1f;每次都需…

作者头像 李华
网站建设 2026/4/15 13:32:21

Switch手柄电脑连接终极指南:5分钟快速上手

Switch手柄电脑连接终极指南&#xff1a;5分钟快速上手 【免费下载链接】BetterJoy Allows the Nintendo Switch Pro Controller, Joycons and SNES controller to be used with CEMU, Citra, Dolphin, Yuzu and as generic XInput 项目地址: https://gitcode.com/gh_mirrors…

作者头像 李华
网站建设 2026/4/17 3:01:37

GitHub汉化插件零基础安装指南:让GitHub秒变中文界面

GitHub汉化插件零基础安装指南&#xff1a;让GitHub秒变中文界面 【免费下载链接】github-chinese GitHub 汉化插件&#xff0c;GitHub 中文化界面。 (GitHub Translation To Chinese) 项目地址: https://gitcode.com/gh_mirrors/gi/github-chinese 还在面对GitHub满屏英…

作者头像 李华
网站建设 2026/4/16 16:04:24

SillyTavern桌面版:三步实现零配置AI聊天体验

SillyTavern桌面版&#xff1a;三步实现零配置AI聊天体验 【免费下载链接】SillyTavern LLM Frontend for Power Users. 项目地址: https://gitcode.com/GitHub_Trending/si/SillyTavern 还在为复杂的命令行操作而烦恼吗&#xff1f;SillyTavern桌面版为你带来革命性的A…

作者头像 李华