CARLOS rastrillo docs

🤖 xlsx

amadan.net/rastrillo/rastrillo/xlsx

Read and write .xlsx workbooks of plain strings, using only the standard library. Use it for exports, and for reading a spreadsheet someone uploads.

Every cell is text. Styles, formulas and dates are not supported: a date in an uploaded file reads as the number Excel stores it as.

Writing

type Sheet struct {
	Name string
	Rows [][]string
}

func Write(w io.Writer, sheetName string, rows [][]string) error
func WriteSheets(w io.Writer, sheets []Sheet) error
func SheetName(name string) string

Write writes a workbook with one sheet. WriteSheets writes one tab for each Sheet, in order. Tab names go through SheetName first, so a name Excel would refuse, or the same name twice, still gives a file that opens.

SheetName makes a name Excel will accept: reserved characters replaced, cut to 31 characters, and never empty.

Reading

func Read(data []byte) ([][]string, error)
func ReadSheets(data []byte) ([]Sheet, error)

Read returns the first sheet's rows. ReadSheets returns every tab with its name. A tab that will not parse fails the whole read, so you never get part of a workbook that looks complete.

An empty cell inside a row reads as "", and empty cells at the end of a row are dropped. A file with more than a million cells, or a part over 50 MB unpacked, is refused.

func IsZip(data []byte) bool
func IsLegacyXLS(data []byte) bool

IsZip and IsLegacyXLS check an upload's first bytes. Use them to ask someone to save an old .xls file as .xlsx or CSV, instead of showing them a parse error.

ColumnName

func ColumnName(index int) string

ColumnName turns a column index into its letter: 0 is A, 26 is AA. Use it when you need to name a column to a person.

Read this page as markdown — exact, unstyled, and cheap for an agent to fetch.