golang大Excel文件(.xlsx)分割成多个指定大小条数的Excel文件的方法附源码

Fesion · · 784 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

今天一个朋友由于要将本地excel数据导入到saas平台,但是saas平台规定了excel大小条数,并且要求按规定格式命名excel文件。刚好闲来无事,便花了点时间用golang写了个excel文件分割处理程序。

操作步骤

下载excel分割器.zip,解压,将需要分割的文件重命名为input.xlsx后台,放在根目录下,双击运行exe文件,即可在output目录生成分割好的excel文件列表了。

源码下载

github

处理逻辑

核心处理逻辑代码如下:

package main

import (
    "fmt"
    "github.com/360EntSecGroup-Skylar/excelize"
    "os"
    "path"
)

var CellCols = []string{"A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z"}

func ChunkExcel() {
    f, err := excelize.OpenFile(fmt.Sprintf("%s%s", ExecPath, ConfigData.InputFile))
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println("---------- 开始生成 ----------")

    var titles []string
    excelFiles := map[string]*excelize.File{}
    fileName := fmt.Sprintf("output%s%d-%d.xlsx", string(os.PathSeparator), 1, ConfigData.ChunkSize)
    excelFiles[fileName] = excelize.NewFile()
    firstSheet := excelFiles[fileName].NewSheet("Sheet1")
    excelFiles[fileName].SetActiveSheet(firstSheet)
    sheets := f.GetSheetMap()
    for _, sheetName := range sheets {
        rows := f.GetRows(sheetName)
        rowIndex := 2
        numIndex := 0
        for i, row := range rows {
            if i == 0 {
                //标题行
                for j, colCell := range row {
                    titles = append(titles, colCell)
                    //写入表头
                    excelFiles[fileName].SetCellValue("Sheet1", fmt.Sprintf("%s1", CellCols[j]), colCell)
                }
            } else {
                //开始写入文件
                for j, colCell := range row {
                    excelFiles[fileName].SetCellValue("Sheet1", fmt.Sprintf("%s%d", CellCols[j], rowIndex), colCell)
                }
                numIndex++
                if numIndex % ConfigData.ChunkSize == 0 {
                    //保存
                    fmt.Println(fmt.Sprintf("开始生成文件%s", path.Base(fileName)))
                    if err := excelFiles[fileName].SaveAs(fileName); err != nil {
                        fmt.Println(err)
                        return
                    }
                    //生成新文件
                    fileName = fmt.Sprintf("output%s%d-%d.xlsx", string(os.PathSeparator), numIndex+1, numIndex+ConfigData.ChunkSize)
                    excelFiles[fileName] = excelize.NewFile()
                    firstSheet = excelFiles[fileName].NewSheet("Sheet1")
                    excelFiles[fileName].SetActiveSheet(firstSheet)
                    rowIndex = 1
                    for j, colCell := range titles {
                        //写入表头
                        excelFiles[fileName].SetCellValue("Sheet1", fmt.Sprintf("%s1", CellCols[j]), colCell)
                    }
                }

                rowIndex++
            }
        }
        //最后的保存
        fmt.Println(fmt.Sprintf("开始生成文件%s", path.Base(fileName)))
        if err := excelFiles[fileName].SaveAs(fileName); err != nil {
            fmt.Println(err)
            return
        }
        break
    }

    fmt.Println("---------- 生成结束 ----------")
}

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

784 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传