工作中我们经常会用到Excel表格,甚至很多软件都有导出Excel的功能,今天就根据自己的需要使用go来帮忙生成Excel。其实这个需要在几个月以前就有了,只是当时采用的swift在写,连续搞了好几天但是效果不理想。最近网上搜寻到了go操作Excel的library就拿来进行试用一下,效果挺好,在此给大家分享一下,希望对大家有所帮助……
好了先分享一下成果吧
您没看错爬取的是房管局的官网,当然了大家不要恶意去爬取政府网站,咱们只是有需求需要省的每天去政府官网查看。好了下面就是操作Excel的干货啦
无论现在那种语言Excel操作library是必不可少的。咱也不能说操作Excel怎么不好也没必要自己去写一套,当然了对于这一类的library还是可以作为参考研习----一个获取Excel的操作(learn once,use anywhere),二来可以学习参考作者的语言运用技巧
Library介绍与安装
代码语言:javascript复制//安装
go get -u github.com/tealeg/xlsx
//基本类
type File struct {
worksheets map[string]*zip.File
referenceTable *RefTable
Date1904 bool
styles *xlsxStyleSheet
Sheets []*Sheet
Sheet map[string]*Sheet
theme *theme
DefinedNames []*xlsxDefinedName
}
上文通过一个基本的命令即可安装,同时我们看到此处操作Excel的struct将分为内部操作为sheet页和workssheets。而我们今天主要讲解的是基于sheet页的操作(worksheets操作可以去看测试用例)。
1 添加和查找sheets
通过上文的数据结构我们看到对于sheet的查找提供了基于slice和map的方式。也就是说我们可以根据sheet的名称来获取到我们创建的一个sheet页(规定Excel中一个sheet 页的名称必须唯一,否则crash),也可按照底部sheet的排序逐个查找
代码语言:javascript复制//创建一个sheet,sheet切换就不说了,大家可以直接拿着slice和map来操作
func (f *File) AddSheet(sheetName string) (*Sheet, error)
2 添加行和cell
此处我们简单的举例操作,大家可以根据library字型查看
代码语言:javascript复制// Add a new Row to a Sheet
func (s *Sheet) AddRow() *Row {
row := &Row{Sheet: s}
s.Rows = append(s.Rows, row)
if len(s.Rows) > s.MaxRow {
s.MaxRow = len(s.Rows)
}
return row
}
上面的实例是操作的源码,下面根据需要我们自行操作的
代码语言:javascript复制func addLine(sheet *xlsx.Sheet, vale ...string) {
row := sheet.AddRow()
for index, v := range vale {
cell := row.AddCell()
//给row设置背景色
if len(row.Sheet.Rows) > 1 && len(row.Sheet.Rows)%2 == 1 {
style := &xlsx.Style{}
//align := xlsx.Alignment{ ShrinkToFit: true}
//style.Alignment = align
style.Fill = *xlsx.NewFill("solid", "EFEFDE", "EFEFDE")
style.Border = xlsx.Border{RightColor: "FF"}
cell.SetStyle(style)
}
if index > 0 && index < len(vale)-1 {
num, e := strconv.ParseFloat(v, 10)
if e == nil {
cell.SetInt64(int64(num))
} else {
cell.SetString(v)
}
} else if index == len(vale)-1 {
cell.SetValue(v)
} else {
cell.SetString(v)
}
}
}
我们看看Row和cell的数据结构
代码语言:javascript复制type Row struct {
Cells []*Cell
Hidden bool
Sheet *Sheet
Height float64
OutlineLevel uint8
isCustom bool
}
type Cell struct {
Row *Row
Value string
formula string
style *Style
NumFmt string
parsedNumFmt *parsedNumberFormat
date1904 bool
Hidden bool
HMerge int
VMerge int
cellType CellType
DataValidation *xlsxCellDataValidation
}
可以看到row向上接触sheet向下接触Cell,而Cell称为我们可控的最小单元,我们的对齐内部数据类型和style样式都是由Cell决定。我们来通过一个指定背景色的操作来看看
代码语言:javascript复制 style := &xlsx.Style{}
//align := xlsx.Alignment{ ShrinkToFit: true}
//style.Alignment = align
style.Fill = *xlsx.NewFill("solid", "EFEFDE", "EFEFDE")
style.Border = xlsx.Border{RightColor: "FF"}
cell.SetStyle(style)
最基本的操作入门,算是抛砖引玉,有需要的可以自行深入的研究一下。当然了理清楚内部的操作逻辑和Excel的思想才能更好的操作,当初lz使用swift操作的时候看文档踩了很多坑很久才理清楚怎么玩法,当然了这次的踩坑也不少,只是基于原来的理论基础才稍微顺利点?,好了今天到这里,等后续发现什么新的彩蛋再分享给大家……