picture_test.go 8.5 KB
Newer Older
1 2 3
package excelize

import (
4 5
	_ "image/gif"
	_ "image/jpeg"
6
	_ "image/png"
7 8 9 10

	_ "golang.org/x/image/tiff"

	"fmt"
11
	"io/ioutil"
12
	"os"
13
	"path/filepath"
M
Michael 已提交
14
	"strings"
15
	"testing"
16 17

	"github.com/stretchr/testify/assert"
18 19 20 21
)

func BenchmarkAddPictureFromBytes(b *testing.B) {
	f := NewFile()
22
	imgFile, err := ioutil.ReadFile(filepath.Join("test", "images", "excel.png"))
23
	if err != nil {
24
		b.Error("unable to load image for benchmark")
25 26 27
	}
	b.ResetTimer()
	for i := 1; i <= b.N; i++ {
28 29 30
		if err := f.AddPictureFromBytes("Sheet1", fmt.Sprint("A", i), "", "excel", ".png", imgFile); err != nil {
			b.Error(err)
		}
31 32
	}
}
33 34

func TestAddPicture(t *testing.T) {
35
	f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
36 37 38 39 40
	if !assert.NoError(t, err) {
		t.FailNow()
	}

	// Test add picture to worksheet with offset and location hyperlink.
41 42
	assert.NoError(t, f.AddPicture("Sheet2", "I9", filepath.Join("test", "images", "excel.jpg"),
		`{"x_offset": 140, "y_offset": 120, "hyperlink": "#Sheet2!D8", "hyperlink_type": "Location"}`))
43
	// Test add picture to worksheet with offset, external hyperlink and positioning.
44 45
	assert.NoError(t, f.AddPicture("Sheet1", "F21", filepath.Join("test", "images", "excel.jpg"),
		`{"x_offset": 10, "y_offset": 10, "hyperlink": "https://github.com/360EntSecGroup-Skylar/excelize", "hyperlink_type": "External", "positioning": "oneCell"}`))
46

47
	file, err := ioutil.ReadFile(filepath.Join("test", "images", "excel.png"))
48
	assert.NoError(t, err)
49

xurime's avatar
xurime 已提交
50 51 52 53 54 55 56 57 58
	// Test add picture to worksheet with autofit.
	assert.NoError(t, f.AddPicture("Sheet1", "A30", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`))
	assert.NoError(t, f.AddPicture("Sheet1", "B30", filepath.Join("test", "images", "excel.jpg"), `{"x_offset": 10, "y_offset": 10, "autofit": true}`))
	f.NewSheet("AddPicture")
	assert.NoError(t, f.SetRowHeight("AddPicture", 10, 30))
	assert.NoError(t, f.MergeCell("AddPicture", "B3", "D9"))
	assert.NoError(t, f.AddPicture("AddPicture", "C6", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`))
	assert.NoError(t, f.AddPicture("AddPicture", "A1", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`))

59
	// Test add picture to worksheet from bytes.
60
	assert.NoError(t, f.AddPictureFromBytes("Sheet1", "Q1", "", "Excel Logo", ".png", file))
61
	// Test add picture to worksheet from bytes with illegal cell coordinates.
62 63 64 65 66
	assert.EqualError(t, f.AddPictureFromBytes("Sheet1", "A", "", "Excel Logo", ".png", file), `cannot convert cell "A" to coordinates: invalid cell name "A"`)

	assert.NoError(t, f.AddPicture("Sheet1", "Q8", filepath.Join("test", "images", "excel.gif"), ""))
	assert.NoError(t, f.AddPicture("Sheet1", "Q15", filepath.Join("test", "images", "excel.jpg"), ""))
	assert.NoError(t, f.AddPicture("Sheet1", "Q22", filepath.Join("test", "images", "excel.tif"), ""))
67 68

	// Test write file to given path.
69
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestAddPicture.xlsx")))
70 71 72 73
}

func TestAddPictureErrors(t *testing.T) {
	xlsx, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
74
	assert.NoError(t, err)
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94

	// Test add picture to worksheet with invalid file path.
	err = xlsx.AddPicture("Sheet1", "G21", filepath.Join("test", "not_exists_dir", "not_exists.icon"), "")
	if assert.Error(t, err) {
		assert.True(t, os.IsNotExist(err), "Expected os.IsNotExist(err) == true")
	}

	// Test add picture to worksheet with unsupport file type.
	err = xlsx.AddPicture("Sheet1", "G21", filepath.Join("test", "Book1.xlsx"), "")
	assert.EqualError(t, err, "unsupported image extension")

	err = xlsx.AddPictureFromBytes("Sheet1", "G21", "", "Excel Logo", "jpg", make([]byte, 1))
	assert.EqualError(t, err, "unsupported image extension")

	// Test add picture to worksheet with invalid file data.
	err = xlsx.AddPictureFromBytes("Sheet1", "G21", "", "Excel Logo", ".jpg", make([]byte, 1))
	assert.EqualError(t, err, "image: unknown format")
}

func TestGetPicture(t *testing.T) {
xurime's avatar
xurime 已提交
95
	f, err := prepareTestBook1()
96 97 98 99
	if !assert.NoError(t, err) {
		t.FailNow()
	}

xurime's avatar
xurime 已提交
100
	file, raw, err := f.GetPicture("Sheet1", "F21")
101 102 103 104 105 106 107 108
	assert.NoError(t, err)
	if !assert.NotEmpty(t, filepath.Join("test", file)) || !assert.NotEmpty(t, raw) ||
		!assert.NoError(t, ioutil.WriteFile(filepath.Join("test", file), raw, 0644)) {

		t.FailNow()
	}

	// Try to get picture from a worksheet with illegal cell coordinates.
xurime's avatar
xurime 已提交
109
	_, _, err = f.GetPicture("Sheet1", "A")
110 111 112
	assert.EqualError(t, err, `cannot convert cell "A" to coordinates: invalid cell name "A"`)

	// Try to get picture from a worksheet that doesn't contain any images.
xurime's avatar
xurime 已提交
113
	file, raw, err = f.GetPicture("Sheet3", "I9")
xurime's avatar
xurime 已提交
114
	assert.EqualError(t, err, "sheet Sheet3 is not exist")
115 116 117 118
	assert.Empty(t, file)
	assert.Empty(t, raw)

	// Try to get picture from a cell that doesn't contain an image.
xurime's avatar
xurime 已提交
119
	file, raw, err = f.GetPicture("Sheet2", "A2")
120 121 122 123
	assert.NoError(t, err)
	assert.Empty(t, file)
	assert.Empty(t, raw)

xurime's avatar
xurime 已提交
124 125 126 127
	f.getDrawingRelationships("xl/worksheets/_rels/sheet1.xml.rels", "rId8")
	f.getDrawingRelationships("", "")
	f.getSheetRelationshipsTargetByID("", "")
	f.deleteSheetRelationships("", "")
128 129

	// Try to get picture from a local storage file.
130
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestGetPicture.xlsx")))
131

xurime's avatar
xurime 已提交
132
	f, err = OpenFile(filepath.Join("test", "TestGetPicture.xlsx"))
133
	assert.NoError(t, err)
134

xurime's avatar
xurime 已提交
135
	file, raw, err = f.GetPicture("Sheet1", "F21")
136 137 138 139 140 141 142 143
	assert.NoError(t, err)
	if !assert.NotEmpty(t, filepath.Join("test", file)) || !assert.NotEmpty(t, raw) ||
		!assert.NoError(t, ioutil.WriteFile(filepath.Join("test", file), raw, 0644)) {

		t.FailNow()
	}

	// Try to get picture from a local storage file that doesn't contain an image.
xurime's avatar
xurime 已提交
144 145 146 147 148 149 150 151
	file, raw, err = f.GetPicture("Sheet1", "F22")
	assert.NoError(t, err)
	assert.Empty(t, file)
	assert.Empty(t, raw)

	// Test get picture from none drawing worksheet.
	f = NewFile()
	file, raw, err = f.GetPicture("Sheet1", "F22")
152 153 154
	assert.NoError(t, err)
	assert.Empty(t, file)
	assert.Empty(t, raw)
xurime's avatar
xurime 已提交
155 156 157 158 159
	f, err = prepareTestBook1()
	assert.NoError(t, err)
	f.XLSX["xl/drawings/drawing1.xml"] = MacintoshCyrillicCharset
	_, _, err = f.getPicture(20, 5, "xl/drawings/drawing1.xml", "xl/drawings/_rels/drawing2.xml.rels")
	assert.EqualError(t, err, "xml decode error: XML syntax error on line 1: invalid UTF-8")
160 161 162 163 164 165 166
}

func TestAddDrawingPicture(t *testing.T) {
	// testing addDrawingPicture with illegal cell coordinates.
	f := NewFile()
	assert.EqualError(t, f.addDrawingPicture("sheet1", "", "A", "", 0, 0, 0, 0, nil), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
}
M
Michael 已提交
167 168 169 170

func TestAddPictureFromBytes(t *testing.T) {
	f := NewFile()
	imgFile, err := ioutil.ReadFile("logo.png")
xurime's avatar
xurime 已提交
171 172 173
	assert.NoError(t, err, "Unable to load logo for test")
	assert.NoError(t, f.AddPictureFromBytes("Sheet1", fmt.Sprint("A", 1), "", "logo", ".png", imgFile))
	assert.NoError(t, f.AddPictureFromBytes("Sheet1", fmt.Sprint("A", 50), "", "logo", ".png", imgFile))
M
Michael 已提交
174 175 176 177 178 179 180
	imageCount := 0
	for fileName := range f.XLSX {
		if strings.Contains(fileName, "media/image") {
			imageCount++
		}
	}
	assert.Equal(t, 1, imageCount, "Duplicate image should only be stored once.")
xurime's avatar
xurime 已提交
181
	assert.EqualError(t, f.AddPictureFromBytes("SheetN", fmt.Sprint("A", 1), "", "logo", ".png", imgFile), "sheet SheetN is not exist")
M
Michael 已提交
182
}
183 184 185 186 187 188 189 190 191 192 193 194 195 196 197

func TestDeletePicture(t *testing.T) {
	f, err := OpenFile(filepath.Join("test", "Book1.xlsx"))
	assert.NoError(t, err)
	assert.NoError(t, f.DeletePicture("Sheet1", "A1"))
	assert.NoError(t, f.AddPicture("Sheet1", "P1", filepath.Join("test", "images", "excel.jpg"), ""))
	assert.NoError(t, f.DeletePicture("Sheet1", "P1"))
	assert.NoError(t, f.SaveAs(filepath.Join("test", "TestDeletePicture.xlsx")))
	// Test delete picture on not exists worksheet.
	assert.EqualError(t, f.DeletePicture("SheetN", "A1"), "sheet SheetN is not exist")
	// Test delete picture with invalid coordinates.
	assert.EqualError(t, f.DeletePicture("Sheet1", ""), `cannot convert cell "" to coordinates: invalid cell name ""`)
	// Test delete picture on no chart worksheet.
	assert.NoError(t, NewFile().DeletePicture("Sheet1", "A1"))
}
xurime's avatar
xurime 已提交
198 199 200 201 202 203 204 205 206 207 208 209

func TestDrawingResize(t *testing.T) {
	f := NewFile()
	// Test calculate drawing resize on not exists worksheet.
	_, _, _, _, err := f.drawingResize("SheetN", "A1", 1, 1, nil)
	assert.EqualError(t, err, "sheet SheetN is not exist")
	// Test calculate drawing resize with invalid coordinates.
	_, _, _, _, err = f.drawingResize("Sheet1", "", 1, 1, nil)
	assert.EqualError(t, err, `cannot convert cell "" to coordinates: invalid cell name ""`)
	f.Sheet["xl/worksheets/sheet1.xml"].MergeCells = &xlsxMergeCells{Cells: []*xlsxMergeCell{{Ref: "A:A"}}}
	assert.EqualError(t, f.AddPicture("Sheet1", "A1", filepath.Join("test", "images", "excel.jpg"), `{"autofit": true}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
}