package xlsx
import (
"bytes"
"encoding/xml"
. "gopkg.in/check.v1"
)
type SheetSuite struct{}
var _ = Suite(&SheetSuite{})
// Test we can add a Row to a Sheet
func (s *SheetSuite) TestAddRow(c *C) {
var f *File
f = NewFile()
sheet := f.AddSheet("MySheet")
row := sheet.AddRow()
c.Assert(row, NotNil)
c.Assert(len(sheet.Rows), Equals, 1)
}
func (s *SheetSuite) TestMakeXLSXSheetFromRows(c *C) {
file := NewFile()
sheet := file.AddSheet("Sheet1")
row := sheet.AddRow()
cell := row.AddCell()
cell.Value = "A cell!"
refTable := NewSharedStringRefTable()
styles := &xlsxStyles{}
xSheet := sheet.makeXLSXSheet(refTable, styles)
c.Assert(xSheet.Dimension.Ref, Equals, "A1:A1")
c.Assert(xSheet.SheetData.Row, HasLen, 1)
xRow := xSheet.SheetData.Row[0]
c.Assert(xRow.R, Equals, 1)
c.Assert(xRow.Spans, Equals, "")
c.Assert(xRow.C, HasLen, 1)
xC := xRow.C[0]
c.Assert(xC.R, Equals, "A1")
c.Assert(xC.S, Equals, 0)
c.Assert(xC.T, Equals, "s") // Shared string type
c.Assert(xC.V, Equals, "0") // reference to shared string
xSST := refTable.makeXLSXSST()
c.Assert(xSST.Count, Equals, 1)
c.Assert(xSST.UniqueCount, Equals, 1)
c.Assert(xSST.SI, HasLen, 1)
xSI := xSST.SI[0]
c.Assert(xSI.T, Equals, "A cell!")
}
// When we create the xlsxSheet we also populate the xlsxStyles struct
// with style information.
func (s *SheetSuite) TestMakeXLSXSheetAlsoPopulatesXLSXSTyles(c *C) {
file := NewFile()
sheet := file.AddSheet("Sheet1")
row := sheet.AddRow()
cell1 := row.AddCell()
cell1.Value = "A cell!"
style1 := *NewStyle()
style1.Font = *NewFont(10, "Verdana")
style1.Fill = *NewFill("solid", "FFFFFFFF", "00000000")
style1.Border = *NewBorder("none", "thin", "none", "thin")
cell1.SetStyle(style1)
// We need a second style to check that Xfs are populated correctly.
cell2 := row.AddCell()
cell2.Value = "Another cell!"
style2 := *NewStyle()
style2.Font = *NewFont(10, "Verdana")
style2.Fill = *NewFill("solid", "FFFFFFFF", "00000000")
style2.Border = *NewBorder("none", "thin", "none", "thin")
cell2.SetStyle(style2)
refTable := NewSharedStringRefTable()
styles := &xlsxStyles{}
worksheet := sheet.makeXLSXSheet(refTable, styles)
c.Assert(len(styles.Fonts), Equals, 2)
c.Assert(styles.Fonts[0].Sz.Val, Equals, "10")
c.Assert(styles.Fonts[0].Name.Val, Equals, "Verdana")
c.Assert(len(styles.Fills), Equals, 2)
c.Assert(styles.Fills[0].PatternFill.PatternType, Equals, "solid")
c.Assert(styles.Fills[0].PatternFill.FgColor.RGB, Equals, "FFFFFFFF")
c.Assert(styles.Fills[0].PatternFill.BgColor.RGB, Equals, "00000000")
c.Assert(len(styles.Borders), Equals, 2)
c.Assert(styles.Borders[0].Left.Style, Equals, "none")
c.Assert(styles.Borders[0].Right.Style, Equals, "thin")
c.Assert(styles.Borders[0].Top.Style, Equals, "none")
c.Assert(styles.Borders[0].Bottom.Style, Equals, "thin")
c.Assert(len(styles.CellStyleXfs), Equals, 2)
// The 0th CellStyleXf could just be getting the zero values by default
c.Assert(styles.CellStyleXfs[0].FontId, Equals, 0)
c.Assert(styles.CellStyleXfs[0].FillId, Equals, 0)
c.Assert(styles.CellStyleXfs[0].BorderId, Equals, 0)
// The 1st element cannot get initialised this way by accident.
c.Assert(styles.CellStyleXfs[1].FontId, Equals, 1)
c.Assert(styles.CellStyleXfs[1].FillId, Equals, 1)
c.Assert(styles.CellStyleXfs[1].BorderId, Equals, 1)
c.Assert(len(styles.CellXfs), Equals, 2)
c.Assert(styles.CellXfs[0].FontId, Equals, 0)
c.Assert(styles.CellXfs[0].FillId, Equals, 0)
c.Assert(styles.CellXfs[0].BorderId, Equals, 0)
// As above, we need the 1st element to make the test fail
// when it should.
c.Assert(styles.CellXfs[1].FontId, Equals, 1)
c.Assert(styles.CellXfs[1].FillId, Equals, 1)
c.Assert(styles.CellXfs[1].BorderId, Equals, 1)
// Finally we check that the cell points to the right CellXf /
// CellStyleXf.
c.Assert(worksheet.SheetData.Row[0].C[0].S, Equals, 0)
c.Assert(worksheet.SheetData.Row[0].C[1].S, Equals, 1)
}
func (s *SheetSuite) TestMarshalSheet(c *C) {
file := NewFile()
sheet := file.AddSheet("Sheet1")
row := sheet.AddRow()
cell := row.AddCell()
cell.Value = "A cell!"
refTable := NewSharedStringRefTable()
styles := &xlsxStyles{}
xSheet := sheet.makeXLSXSheet(refTable, styles)
output := bytes.NewBufferString(xml.Header)
body, err := xml.MarshalIndent(xSheet, " ", " ")
c.Assert(err, IsNil)
c.Assert(body, NotNil)
_, err = output.Write(body)
c.Assert(err, IsNil)
expectedXLSXSheet := `
0
`
c.Assert(output.String(), Equals, expectedXLSXSheet)
}
func (s *SheetSuite) TestMarshalSheetWithMultipleCells(c *C) {
file := NewFile()
sheet := file.AddSheet("Sheet1")
row := sheet.AddRow()
cell := row.AddCell()
cell.Value = "A cell (with value 1)!"
cell = row.AddCell()
cell.Value = "A cell (with value 2)!"
refTable := NewSharedStringRefTable()
styles := &xlsxStyles{}
xSheet := sheet.makeXLSXSheet(refTable, styles)
output := bytes.NewBufferString(xml.Header)
body, err := xml.MarshalIndent(xSheet, " ", " ")
c.Assert(err, IsNil)
c.Assert(body, NotNil)
_, err = output.Write(body)
c.Assert(err, IsNil)
expectedXLSXSheet := `
0
1
`
c.Assert(output.String(), Equals, expectedXLSXSheet)
}