sheet_test.go 10.7 KB
Newer Older
1
package excelize
2 3 4

import (
	"fmt"
5 6
	"path/filepath"
	"strings"
7 8 9 10 11 12 13
	"testing"

	"github.com/mohae/deepcopy"
	"github.com/stretchr/testify/assert"
)

func ExampleFile_SetPageLayout() {
14
	f := NewFile()
15

16
	if err := f.SetPageLayout(
17
		"Sheet1",
18
		PageLayoutOrientation(OrientationLandscape),
19
	); err != nil {
xurime's avatar
xurime 已提交
20
		fmt.Println(err)
21
	}
22
	if err := f.SetPageLayout(
23
		"Sheet1",
24 25 26
		PageLayoutPaperSize(10),
		FitToHeight(2),
		FitToWidth(2),
27
	); err != nil {
xurime's avatar
xurime 已提交
28
		fmt.Println(err)
29
	}
30 31 32 33
	// Output:
}

func ExampleFile_GetPageLayout() {
34
	f := NewFile()
35
	var (
36 37 38 39
		orientation PageLayoutOrientation
		paperSize   PageLayoutPaperSize
		fitToHeight FitToHeight
		fitToWidth  FitToWidth
40
	)
41
	if err := f.GetPageLayout("Sheet1", &orientation); err != nil {
xurime's avatar
xurime 已提交
42
		fmt.Println(err)
43
	}
44
	if err := f.GetPageLayout("Sheet1", &paperSize); err != nil {
xurime's avatar
xurime 已提交
45
		fmt.Println(err)
46
	}
xurime's avatar
xurime 已提交
47
	if err := f.GetPageLayout("Sheet1", &fitToHeight); err != nil {
xurime's avatar
xurime 已提交
48
		fmt.Println(err)
xurime's avatar
xurime 已提交
49 50 51
	}

	if err := f.GetPageLayout("Sheet1", &fitToWidth); err != nil {
xurime's avatar
xurime 已提交
52
		fmt.Println(err)
xurime's avatar
xurime 已提交
53
	}
54 55
	fmt.Println("Defaults:")
	fmt.Printf("- orientation: %q\n", orientation)
56
	fmt.Printf("- paper size: %d\n", paperSize)
xurime's avatar
xurime 已提交
57 58
	fmt.Printf("- fit to height: %d\n", fitToHeight)
	fmt.Printf("- fit to width: %d\n", fitToWidth)
59 60 61
	// Output:
	// Defaults:
	// - orientation: "portrait"
62
	// - paper size: 1
xurime's avatar
xurime 已提交
63 64
	// - fit to height: 1
	// - fit to width: 1
65 66
}

67
func TestNewSheet(t *testing.T) {
68
	f := NewFile()
69 70 71 72 73 74 75
	sheetID := f.NewSheet("Sheet2")
	f.SetActiveSheet(sheetID)
	// delete original sheet
	f.DeleteSheet(f.GetSheetName(f.GetSheetIndex("Sheet1")))
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestNewSheet.xlsx")))
}

xurime's avatar
xurime 已提交
76
func TestSetPane(t *testing.T) {
77
	f := NewFile()
xurime's avatar
xurime 已提交
78 79 80 81 82 83 84 85 86 87 88 89
	assert.NoError(t, f.SetPanes("Sheet1", `{"freeze":false,"split":false}`))
	f.NewSheet("Panes 2")
	assert.NoError(t, f.SetPanes("Panes 2", `{"freeze":true,"split":false,"x_split":1,"y_split":0,"top_left_cell":"B1","active_pane":"topRight","panes":[{"sqref":"K16","active_cell":"K16","pane":"topRight"}]}`))
	f.NewSheet("Panes 3")
	assert.NoError(t, f.SetPanes("Panes 3", `{"freeze":false,"split":true,"x_split":3270,"y_split":1800,"top_left_cell":"N57","active_pane":"bottomLeft","panes":[{"sqref":"I36","active_cell":"I36"},{"sqref":"G33","active_cell":"G33","pane":"topRight"},{"sqref":"J60","active_cell":"J60","pane":"bottomLeft"},{"sqref":"O60","active_cell":"O60","pane":"bottomRight"}]}`))
	f.NewSheet("Panes 4")
	assert.NoError(t, f.SetPanes("Panes 4", `{"freeze":true,"split":false,"x_split":0,"y_split":9,"top_left_cell":"A34","active_pane":"bottomLeft","panes":[{"sqref":"A11:XFD11","active_cell":"A11","pane":"bottomLeft"}]}`))
	assert.NoError(t, f.SetPanes("Panes 4", ""))
	assert.EqualError(t, f.SetPanes("SheetN", ""), "sheet SheetN is not exist")
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetPane.xlsx")))
}

90 91 92 93
func TestPageLayoutOption(t *testing.T) {
	const sheet = "Sheet1"

	testData := []struct {
94 95
		container  PageLayoutOptionPtr
		nonDefault PageLayoutOption
96
	}{
97 98 99 100
		{new(PageLayoutOrientation), PageLayoutOrientation(OrientationLandscape)},
		{new(PageLayoutPaperSize), PageLayoutPaperSize(10)},
		{new(FitToHeight), FitToHeight(2)},
		{new(FitToWidth), FitToWidth(2)},
101 102 103 104 105 106 107 108
	}

	for i, test := range testData {
		t.Run(fmt.Sprintf("TestData%d", i), func(t *testing.T) {

			opt := test.nonDefault
			t.Logf("option %T", opt)

109 110 111
			def := deepcopy.Copy(test.container).(PageLayoutOptionPtr)
			val1 := deepcopy.Copy(def).(PageLayoutOptionPtr)
			val2 := deepcopy.Copy(def).(PageLayoutOptionPtr)
112

113
			f := NewFile()
114
			// Get the default value
115
			assert.NoError(t, f.GetPageLayout(sheet, def), opt)
116
			// Get again and check
117
			assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
118 119 120 121
			if !assert.Equal(t, val1, def, opt) {
				t.FailNow()
			}
			// Set the same value
122
			assert.NoError(t, f.SetPageLayout(sheet, val1), opt)
123
			// Get again and check
124
			assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
125 126 127 128
			if !assert.Equal(t, val1, def, "%T: value should not have changed", opt) {
				t.FailNow()
			}
			// Set a different value
129 130
			assert.NoError(t, f.SetPageLayout(sheet, test.nonDefault), opt)
			assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
131
			// Get again and compare
132
			assert.NoError(t, f.GetPageLayout(sheet, val2), opt)
133 134 135 136 137 138 139 140
			if !assert.Equal(t, val1, val2, "%T: value should not have changed", opt) {
				t.FailNow()
			}
			// Value should not be the same as the default
			if !assert.NotEqual(t, def, val1, "%T: value should have changed from default", opt) {
				t.FailNow()
			}
			// Restore the default value
141 142
			assert.NoError(t, f.SetPageLayout(sheet, def), opt)
			assert.NoError(t, f.GetPageLayout(sheet, val1), opt)
143 144 145 146 147 148
			if !assert.Equal(t, def, val1) {
				t.FailNow()
			}
		})
	}
}
xurime's avatar
xurime 已提交
149

150
func TestSearchSheet(t *testing.T) {
151
	f, err := OpenFile(filepath.Join("test", "SharedStrings.xlsx"))
152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170
	if !assert.NoError(t, err) {
		t.FailNow()
	}
	// Test search in a not exists worksheet.
	_, err = f.SearchSheet("Sheet4", "")
	assert.EqualError(t, err, "sheet Sheet4 is not exist")
	var expected []string
	// Test search a not exists value.
	result, err := f.SearchSheet("Sheet1", "X")
	assert.NoError(t, err)
	assert.EqualValues(t, expected, result)
	result, err = f.SearchSheet("Sheet1", "A")
	assert.NoError(t, err)
	assert.EqualValues(t, []string{"A1"}, result)
	// Test search the coordinates where the numerical value in the range of
	// "0-9" of Sheet1 is described by regular expression:
	result, err = f.SearchSheet("Sheet1", "[0-9]", true)
	assert.NoError(t, err)
	assert.EqualValues(t, expected, result)
xurime's avatar
xurime 已提交
171 172

	// Test search worksheet data after set cell value
173
	f = NewFile()
xurime's avatar
xurime 已提交
174 175 176
	assert.NoError(t, f.SetCellValue("Sheet1", "A1", true))
	_, err = f.SearchSheet("Sheet1", "")
	assert.NoError(t, err)
177 178
}

xurime's avatar
xurime 已提交
179
func TestSetPageLayout(t *testing.T) {
180
	f := NewFile()
xurime's avatar
xurime 已提交
181 182 183 184 185
	// Test set page layout on not exists worksheet.
	assert.EqualError(t, f.SetPageLayout("SheetN"), "sheet SheetN is not exist")
}

func TestGetPageLayout(t *testing.T) {
186
	f := NewFile()
xurime's avatar
xurime 已提交
187 188 189
	// Test get page layout on not exists worksheet.
	assert.EqualError(t, f.GetPageLayout("SheetN"), "sheet SheetN is not exist")
}
190 191

func TestSetHeaderFooter(t *testing.T) {
192
	f := NewFile()
193
	assert.NoError(t, f.SetCellStr("Sheet1", "A1", "Test SetHeaderFooter"))
194 195 196
	// Test set header and footer on not exists worksheet.
	assert.EqualError(t, f.SetHeaderFooter("SheetN", nil), "sheet SheetN is not exist")
	// Test set header and footer with illegal setting.
197
	assert.EqualError(t, f.SetHeaderFooter("Sheet1", &FormatHeaderFooter{
198 199 200 201
		OddHeader: strings.Repeat("c", 256),
	}), "field OddHeader must be less than 255 characters")

	assert.NoError(t, f.SetHeaderFooter("Sheet1", nil))
202
	assert.NoError(t, f.SetHeaderFooter("Sheet1", &FormatHeaderFooter{
203 204 205 206 207 208 209 210 211 212
		DifferentFirst:   true,
		DifferentOddEven: true,
		OddHeader:        "&R&P",
		OddFooter:        "&C&F",
		EvenHeader:       "&L&P",
		EvenFooter:       "&L&D&R&T",
		FirstHeader:      `&CCenter &"-,Bold"Bold&"-,Regular"HeaderU+000A&D`,
	}))
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestSetHeaderFooter.xlsx")))
}
213 214

func TestDefinedName(t *testing.T) {
215 216
	f := NewFile()
	assert.NoError(t, f.SetDefinedName(&DefinedName{
217 218 219 220 221
		Name:     "Amount",
		RefersTo: "Sheet1!$A$2:$D$5",
		Comment:  "defined name comment",
		Scope:    "Sheet1",
	}))
222
	assert.NoError(t, f.SetDefinedName(&DefinedName{
223 224 225 226
		Name:     "Amount",
		RefersTo: "Sheet1!$A$2:$D$5",
		Comment:  "defined name comment",
	}))
227
	assert.EqualError(t, f.SetDefinedName(&DefinedName{
228 229 230
		Name:     "Amount",
		RefersTo: "Sheet1!$A$2:$D$5",
		Comment:  "defined name comment",
231
	}), "the same name already exists on the scope")
232
	assert.EqualError(t, f.DeleteDefinedName(&DefinedName{
233 234
		Name: "No Exist Defined Name",
	}), "no defined name on the scope")
235
	assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[1].RefersTo)
236
	assert.NoError(t, f.DeleteDefinedName(&DefinedName{
237 238 239 240
		Name: "Amount",
	}))
	assert.Exactly(t, "Sheet1!$A$2:$D$5", f.GetDefinedName()[0].RefersTo)
	assert.Exactly(t, 1, len(f.GetDefinedName()))
241 242
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestDefinedName.xlsx")))
}
243 244

func TestGroupSheets(t *testing.T) {
245
	f := NewFile()
246 247 248 249 250 251 252 253 254 255 256
	sheets := []string{"Sheet2", "Sheet3"}
	for _, sheet := range sheets {
		f.NewSheet(sheet)
	}
	assert.EqualError(t, f.GroupSheets([]string{"Sheet1", "SheetN"}), "sheet SheetN is not exist")
	assert.EqualError(t, f.GroupSheets([]string{"Sheet2", "Sheet3"}), "group worksheet must contain an active worksheet")
	assert.NoError(t, f.GroupSheets([]string{"Sheet1", "Sheet2"}))
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestGroupSheets.xlsx")))
}

func TestUngroupSheets(t *testing.T) {
257
	f := NewFile()
258 259 260 261 262 263
	sheets := []string{"Sheet2", "Sheet3", "Sheet4", "Sheet5"}
	for _, sheet := range sheets {
		f.NewSheet(sheet)
	}
	assert.NoError(t, f.UngroupSheets())
}
H
Harris 已提交
264

265
func TestInsertPageBreak(t *testing.T) {
266
	f := NewFile()
267 268 269 270 271 272 273 274 275 276
	assert.NoError(t, f.InsertPageBreak("Sheet1", "A1"))
	assert.NoError(t, f.InsertPageBreak("Sheet1", "B2"))
	assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
	assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
	assert.EqualError(t, f.InsertPageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
	assert.EqualError(t, f.InsertPageBreak("SheetN", "C3"), "sheet SheetN is not exist")
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertPageBreak.xlsx")))
}

func TestRemovePageBreak(t *testing.T) {
277
	f := NewFile()
278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301
	assert.NoError(t, f.RemovePageBreak("Sheet1", "A2"))

	assert.NoError(t, f.InsertPageBreak("Sheet1", "A2"))
	assert.NoError(t, f.InsertPageBreak("Sheet1", "B2"))
	assert.NoError(t, f.RemovePageBreak("Sheet1", "A1"))
	assert.NoError(t, f.RemovePageBreak("Sheet1", "B2"))

	assert.NoError(t, f.InsertPageBreak("Sheet1", "C3"))
	assert.NoError(t, f.RemovePageBreak("Sheet1", "C3"))

	assert.NoError(t, f.InsertPageBreak("Sheet1", "A3"))
	assert.NoError(t, f.RemovePageBreak("Sheet1", "B3"))
	assert.NoError(t, f.RemovePageBreak("Sheet1", "A3"))

	f.NewSheet("Sheet2")
	assert.NoError(t, f.InsertPageBreak("Sheet2", "B2"))
	assert.NoError(t, f.InsertPageBreak("Sheet2", "C2"))
	assert.NoError(t, f.RemovePageBreak("Sheet2", "B2"))

	assert.EqualError(t, f.RemovePageBreak("Sheet1", "A"), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
	assert.EqualError(t, f.RemovePageBreak("SheetN", "C3"), "sheet SheetN is not exist")
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestRemovePageBreak.xlsx")))
}

H
Harris 已提交
302
func TestGetSheetName(t *testing.T) {
303
	f, _ := OpenFile(filepath.Join("test", "Book1.xlsx"))
304 305 306 307
	assert.Equal(t, "Sheet1", f.GetSheetName(0))
	assert.Equal(t, "Sheet2", f.GetSheetName(1))
	assert.Equal(t, "", f.GetSheetName(-1))
	assert.Equal(t, "", f.GetSheetName(2))
H
Harris 已提交
308 309 310 311 312 313 314
}

func TestGetSheetMap(t *testing.T) {
	expectedMap := map[int]string{
		1: "Sheet1",
		2: "Sheet2",
	}
315
	f, _ := OpenFile(filepath.Join("test", "Book1.xlsx"))
H
Harris 已提交
316 317 318 319 320 321
	sheetMap := f.GetSheetMap()
	for idx, name := range sheetMap {
		assert.Equal(t, expectedMap[idx], name)
	}
	assert.Equal(t, len(sheetMap), 2)
}