作者 唐旭辉

添加 excel列表数据读取

  1 +package exceltool
  2 +
  3 +import (
  4 + "io"
  5 +
  6 + excelize "github.com/360EntSecGroup-Skylar/excelize/v2"
  7 +)
  8 +
  9 +// ExcelListReader 读取基础excel表格,
  10 +// 指定读取的列表区域的第一行作为表头字段处理,表头字段唯一
  11 +type ExcelListReader struct {
  12 + RowStart int //从第几行开始,零值做为起始
  13 + RowEnd func(index int, rowsData []string) bool //第几行结束,
  14 + ColStart int //第几列开始,零值做为起始
  15 + ColEnd int //第几列结束,
  16 + Sheet string //获取的表格
  17 +}
  18 +
  19 +func NewExcelListReader() *ExcelListReader {
  20 + rowEnd := func(index int, rowsData []string) bool {
  21 + var allEmpty bool = true
  22 + for _, v := range rowsData {
  23 + if allEmpty && len(v) > 0 {
  24 + allEmpty = false
  25 + break
  26 + }
  27 + }
  28 + return allEmpty
  29 + }
  30 + return &ExcelListReader{
  31 + RowEnd: rowEnd,
  32 + }
  33 +}
  34 +
  35 +func (eRead ExcelListReader) OpenReader(r io.Reader) ([]map[string]string, error) {
  36 + xlsxFile, err := excelize.OpenReader(r)
  37 + if err != nil {
  38 + return nil, err
  39 + }
  40 + rows, err := xlsxFile.Rows(eRead.Sheet)
  41 + if err != nil {
  42 + return nil, err
  43 + }
  44 + var (
  45 + datas = make([]map[string]string, 0) //数据列表
  46 + listHead = make(map[int]string) //map[索引数字]列表头字符串
  47 + rowIndex int = 0
  48 + )
  49 + for rows.Next() {
  50 + cols, err := rows.Columns()
  51 + if err != nil {
  52 + return nil, err
  53 + }
  54 + if readEnd := eRead.RowEnd(rowIndex, cols); readEnd {
  55 + break
  56 + }
  57 + if rowIndex < eRead.RowStart {
  58 + rowIndex++
  59 + continue
  60 + }
  61 + listRowData := make(map[string]string)
  62 + for colK, colV := range cols {
  63 + if eRead.ColEnd != 0 && colK > eRead.ColEnd {
  64 + break
  65 + }
  66 + if colK < eRead.ColStart {
  67 + continue
  68 + }
  69 + if rowIndex == eRead.RowStart {
  70 + //指定的数据列表第一行作为列表头处理
  71 + listHead[colK] = colV
  72 + }
  73 + if rowIndex > eRead.RowStart {
  74 + //指定的数据列表第二行开始作为列表数据内容处理
  75 + headK := listHead[colK]
  76 + listRowData[headK] = colV
  77 + }
  78 + }
  79 + if rowIndex > eRead.RowStart {
  80 + //指定的数据列表第二行开始作为列表数据内容处理
  81 + datas = append(datas, listRowData)
  82 + }
  83 + rowIndex++
  84 + }
  85 + return datas, nil
  86 +}