前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >golang实践之Excel操作

golang实践之Excel操作

作者头像
大话swift
发布2019-07-30 18:59:04
4.1K0
发布2019-07-30 18:59:04
举报
文章被收录于专栏:大话swift大话swift

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

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大话swift 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档