Skip to content
Golang library for reading and writing Microsoft Excel™ (XLSX) files.
Go
Branch: master
Clone or download

Latest commit

Latest commit fa2571a May 30, 2020

Files

Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
.github/ISSUE_TEMPLATE Delete ISSUE_TEMPLATE.md Jul 30, 2018
test Resolve #348, support delete Data Validation Mar 12, 2020
.gitignore Fix #539 Fixed error opening excel file created in encoding d… (#540) Dec 19, 2019
.travis.yml Add unit test case Mar 31, 2020
CODE_OF_CONDUCT.md Fix #576, serialize by fields order on stream flush Feb 12, 2020
CONTRIBUTING.md Resolve #570, flat columns for the column's operation Feb 6, 2020
LICENSE remove ineffectual variable assignments and simplify code Mar 29, 2020
PULL_REQUEST_TEMPLATE.md Create PULL_REQUEST_TEMPLATE.md Jul 29, 2018
README.md - Resolve #485 use sheet index instead of ID Apr 22, 2020
README_zh.md - Resolve #485 use sheet index instead of ID Apr 22, 2020
SECURITY.md Create SECURITY.md Sep 25, 2019
adjust.go Performance improvements Apr 5, 2020
adjust_test.go Improve code coverage unit tests Dec 29, 2019
calc.go fn: SUMIF May 30, 2020
calc_test.go fn: SUMIF May 30, 2020
calcchain.go Improve code coverage unit tests Dec 29, 2019
calcchain_test.go Improve code coverage unit tests Dec 21, 2019
cell.go add limits for total columns, row and filename length May 28, 2020
cell_test.go - Resolve #611, fix failure BenchmarkSetCellValue Apr 9, 2020
chart.go - Resolve #485 use sheet index instead of ID Apr 22, 2020
chart_test.go - Resolve #485 use sheet index instead of ID Apr 22, 2020
col.go Resolve #570, flat columns for the column's operation Feb 6, 2020
col_test.go - Resolve #485 use sheet index instead of ID Apr 22, 2020
comment.go Resolve #172, init rich text support Apr 5, 2020
comment_test.go Resolve #345, fix missing comments by GetComments Mar 30, 2020
datavalidation.go Resolve #348, support delete Data Validation Mar 12, 2020
datavalidation_test.go Resolve #348, support delete Data Validation Mar 12, 2020
date.go Export ExcelDateToTime function to convert excel date to time Mar 3, 2020
date_test.go Export ExcelDateToTime function to convert excel date to time Mar 3, 2020
docProps.go Improve code coverage unit tests Dec 29, 2019
docProps_test.go Improve code coverage unit tests Dec 29, 2019
drawing.go Replace bytes.NewReader(stringToBytes(s)) with strings.NewReader(s) (#… Apr 8, 2020
drawing_test.go Resolve #345, fix missing comments by GetComments Mar 30, 2020
errors.go Export ExcelDateToTime function to convert excel date to time Mar 3, 2020
errors_test.go Export ExcelDateToTime function to convert excel date to time Mar 3, 2020
excelize.go speedup get cell value from shared string table May 26, 2020
excelize.svg Combine functions: Sep 15, 2019
excelize_test.go add limits for total columns, row and filename length May 28, 2020
file.go add limits for total columns, row and filename length May 28, 2020
file_test.go Add unit test case Mar 31, 2020
go.mod updated test and go.mod May 10, 2020
go.sum updated test and go.mod May 10, 2020
hsl.go Comments style changed. Sep 13, 2018
lib.go add limits for total columns, row and filename length May 28, 2020
lib_test.go add limits for total columns, row and filename length May 28, 2020
logo.png Typo fixed and godoc updated Mar 20, 2019
merge.go Resolve #570, flat columns for the column's operation Feb 6, 2020
merge_test.go - Resolve #485 use sheet index instead of ID Apr 22, 2020
picture.go - transform the range to the matrix on the first arg of the formula May 21, 2020
picture_test.go Merge pull request #410 May 17, 2020
pivotTable.go - Resolve #611, fix failure BenchmarkSetCellValue Apr 9, 2020
pivotTable_test.go - Resolve #611, fix failure BenchmarkSetCellValue Apr 9, 2020
rows.go speedup get cell value from shared string table May 26, 2020
rows_test.go handle the cell without r attribute in a row element Apr 24, 2020
shape.go Resolve #470, export Style structs to allow create the style for cell… Mar 9, 2020
shape_test.go Improve code coverage unit tests Dec 29, 2019
sheet.go - New API: SetSheetFormatPr and GetSheetFormatPr May 12, 2020
sheet_test.go - Resolve #485 use sheet index instead of ID Apr 22, 2020
sheetpr.go - New API: SetSheetFormatPr and GetSheetFormatPr May 12, 2020
sheetpr_test.go - New API: SetSheetFormatPr and GetSheetFormatPr May 12, 2020
sheetview.go Improve code coverage unit tests Dec 29, 2019
sheetview_test.go Resolve #580, revert commit 5ca7231 Feb 18, 2020
sparkline.go Replace bytes.NewReader(stringToBytes(s)) with strings.NewReader(s) (#… Apr 8, 2020
sparkline_test.go Resolve #580, revert commit 5ca7231 Feb 18, 2020
stream.go - Resolve #485 use sheet index instead of ID Apr 22, 2020
stream_test.go Fix #576, serialize by fields order on stream flush Feb 12, 2020
styles.go avoid creating duplicate number format May 24, 2020
styles_test.go Resolve #643, avoid creating duplicate style May 24, 2020
table.go avoid duplicate filter database in workbook defined name May 15, 2020
table_test.go Resolve #643, avoid creating duplicate style May 24, 2020
templates.go Improve code coverage unit tests Dec 29, 2019
vmlDrawing.go Improve code coverage unit tests Dec 29, 2019
xmlApp.go Improve code coverage unit tests Dec 29, 2019
xmlCalcChain.go Improve code coverage unit tests Dec 29, 2019
xmlChart.go Resolve #470, export Style structs to allow create the style for cell… Mar 9, 2020
xmlChartSheet.go init formula calculation engine, ref #65 and #599 May 3, 2020
xmlComments.go Improve code coverage unit tests Dec 29, 2019
xmlContentTypes.go Improve code coverage unit tests Dec 29, 2019
xmlCore.go Improve code coverage unit tests Dec 29, 2019
xmlDecodeDrawing.go Improve code coverage unit tests Dec 29, 2019
xmlDrawing.go add limits for total columns, row and filename length May 28, 2020
xmlPivotCache.go - New API: SetSheetFormatPr and GetSheetFormatPr May 12, 2020
xmlPivotTable.go Resolve #598, filter support for AddPivotTable Apr 8, 2020
xmlSharedStrings.go Fix #622, storage string to SST (shared string table) May 25, 2020
xmlStyles.go - formula engine: reduce cyclomatic complexity May 10, 2020
xmlTable.go Improve code coverage unit tests Dec 29, 2019
xmlTheme.go Improve code coverage unit tests Dec 29, 2019
xmlWorkbook.go Improve code coverage unit tests Dec 29, 2019
xmlWorksheet.go Resolve #451, support create chart sheet Mar 28, 2020

README.md

Excelize logo

Build Status Code Coverage Go Report Card go.dev Licenses Donate

Excelize

Introduction

Excelize is a library written in pure Go providing a set of functions that allow you to write to and read from XLSX / XLSM / XLTM files. Supports reading and writing spreadsheet documents generated by Microsoft Excel™ 2007 and later. Supports complex components by high compatibility, and provided streaming API for generating or reading data from a worksheet with huge amounts of data. This library needs Go version 1.10 or later. The full API docs can be seen using go's built-in documentation tool, or online at go.dev and docs reference.

Basic Usage

Installation

go get github.com/360EntSecGroup-Skylar/excelize
  • If your package management with Go Modules, please install with following command.
go get github.com/360EntSecGroup-Skylar/excelize/v2

Create XLSX file

Here is a minimal example usage that will create XLSX file.

package main

import (
    "fmt"

    "github.com/360EntSecGroup-Skylar/excelize"
)

func main() {
    f := excelize.NewFile()
    // Create a new sheet.
    index := f.NewSheet("Sheet2")
    // Set value of a cell.
    f.SetCellValue("Sheet2", "A2", "Hello world.")
    f.SetCellValue("Sheet1", "B2", 100)
    // Set active sheet of the workbook.
    f.SetActiveSheet(index)
    // Save xlsx file by the given path.
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

Reading XLSX file

The following constitutes the bare to read a XLSX document.

package main

import (
    "fmt"

    "github.com/360EntSecGroup-Skylar/excelize"
)

func main() {
    f, err := excelize.OpenFile("Book1.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    // Get value from cell by given worksheet name and axis.
    cell, err := f.GetCellValue("Sheet1", "B2")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(cell)
    // Get all the rows in the Sheet1.
    rows, err := f.GetRows("Sheet1")
    for _, row := range rows {
        for _, colCell := range row {
            fmt.Print(colCell, "\t")
        }
        fmt.Println()
    }
}

Add chart to XLSX file

With Excelize chart generation and management is as easy as a few lines of code. You can build charts based off data in your worksheet or generate charts without any data in your worksheet at all.

Excelize

package main

import (
    "fmt"

    "github.com/360EntSecGroup-Skylar/excelize"
)

func main() {
    categories := map[string]string{"A2": "Small", "A3": "Normal", "A4": "Large", "B1": "Apple", "C1": "Orange", "D1": "Pear"}
    values := map[string]int{"B2": 2, "C2": 3, "D2": 3, "B3": 5, "C3": 2, "D3": 4, "B4": 6, "C4": 7, "D4": 8}
    f := excelize.NewFile()
    for k, v := range categories {
        f.SetCellValue("Sheet1", k, v)
    }
    for k, v := range values {
        f.SetCellValue("Sheet1", k, v)
    }
    if err := f.AddChart("Sheet1", "E1", `{"type":"col3DClustered","series":[{"name":"Sheet1!$A$2","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$2:$D$2"},{"name":"Sheet1!$A$3","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$3:$D$3"},{"name":"Sheet1!$A$4","categories":"Sheet1!$B$1:$D$1","values":"Sheet1!$B$4:$D$4"}],"title":{"name":"Fruit 3D Clustered Column Chart"}}`); err != nil {
        fmt.Println(err)
        return
    }
    // Save xlsx file by the given path.
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}

Add picture to XLSX file

package main

import (
    "fmt"
    _ "image/gif"
    _ "image/jpeg"
    _ "image/png"

    "github.com/360EntSecGroup-Skylar/excelize"
)

func main() {
    f, err := excelize.OpenFile("Book1.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    // Insert a picture.
    if err := f.AddPicture("Sheet1", "A2", "image.png", ""); err != nil {
        fmt.Println(err)
    }
    // Insert a picture to worksheet with scaling.
    if err := f.AddPicture("Sheet1", "D2", "image.jpg", `{"x_scale": 0.5, "y_scale": 0.5}`); err != nil {
        fmt.Println(err)
    }
    // Insert a picture offset in the cell with printing support.
    if err := f.AddPicture("Sheet1", "H2", "image.gif", `{"x_offset": 15, "y_offset": 10, "print_obj": true, "lock_aspect_ratio": false, "locked": false}`); err != nil {
        fmt.Println(err)
    }
    // Save the xlsx file with the origin path.
    if err = f.Save(); err != nil {
        fmt.Println(err)
    }
}

Contributing

Contributions are welcome! Open a pull request to fix a bug, or open an issue to discuss a new feature or change. XML is compliant with part 1 of the 5th edition of the ECMA-376 Standard for Office Open XML.

Licenses

This program is under the terms of the BSD 3-Clause License. See https://opensource.org/licenses/BSD-3-Clause.

The Excel logo is a trademark of Microsoft Corporation. This artwork is an adaptation.

gopher.{ai,svg,png} was created by Takuya Ueda. Licensed under the Creative Commons 3.0 Attributions license.

You can’t perform that action at this time.