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 := newXlsxStyleSheet(nil)
xSheet := sheet.makeXLSXSheet(refTable, styles)
c.Assert(xSheet.Dimension.Ref, Equals, "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 := newXlsxStyleSheet(nil)
worksheet := sheet.makeXLSXSheet(refTable, styles)
c.Assert(styles.Fonts.Count, Equals, 1)
c.Assert(styles.Fonts.Font[0].Sz.Val, Equals, "10")
c.Assert(styles.Fonts.Font[0].Name.Val, Equals, "Verdana")
c.Assert(styles.Fills.Count, Equals, 1)
c.Assert(styles.Fills.Fill[0].PatternFill.PatternType, Equals, "solid")
c.Assert(styles.Fills.Fill[0].PatternFill.FgColor.RGB, Equals, "FFFFFFFF")
c.Assert(styles.Fills.Fill[0].PatternFill.BgColor.RGB, Equals, "00000000")
c.Assert(styles.Borders.Count, Equals, 1)
c.Assert(styles.Borders.Border[0].Left.Style, Equals, "none")
c.Assert(styles.Borders.Border[0].Right.Style, Equals, "thin")
c.Assert(styles.Borders.Border[0].Top.Style, Equals, "none")
c.Assert(styles.Borders.Border[0].Bottom.Style, Equals, "thin")
c.Assert(styles.CellStyleXfs.Count, Equals, 1)
// The 0th CellStyleXf could just be getting the zero values by default
c.Assert(styles.CellStyleXfs.Xf[0].FontId, Equals, 0)
c.Assert(styles.CellStyleXfs.Xf[0].FillId, Equals, 0)
c.Assert(styles.CellStyleXfs.Xf[0].BorderId, Equals, 0)
c.Assert(styles.CellXfs.Count, Equals, 1)
c.Assert(styles.CellXfs.Xf[0].FontId, Equals, 0)
c.Assert(styles.CellXfs.Xf[0].FillId, Equals, 0)
c.Assert(styles.CellXfs.Xf[0].BorderId, Equals, 0)
// 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, 0)
}
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 := newXlsxStyleSheet(nil)
xSheet := sheet.makeXLSXSheet(refTable, styles)
output := bytes.NewBufferString(xml.Header)
body, err := xml.Marshal(xSheet)
c.Assert(err, IsNil)
c.Assert(body, NotNil)
_, err = output.Write(body)
c.Assert(err, IsNil)
expectedXLSXSheet := `
0
&C&"Times New Roman,Regular"&12&A&C&"Times New Roman,Regular"&12Page &P`
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 := newXlsxStyleSheet(nil)
xSheet := sheet.makeXLSXSheet(refTable, styles)
output := bytes.NewBufferString(xml.Header)
body, err := xml.Marshal(xSheet)
c.Assert(err, IsNil)
c.Assert(body, NotNil)
_, err = output.Write(body)
c.Assert(err, IsNil)
expectedXLSXSheet := `
01
&C&"Times New Roman,Regular"&12&A&C&"Times New Roman,Regular"&12Page &P`
c.Assert(output.String(), Equals, expectedXLSXSheet)
}
func (s *SheetSuite) TestSetColWidth(c *C) {
file := NewFile()
sheet := file.AddSheet("Sheet1")
_ = sheet.SetColWidth(0, 0, 10.5)
_ = sheet.SetColWidth(1, 5, 11)
c.Assert(sheet.Cols[0].Width, Equals, 10.5)
c.Assert(sheet.Cols[0].Max, Equals, 1)
c.Assert(sheet.Cols[0].Min, Equals, 1)
c.Assert(sheet.Cols[1].Width, Equals, float64(11))
c.Assert(sheet.Cols[1].Max, Equals, 6)
c.Assert(sheet.Cols[1].Min, Equals, 2)
}