sexcel

package
v0.0.0-...-33c5ed1 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2023 License: GPL-3.0 Imports: 8 Imported by: 0

README

封装了excel相关操作的一些方法

支持操作:

  • 导出
  • 支持多种数据源: go 对象、csv、txt、json等
  • 支持多中导出方式: 写入文件、写入 writer、快捷写入 httpWriter
  • 支持标题行的横向和纵向单元格合并(相同内容的合并) [仅合并非空文本 数字不合并]
  • 支持数据行的纵向单元格合并(相同内容的合并) [仅合并非空文本 数字不合并]
  • 解析
  • 支持直接从 httpRequest中读取文件
  • 支持读取合并了单元格的数据(仅支持识别 标题行:横向合并 数据行:纵向合并 且需要指定标题行的宽度,非标题行视为数据行)

依赖: github.com/xuri/excelize/v2

使用

//先创建一个数据对象  这里支持多种方式,以map为例
data := NewExcelDataDirectOneTitle(title, rows)
//或按照常见的 map arr 创建(这里需要确定title对应关系和title的顺序)
err := NewExcelParser("测试数据表").ToExcel(data).WriteToFile("./test.xlsx")

样式设置

//可以使用对象格式  或者直接使用对应的json结构字符串
_ = &excelize.Style{
    Border: []excelize.Border{ //边框-数组-上右下左
        {
            Type:  "", //边框类型
            Color: "", //颜色
            Style: 0,  //样式id
        },
    },
    Fill: excelize.Fill{ //单元格填充
        Type:    "",         //填充类型
        Pattern: 0,          //
        Color:   []string{}, //颜色
        Shading: 0,
    },
    Font: &excelize.Font{ //字体
        Bold:      false,
        Italic:    false,
        Underline: "",
        Family:    "",
        Size:      0,
        Strike:    false,
        Color:     "",
    },
    Alignment: &excelize.Alignment{ //对齐方式
        Horizontal:      "",
        Indent:          0,
        JustifyLastLine: false,
        ReadingOrder:    0,
        RelativeIndent:  0,
        ShrinkToFit:     false,
        TextRotation:    0,
        Vertical:        "",
        WrapText:        false,
    },
    Protection:    nil,
    NumFmt:        0, //数字格式
    DecimalPlaces: 0, //小数位
    CustomNumFmt:  nil,
    Lang:          "",
    NegRed:        false,
}

例: {"font":{"bold":true},"alignment":{"horizontal":"center"}}

Documentation

Index

Constants

View Source
const (
	DefaultSheetName = "Sheet1"

	DefaultStyleTitle = `{"font":{"bold":true},"alignment":{"horizontal":"center","vertical":"center"}}`
	DefaultStyleCell  = `{"alignment":{"vertical":"center"}}`
)

Variables

This section is empty.

Functions

func GetAxis

func GetAxis(colIndex, rowIndex int) string

根据列号和行号返回excel单元格标识 rowIndex会+1返回

func GetColAxis

func GetColAxis(colIndex int) string

A=0; Z=25; AA=26 = 26*1+0;

func InRangeWide

func InRangeWide(rangeStart, rangeEnd, target int) bool

范围判断 这里-1表示不限

Types

type CellMergeRule

type CellMergeRule func(a, b interface{}) bool

合并规则

var DefaultMergeRule CellMergeRule = func(a, b interface{}) bool {
	var as string
	if a == nil {
		as = ""
	} else {
		as = fmt.Sprintf("%v", a)
	}
	var bs string
	if b == nil {
		bs = ""
	} else {
		bs = fmt.Sprintf("%v", b)
	}
	return as == bs
}

默认 nil和 "" 相等

type CellMergeSetting

type CellMergeSetting struct {
	Typ        MergeType     //合并类型
	RangeAll   bool          //不限范围
	RangeIndex []int         //范围  -1为不限 行合并时,这里是行下标  列合并时,这里是列下标  行和列都有时(先行后列): all = [-1,-1,-1,-1]
	Rule       CellMergeRule //合并规则 默认是 DefaultMergeRule
}

单元格合并的设置

func (*CellMergeSetting) MergeCells

func (m *CellMergeSetting) MergeCells(file *excelize.File, sheetName string) error

进行合并

type ExcelDataCsv

type ExcelDataCsv struct {
	Titles [][]interface{}
	Rows   [][]interface{}
	// contains filtered or unexported fields
}

map格式的数据 标题和数据都是map格式的数组,数据按照 key值映射 使用时需使用 New系列方法创建,直接使用结构体的话可能会造成数据错误的问题

func NewExcelDataCsv

func NewExcelDataCsv(csvPath string, titleLength int) (*ExcelDataCsv, error)

func NewExcelDataCsvData

func NewExcelDataCsvData(csvData string, titleLength int) (*ExcelDataCsv, error)

func (*ExcelDataCsv) GetData

func (o *ExcelDataCsv) GetData() [][]interface{}

func (*ExcelDataCsv) GetTitles

func (o *ExcelDataCsv) GetTitles() [][]interface{}

func (*ExcelDataCsv) GetWidth

func (o *ExcelDataCsv) GetWidth() int

type ExcelDataDirect

type ExcelDataDirect struct {
	Titles [][]interface{}
	Rows   [][]interface{}
	// contains filtered or unexported fields
}

map格式的数据 标题和数据都是map格式的数组,数据按照 key值映射 使用时需使用 New系列方法创建,直接使用结构体的话可能会造成数据错误的问题

func NewExcelDataDirect

func NewExcelDataDirect(titles [][]interface{}, rows [][]interface{}) *ExcelDataDirect

func NewExcelDataDirectOneTitle

func NewExcelDataDirectOneTitle(title []interface{}, rows [][]interface{}) *ExcelDataDirect

func (*ExcelDataDirect) GetData

func (o *ExcelDataDirect) GetData() [][]interface{}

func (*ExcelDataDirect) GetTitles

func (o *ExcelDataDirect) GetTitles() [][]interface{}

func (*ExcelDataDirect) GetWidth

func (o *ExcelDataDirect) GetWidth() int

type ExcelDataMap

type ExcelDataMap struct {
	// contains filtered or unexported fields
}

map格式的数据 标题和数据都是map格式的数组,数据按照 key值映射 使用时需使用 New系列方法创建,直接使用结构体的话可能会造成数据错误的问题 使用map格式 就以title为主了 map格式数据不支持没有标题的数据

func NewExcelDataMap

func NewExcelDataMap(titles, rows []map[string]interface{}, titleIndex []map[string]int) (*ExcelDataMap, error)

按照最原始的数据新建

func NewExcelDataMapByTitles

func NewExcelDataMapByTitles(titles ExcelDataTitleObjectArr, rows []map[string]interface{}) *ExcelDataMap

使用object方式创建 适用于确定标题,对象数据的情况

func NewExcelDataMapExtraOrder

func NewExcelDataMapExtraOrder(titles, rows []map[string]interface{}, orderTitles [][]string) (*ExcelDataMap, error)

titles rows 为数据 均是 key:value orderTitles 为固定的title key值

func NewExcelDataMapFixedTitles

func NewExcelDataMapFixedTitles(orderTitles [][]interface{}, rows []map[string]interface{}) (*ExcelDataMap, error)

rows 为数据 orderTitles 为指定的标题,rows是按照最后一行的 标题为key值

func NewExcelDataMapNoOrder

func NewExcelDataMapNoOrder(titles, rows []map[string]interface{}) (*ExcelDataMap, error)

按照最原始的数据新建

func NewExcelDataMapOneTitle

func NewExcelDataMapOneTitle(title map[string]interface{}, rows []map[string]interface{}, titleIndex map[string]int) (*ExcelDataMap, error)

rows 为数据 orderTitles 为指定的标题,rows是按照最后一行的 标题为key值

func (*ExcelDataMap) GetData

func (o *ExcelDataMap) GetData() [][]interface{}

func (*ExcelDataMap) GetTitles

func (o *ExcelDataMap) GetTitles() [][]interface{}

func (*ExcelDataMap) GetWidth

func (o *ExcelDataMap) GetWidth() int

type ExcelDataTitleObject

type ExcelDataTitleObject struct {
	Key   string `json:"key"`
	Title string `json:"title"`
}

type ExcelDataTitleObjectArr

type ExcelDataTitleObjectArr []ExcelDataTitleObject

func (ExcelDataTitleObjectArr) ToMapTitle

func (arr ExcelDataTitleObjectArr) ToMapTitle() (map[string]interface{}, map[string]int)

type ExcelParser

type ExcelParser struct {
	// contains filtered or unexported fields
}

解释器(单sheet的)

func NewExcelParser

func NewExcelParser(sheetName string) *ExcelParser

创建一个sheet的默认 解析器

func (*ExcelParser) ToExcel

转换文件内容

type ExcelParserResToExcel

type ExcelParserResToExcel struct {
	// contains filtered or unexported fields
}

导出的返回值

func (*ExcelParserResToExcel) AddMergeSetting

func (res *ExcelParserResToExcel) AddMergeSetting(mergeSetting CellMergeSetting) *ExcelParserResToExcel

添加合并规则

func (*ExcelParserResToExcel) AddTitleMerge

func (res *ExcelParserResToExcel) AddTitleMerge() *ExcelParserResToExcel

设置默认的行单元格合并

func (*ExcelParserResToExcel) SetMerge

func (res *ExcelParserResToExcel) SetMerge(mergeSettings []CellMergeSetting) *ExcelParserResToExcel

设置应用单元格合并规则的位置 一般创建标题合并规则(NewTitleMerge())

func (*ExcelParserResToExcel) SetStyle

func (res *ExcelParserResToExcel) SetStyle(titleStyle, cellStyle string) *ExcelParserResToExcel

设置样式 不设置的时候,使用默认样式 默认样式: title: 居中、加粗 rows: 无

func (*ExcelParserResToExcel) SetStyleAll

func (res *ExcelParserResToExcel) SetStyleAll(style string) *ExcelParserResToExcel

设置样式 这里部分标题和数据 设置的是全部的

func (*ExcelParserResToExcel) SetTitleNoStyle

func (res *ExcelParserResToExcel) SetTitleNoStyle() *ExcelParserResToExcel

第三方库不支持按row设置 这里自己遍历

func (*ExcelParserResToExcel) Write

func (res *ExcelParserResToExcel) Write(writer io.Writer) error

数据导出

func (*ExcelParserResToExcel) WriteToFile

func (res *ExcelParserResToExcel) WriteToFile(fileName string) error

导出为文件

type ExcelResDecoration

type ExcelResDecoration func(res *ExcelParserResToExcel) *ExcelParserResToExcel

装饰器

type IToExcelData

type IToExcelData interface {
	GetTitles() [][]interface{} //标题行
	GetData() [][]interface{}   //数据行
	GetWidth() int              //矩阵的数据的宽
}

表格数据 数据行中直接使用 time.Time的时候需要使用UTC时区的

type MergeType

type MergeType int

合并类型

const (
	MergeTypeNone MergeType = iota //不合并
	MergeTypeH                     //行合并
	MergeTypeV                     //列合并
	MergeTypeHV                    //行+列合并
)

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL