golang实践之Excel操作

2019-07-30 18:59:04 浏览数 (1)

工作中我们经常会用到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操作的时候看文档踩了很多坑很久才理清楚怎么玩法,当然了这次的踩坑也不少,只是基于原来的理论基础才稍微顺利点?,好了今天到这里,等后续发现什么新的彩蛋再分享给大家……

0 人点赞