stream_test.go 5.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. package excelize
  2. import (
  3. "encoding/xml"
  4. "fmt"
  5. "io/ioutil"
  6. "math/rand"
  7. "os"
  8. "path/filepath"
  9. "strings"
  10. "testing"
  11. "time"
  12. "github.com/stretchr/testify/assert"
  13. )
  14. func BenchmarkStreamWriter(b *testing.B) {
  15. file := NewFile()
  16. row := make([]interface{}, 10)
  17. for colID := 0; colID < 10; colID++ {
  18. row[colID] = colID
  19. }
  20. for n := 0; n < b.N; n++ {
  21. streamWriter, _ := file.NewStreamWriter("Sheet1")
  22. for rowID := 10; rowID <= 110; rowID++ {
  23. cell, _ := CoordinatesToCellName(1, rowID)
  24. streamWriter.SetRow(cell, row)
  25. }
  26. }
  27. b.ReportAllocs()
  28. }
  29. func TestStreamWriter(t *testing.T) {
  30. file := NewFile()
  31. streamWriter, err := file.NewStreamWriter("Sheet1")
  32. assert.NoError(t, err)
  33. // Test max characters in a cell.
  34. row := make([]interface{}, 1)
  35. row[0] = strings.Repeat("c", 32769)
  36. assert.NoError(t, streamWriter.SetRow("A1", row))
  37. // Test leading and ending space(s) character characters in a cell.
  38. row = make([]interface{}, 1)
  39. row[0] = " characters"
  40. assert.NoError(t, streamWriter.SetRow("A2", row))
  41. row = make([]interface{}, 1)
  42. row[0] = []byte("Word")
  43. assert.NoError(t, streamWriter.SetRow("A3", row))
  44. // Test set cell with style.
  45. styleID, err := file.NewStyle(`{"font":{"color":"#777777"}}`)
  46. assert.NoError(t, err)
  47. assert.NoError(t, streamWriter.SetRow("A4", []interface{}{Cell{StyleID: styleID}}))
  48. assert.NoError(t, streamWriter.SetRow("A5", []interface{}{&Cell{StyleID: styleID, Value: "cell"}}))
  49. assert.EqualError(t, streamWriter.SetRow("A6", []interface{}{time.Now()}), "only UTC time expected")
  50. for rowID := 10; rowID <= 51200; rowID++ {
  51. row := make([]interface{}, 50)
  52. for colID := 0; colID < 50; colID++ {
  53. row[colID] = rand.Intn(640000)
  54. }
  55. cell, _ := CoordinatesToCellName(1, rowID)
  56. assert.NoError(t, streamWriter.SetRow(cell, row))
  57. }
  58. assert.NoError(t, streamWriter.Flush())
  59. // Save xlsx file by the given path.
  60. assert.NoError(t, file.SaveAs(filepath.Join("test", "TestStreamWriter.xlsx")))
  61. // Test close temporary file error.
  62. file = NewFile()
  63. streamWriter, err = file.NewStreamWriter("Sheet1")
  64. assert.NoError(t, err)
  65. for rowID := 10; rowID <= 51200; rowID++ {
  66. row := make([]interface{}, 50)
  67. for colID := 0; colID < 50; colID++ {
  68. row[colID] = rand.Intn(640000)
  69. }
  70. cell, _ := CoordinatesToCellName(1, rowID)
  71. assert.NoError(t, streamWriter.SetRow(cell, row))
  72. }
  73. assert.NoError(t, streamWriter.rawData.Close())
  74. assert.Error(t, streamWriter.Flush())
  75. streamWriter.rawData.tmp, err = ioutil.TempFile(os.TempDir(), "excelize-")
  76. assert.NoError(t, err)
  77. _, err = streamWriter.rawData.Reader()
  78. assert.NoError(t, err)
  79. assert.NoError(t, os.Remove(streamWriter.rawData.tmp.Name()))
  80. // Test unsupport charset
  81. file = NewFile()
  82. delete(file.Sheet, "xl/worksheets/sheet1.xml")
  83. file.XLSX["xl/worksheets/sheet1.xml"] = MacintoshCyrillicCharset
  84. streamWriter, err = file.NewStreamWriter("Sheet1")
  85. assert.EqualError(t, err, "xml decode error: XML syntax error on line 1: invalid UTF-8")
  86. }
  87. func TestStreamTable(t *testing.T) {
  88. file := NewFile()
  89. streamWriter, err := file.NewStreamWriter("Sheet1")
  90. assert.NoError(t, err)
  91. // Write some rows. We want enough rows to force a temp file (>16MB).
  92. assert.NoError(t, streamWriter.SetRow("A1", []interface{}{"A", "B", "C"}))
  93. row := []interface{}{1, 2, 3}
  94. for r := 2; r < 10000; r++ {
  95. assert.NoError(t, streamWriter.SetRow(fmt.Sprintf("A%d", r), row))
  96. }
  97. // Write a table.
  98. assert.NoError(t, streamWriter.AddTable("A1", "C2", ``))
  99. assert.NoError(t, streamWriter.Flush())
  100. // Verify the table has names.
  101. var table xlsxTable
  102. assert.NoError(t, xml.Unmarshal(file.XLSX["xl/tables/table1.xml"], &table))
  103. assert.Equal(t, "A", table.TableColumns.TableColumn[0].Name)
  104. assert.Equal(t, "B", table.TableColumns.TableColumn[1].Name)
  105. assert.Equal(t, "C", table.TableColumns.TableColumn[2].Name)
  106. assert.NoError(t, streamWriter.AddTable("A1", "C1", ``))
  107. // Test add table with illegal formatset.
  108. assert.EqualError(t, streamWriter.AddTable("B26", "A21", `{x}`), "invalid character 'x' looking for beginning of object key string")
  109. // Test add table with illegal cell coordinates.
  110. assert.EqualError(t, streamWriter.AddTable("A", "B1", `{}`), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
  111. assert.EqualError(t, streamWriter.AddTable("A1", "B", `{}`), `cannot convert cell "B" to coordinates: invalid cell name "B"`)
  112. }
  113. func TestNewStreamWriter(t *testing.T) {
  114. // Test error exceptions
  115. file := NewFile()
  116. _, err := file.NewStreamWriter("Sheet1")
  117. assert.NoError(t, err)
  118. _, err = file.NewStreamWriter("SheetN")
  119. assert.EqualError(t, err, "sheet SheetN is not exist")
  120. }
  121. func TestSetRow(t *testing.T) {
  122. // Test error exceptions
  123. file := NewFile()
  124. streamWriter, err := file.NewStreamWriter("Sheet1")
  125. assert.NoError(t, err)
  126. assert.EqualError(t, streamWriter.SetRow("A", []interface{}{}), `cannot convert cell "A" to coordinates: invalid cell name "A"`)
  127. }
  128. func TestSetCellValFunc(t *testing.T) {
  129. c := &xlsxC{}
  130. assert.NoError(t, setCellValFunc(c, 128))
  131. assert.NoError(t, setCellValFunc(c, int8(-128)))
  132. assert.NoError(t, setCellValFunc(c, int16(-32768)))
  133. assert.NoError(t, setCellValFunc(c, int32(-2147483648)))
  134. assert.NoError(t, setCellValFunc(c, int64(-9223372036854775808)))
  135. assert.NoError(t, setCellValFunc(c, uint(128)))
  136. assert.NoError(t, setCellValFunc(c, uint8(255)))
  137. assert.NoError(t, setCellValFunc(c, uint16(65535)))
  138. assert.NoError(t, setCellValFunc(c, uint32(4294967295)))
  139. assert.NoError(t, setCellValFunc(c, uint64(18446744073709551615)))
  140. assert.NoError(t, setCellValFunc(c, float32(100.1588)))
  141. assert.NoError(t, setCellValFunc(c, float64(100.1588)))
  142. assert.NoError(t, setCellValFunc(c, " Hello"))
  143. assert.NoError(t, setCellValFunc(c, []byte(" Hello")))
  144. assert.NoError(t, setCellValFunc(c, time.Now().UTC()))
  145. assert.NoError(t, setCellValFunc(c, time.Duration(1e13)))
  146. assert.NoError(t, setCellValFunc(c, true))
  147. assert.NoError(t, setCellValFunc(c, nil))
  148. assert.NoError(t, setCellValFunc(c, complex64(5+10i)))
  149. }