学会用编程思维解决工作中的问题--Go操作Excel篇
老板让我把工作两个月中搜集到的资料整理一份清单,然后晚上发给他。顿时有点慌,这么多文件,难道一个个地去复制吗?
显然是不存在的!
工作的内容无非是要把该目录下的文件名以及文件的大小复制到Excel表中,那我为何不用编程去做呢?
如果你傻到一个一个去复制,那得花多少时间啊!
作为一个gopher,当然还是得用Go语言去完成这件事,
思路:通过一个for循环,获取目录下所有文件对应的文件名和文件的大小,并写入Excel并保存!
我们要做的第一个事情就是找到一个用Go操作Excel的轮子,当然是去我们的Github了。
比较了两款好用的轮子,最终我选取了star较多的excelize。
然后就是看官方的例子,以便可以快速使用。
package main
import (
"fmt"
"github.com/360EntSecGroup-Skylar/excelize/v2"
)
func main() {
f := excelize.NewFile()
// Create a new sheet.
index := f.NewSheet("Sheet2")
// Set value of a cell.
f.SetCellValue("Sheet2", "A2", "Hello world.")
// Set active sheet of the workbook.
f.SetActiveSheet(index)
// Save spreadsheet by the given path.
if err := f.SaveAs("Book1.xlsx"); err != nil {
fmt.Println(err)
}
}
基本上不用了解底层,看Demo就可以快速上手。
首先创建一个文件,再去创建一个Sheet,然后将内容写入Cell中,参数是哪个Sheet,位置坐标,以及内容,最后保存文件。
思路明确之后,就可以写代码了。
package main
import (
"github.com/360EntSecGroup-Skylar/excelize/v2"
"github.com/spf13/cast"
"io/ioutil"
)
func main() {
xlsx := excelize.NewFile()
index := xlsx.NewSheet("Sheet1")
info, _ := ioutil.ReadDir("F:\\all-file")
var location = 1
for _, f := range info {
_ = xlsx.SetCellValue("Sheet1", "A" + cast.ToString(location), f.Name())
_ = xlsx.SetCellValue("Sheet1", "B" + cast.ToString(location), cast.ToString(f.Size()/100)+"Kb")
_ = xlsx.SetCellValue("Sheet1", "C" + cast.ToString(location), "1")
location += 1
}
xlsx.SetActiveSheet(index)
_ = xlsx.SaveAs("source.xlsx")
}
首先读取存放所有文件的目录all-file,然后设置一个计数器。
使用一个for循环,每读到该目录的一个文件,就将其写入对用的Cell中,并且location的值加1。
文件读取完之后就退出for循环,并保存到文件source.xlsx中。
就算有几千几万个文件,该代码都能在几秒内完成工作。
丝滑啊!
我的数据3000w行,几秒能处理完不?
@qjc 那得几分钟