stream_style_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571
  1. package xlsx
  2. import (
  3. "bytes"
  4. "fmt"
  5. . "gopkg.in/check.v1"
  6. "io"
  7. "reflect"
  8. "time"
  9. )
  10. const (
  11. StyleStreamTestsShouldMakeRealFiles = true
  12. )
  13. type StreamStyleSuite struct{}
  14. var _ = Suite(&StreamStyleSuite{})
  15. func (s *StreamSuite) TestStreamTestsShouldMakeRealFilesShouldBeFalse(t *C) {
  16. if StyleStreamTestsShouldMakeRealFiles {
  17. t.Fatal("TestsShouldMakeRealFiles should only be true for local debugging. Don't forget to switch back before commiting.")
  18. }
  19. }
  20. func (s *StreamSuite) TestXlsxStreamWriteWithStyle(t *C) {
  21. // When shouldMakeRealFiles is set to true this test will make actual XLSX files in the file system.
  22. // This is useful to ensure files open in Excel, Numbers, Google Docs, etc.
  23. // In case of issues you can use "Open XML SDK 2.5" to diagnose issues in generated XLSX files:
  24. // https://www.microsoft.com/en-us/download/details.aspx?id=30425
  25. testCases := []struct {
  26. testName string
  27. sheetNames []string
  28. workbookData [][][]StreamCell
  29. expectedError error
  30. }{
  31. {
  32. testName: "Style Test",
  33. sheetNames: []string{
  34. "Sheet1",
  35. },
  36. workbookData: [][][]StreamCell{
  37. {
  38. {MakeStringStreamCell("1"), MakeStringStreamCell("25"),
  39. MakeStyledStringStreamCell("A", BoldStrings), MakeStringStreamCell("B")},
  40. {MakeIntegerStreamCell(1234), MakeStyledIntegerStreamCell(98, BoldIntegers),
  41. MakeStyledIntegerStreamCell(34, ItalicIntegers), MakeStyledIntegerStreamCell(26, UnderlinedIntegers)},
  42. },
  43. },
  44. },
  45. {
  46. testName: "One Sheet",
  47. sheetNames: []string{
  48. "Sheet1",
  49. },
  50. workbookData: [][][]StreamCell{
  51. {
  52. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  53. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  54. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  55. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123)},
  56. },
  57. },
  58. },
  59. {
  60. testName: "One Column",
  61. sheetNames: []string{
  62. "Sheet1",
  63. },
  64. workbookData: [][][]StreamCell{
  65. {
  66. {MakeStringStreamCell("Token")},
  67. {MakeIntegerStreamCell(123)},
  68. },
  69. },
  70. },
  71. {
  72. testName: "Several Sheets, with different numbers of columns and rows",
  73. sheetNames: []string{
  74. "Sheet 1", "Sheet 2", "Sheet3",
  75. },
  76. workbookData: [][][]StreamCell{
  77. {
  78. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  79. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  80. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  81. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123)},
  82. },
  83. {
  84. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  85. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU"),
  86. MakeStringStreamCell("Stock")},
  87. {MakeIntegerStreamCell(456), MakeStringStreamCell("Salsa"),
  88. MakeIntegerStreamCell(200), MakeIntegerStreamCell(346),
  89. MakeIntegerStreamCell(1)},
  90. {MakeIntegerStreamCell(789), MakeStringStreamCell("Burritos"),
  91. MakeIntegerStreamCell(400), MakeIntegerStreamCell(754),
  92. MakeIntegerStreamCell(3)},
  93. },
  94. {
  95. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  96. MakeStringStreamCell("Price")},
  97. {MakeIntegerStreamCell(9853), MakeStringStreamCell("Guacamole"),
  98. MakeIntegerStreamCell(500)},
  99. {MakeIntegerStreamCell(2357), MakeStringStreamCell("Margarita"),
  100. MakeIntegerStreamCell(700)},
  101. },
  102. },
  103. },
  104. {
  105. testName: "Two Sheets with same the name",
  106. sheetNames: []string{
  107. "Sheet 1", "Sheet 1",
  108. },
  109. workbookData: [][][]StreamCell{
  110. {
  111. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  112. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  113. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  114. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123)},
  115. },
  116. {
  117. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  118. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU"),
  119. MakeStringStreamCell("Stock")},
  120. {MakeIntegerStreamCell(456), MakeStringStreamCell("Salsa"),
  121. MakeIntegerStreamCell(200), MakeIntegerStreamCell(346),
  122. MakeIntegerStreamCell(1)},
  123. {MakeIntegerStreamCell(789), MakeStringStreamCell("Burritos"),
  124. MakeIntegerStreamCell(400), MakeIntegerStreamCell(754),
  125. MakeIntegerStreamCell(3)},
  126. },
  127. },
  128. expectedError: fmt.Errorf("duplicate sheet name '%s'.", "Sheet 1"),
  129. },
  130. {
  131. testName: "One Sheet Registered, tries to write to two",
  132. sheetNames: []string{
  133. "Sheet 1",
  134. },
  135. workbookData: [][][]StreamCell{
  136. {
  137. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  138. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  139. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  140. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123)},
  141. },
  142. {
  143. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  144. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  145. {MakeIntegerStreamCell(456), MakeStringStreamCell("Salsa"),
  146. MakeIntegerStreamCell(200), MakeIntegerStreamCell(346)},
  147. },
  148. },
  149. expectedError: AlreadyOnLastSheetError,
  150. },
  151. {
  152. testName: "One Sheet, too many columns in row 1",
  153. sheetNames: []string{
  154. "Sheet 1",
  155. },
  156. workbookData: [][][]StreamCell{
  157. {
  158. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  159. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  160. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  161. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123),
  162. MakeStringStreamCell("asdf")},
  163. },
  164. },
  165. expectedError: WrongNumberOfRowsError,
  166. },
  167. {
  168. testName: "One Sheet, too few columns in row 1",
  169. sheetNames: []string{
  170. "Sheet 1",
  171. },
  172. workbookData: [][][]StreamCell{
  173. {
  174. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  175. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  176. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  177. MakeIntegerStreamCell(300)},
  178. },
  179. },
  180. expectedError: WrongNumberOfRowsError,
  181. },
  182. {
  183. testName: "Lots of Sheets, only writes rows to one, only writes headers to one, should not error and should still create a valid file",
  184. sheetNames: []string{
  185. "Sheet 1", "Sheet 2", "Sheet 3", "Sheet 4", "Sheet 5", "Sheet 6",
  186. },
  187. workbookData: [][][]StreamCell{
  188. {
  189. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  190. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  191. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  192. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123)},
  193. },
  194. {{}},
  195. {{MakeStringStreamCell("Id"), MakeStringStreamCell("Unit Cost")}},
  196. {{}},
  197. {{}},
  198. {{}},
  199. },
  200. },
  201. {
  202. testName: "Two Sheets, only writes to one, should not error and should still create a valid file",
  203. sheetNames: []string{
  204. "Sheet 1", "Sheet 2",
  205. },
  206. workbookData: [][][]StreamCell{
  207. {
  208. {MakeStringStreamCell("Token"), MakeStringStreamCell("Name"),
  209. MakeStringStreamCell("Price"), MakeStringStreamCell("SKU")},
  210. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  211. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123)},
  212. },
  213. {{}},
  214. },
  215. },
  216. {
  217. testName: "UTF-8 Characters. This XLSX File loads correctly with Excel, Numbers, and Google Docs. It also passes Microsoft's Office File Format Validator.",
  218. sheetNames: []string{
  219. "Sheet1",
  220. },
  221. workbookData: [][][]StreamCell{
  222. {
  223. // String courtesy of https://github.com/minimaxir/big-list-of-naughty-strings/
  224. // Header row contains the tags that I am filtering on
  225. {MakeStringStreamCell("Token"), MakeStringStreamCell(endSheetDataTag),
  226. MakeStringStreamCell("Price"), MakeStringStreamCell(fmt.Sprintf(dimensionTag, "A1:D1"))},
  227. // Japanese and emojis
  228. {MakeIntegerStreamCell(123), MakeStringStreamCell("パーティーへ行かないか"),
  229. MakeIntegerStreamCell(300), MakeStringStreamCell("🍕🐵 🙈 🙉 🙊")},
  230. // XML encoder/parser test strings
  231. {MakeIntegerStreamCell(123), MakeStringStreamCell(`<?xml version="1.0" encoding="ISO-8859-1"?>`),
  232. MakeIntegerStreamCell(300), MakeStringStreamCell(`<?xml version="1.0" encoding="ISO-8859-1"?><!DOCTYPE foo [ <!ELEMENT foo ANY ><!ENTITY xxe SYSTEM "file:///etc/passwd" >]><foo>&xxe;</foo>`)},
  233. // Upside down text and Right to Left Arabic text
  234. {MakeIntegerStreamCell(123), MakeStringStreamCell(`˙ɐnbᴉlɐ ɐuƃɐɯ ǝɹolop ʇǝ ǝɹoqɐl ʇn ʇunpᴉpᴉɔuᴉ ɹodɯǝʇ poɯsnᴉǝ op pǝs 'ʇᴉlǝ ƃuᴉɔsᴉdᴉpɐ ɹnʇǝʇɔǝsuoɔ 'ʇǝɯɐ ʇᴉs ɹolop ɯnsdᴉ ɯǝɹo˥
  235. 00˙Ɩ$-`), MakeIntegerStreamCell(300), MakeStringStreamCell(`ﷺ`)} ,
  236. {MakeIntegerStreamCell(123), MakeStringStreamCell("Taco"),
  237. MakeIntegerStreamCell(300), MakeIntegerStreamCell(123)},
  238. },
  239. },
  240. },
  241. }
  242. for i, testCase := range testCases {
  243. var filePath string
  244. var buffer bytes.Buffer
  245. if StyleStreamTestsShouldMakeRealFiles {
  246. filePath = fmt.Sprintf("WorkbookWithStyle%d.xlsx", i)
  247. }
  248. err := writeStreamFileWithStyle(filePath, &buffer, testCase.sheetNames, testCase.workbookData, StyleStreamTestsShouldMakeRealFiles, []StreamStyle{})
  249. if err != testCase.expectedError && err.Error() != testCase.expectedError.Error() {
  250. t.Fatalf("Error differs from expected error. Error: %v, Expected Error: %v ", err, testCase.expectedError)
  251. }
  252. if testCase.expectedError != nil {
  253. return
  254. }
  255. // read the file back with the xlsx package
  256. var bufReader *bytes.Reader
  257. var size int64
  258. if !StyleStreamTestsShouldMakeRealFiles {
  259. bufReader = bytes.NewReader(buffer.Bytes())
  260. size = bufReader.Size()
  261. }
  262. actualSheetNames, actualWorkbookData := readXLSXFile(t, filePath, bufReader, size, StyleStreamTestsShouldMakeRealFiles)
  263. // check if data was able to be read correctly
  264. if !reflect.DeepEqual(actualSheetNames, testCase.sheetNames) {
  265. t.Fatal("Expected sheet names to be equal")
  266. }
  267. expectedWorkbookDataStrings := [][][]string{}
  268. for j,_ := range testCase.workbookData {
  269. expectedWorkbookDataStrings = append(expectedWorkbookDataStrings, [][]string{})
  270. for k,_ := range testCase.workbookData[j]{
  271. expectedWorkbookDataStrings[j] = append(expectedWorkbookDataStrings[j], []string{})
  272. for _, cell := range testCase.workbookData[j][k] {
  273. expectedWorkbookDataStrings[j][k] = append(expectedWorkbookDataStrings[j][k], cell.cellData)
  274. }
  275. }
  276. }
  277. if !reflect.DeepEqual(actualWorkbookData, expectedWorkbookDataStrings) {
  278. t.Fatal("Expected workbook data to be equal")
  279. }
  280. }
  281. }
  282. // writeStreamFile will write the file using this stream package
  283. func writeStreamFileWithStyle(filePath string, fileBuffer io.Writer, sheetNames []string, workbookData [][][]StreamCell,
  284. shouldMakeRealFiles bool, customStyles []StreamStyle) error {
  285. var file *StreamFileBuilder
  286. var err error
  287. if shouldMakeRealFiles {
  288. file, err = NewStreamFileBuilderForPath(filePath)
  289. if err != nil {
  290. return err
  291. }
  292. } else {
  293. file = NewStreamFileBuilder(fileBuffer)
  294. }
  295. defaultStyles := []StreamStyle{Strings,BoldStrings,ItalicIntegers,UnderlinedStrings,
  296. Integers, BoldIntegers, ItalicIntegers, UnderlinedIntegers,
  297. Dates}
  298. allStylesToBeAdded := append(defaultStyles, customStyles...)
  299. err = file.AddStreamStyleList(allStylesToBeAdded)
  300. if err != nil {
  301. return err
  302. }
  303. for i, sheetName := range sheetNames {
  304. header := workbookData[i][0]
  305. err := file.AddSheetWithStyle(sheetName, header)
  306. if err != nil {
  307. return err
  308. }
  309. }
  310. streamFile, err := file.Build()
  311. if err != nil {
  312. return err
  313. }
  314. for i, sheetData := range workbookData {
  315. if i != 0 {
  316. err = streamFile.NextSheet()
  317. if err != nil {
  318. return err
  319. }
  320. }
  321. for i, row := range sheetData {
  322. if i == 0 {
  323. continue
  324. }
  325. err = streamFile.WriteWithStyle(row)
  326. if err != nil {
  327. return err
  328. }
  329. }
  330. }
  331. err = streamFile.Close()
  332. if err != nil {
  333. return err
  334. }
  335. return nil
  336. }
  337. func (s *StreamSuite) TestDates(t *C) {
  338. var filePath string
  339. var buffer bytes.Buffer
  340. if StyleStreamTestsShouldMakeRealFiles {
  341. filePath = fmt.Sprintf("Workbook_Date_test.xlsx")
  342. }
  343. sheetNames := []string{"Sheet1"}
  344. workbookData := [][][]StreamCell{
  345. {
  346. {MakeStringStreamCell("Date:")},
  347. {MakeDateStreamCell(time.Now())},
  348. },
  349. }
  350. err := writeStreamFileWithStyle(filePath, &buffer, sheetNames, workbookData, StyleStreamTestsShouldMakeRealFiles, []StreamStyle{})
  351. if err != nil {
  352. t.Fatal("Error during writing")
  353. }
  354. }
  355. func (s *StreamSuite) TestMakeNewStylesAndUseIt(t *C) {
  356. var filePath string
  357. var buffer bytes.Buffer
  358. if StyleStreamTestsShouldMakeRealFiles {
  359. filePath = fmt.Sprintf("Workbook_newStyle.xlsx")
  360. }
  361. timesNewRoman12 := NewFont(12, TimesNewRoman)
  362. timesNewRoman12.Color = RGB_Dard_Green
  363. courier20 := NewFont(12, Courier)
  364. courier20.Color = RGB_Dark_Red
  365. greenFill := NewFill(Solid_Cell_Fill, RGB_Light_Green, RGB_White)
  366. redFill := NewFill(Solid_Cell_Fill, RGB_Light_Red, RGB_White)
  367. greenStyle := MakeStyle(0, timesNewRoman12, greenFill, DefaultAlignment(), DefaultBorder())
  368. redStyle := MakeStyle(0, courier20, redFill, DefaultAlignment(), DefaultBorder())
  369. sheetNames := []string{"Sheet1"}
  370. workbookData := [][][]StreamCell{
  371. {
  372. {MakeStringStreamCell("Header1"), MakeStringStreamCell("Header2")},
  373. {MakeStyledStringStreamCell("Good", greenStyle), MakeStyledStringStreamCell("Bad", redStyle)},
  374. },
  375. }
  376. err := writeStreamFileWithStyle(filePath, &buffer, sheetNames, workbookData, TestsShouldMakeRealFiles, []StreamStyle{greenStyle, redStyle})
  377. if err != nil {
  378. t.Fatal("Error during writing")
  379. }
  380. // read the file back with the xlsx package
  381. var bufReader *bytes.Reader
  382. var size int64
  383. if !TestsShouldMakeRealFiles {
  384. bufReader = bytes.NewReader(buffer.Bytes())
  385. size = bufReader.Size()
  386. }
  387. actualSheetNames, actualWorkbookData := readXLSXFile(t, filePath, bufReader, size, TestsShouldMakeRealFiles)
  388. // check if data was able to be read correctly
  389. if !reflect.DeepEqual(actualSheetNames, sheetNames) {
  390. t.Fatal("Expected sheet names to be equal")
  391. }
  392. expectedWorkbookDataStrings := [][][]string{}
  393. for j, _ := range workbookData {
  394. expectedWorkbookDataStrings = append(expectedWorkbookDataStrings, [][]string{})
  395. for k, _ := range workbookData[j] {
  396. expectedWorkbookDataStrings[j] = append(expectedWorkbookDataStrings[j], []string{})
  397. for _, cell := range workbookData[j][k] {
  398. expectedWorkbookDataStrings[j][k] = append(expectedWorkbookDataStrings[j][k], cell.cellData)
  399. }
  400. }
  401. }
  402. if !reflect.DeepEqual(actualWorkbookData, expectedWorkbookDataStrings) {
  403. t.Fatal("Expected workbook data to be equal")
  404. }
  405. }
  406. func (s *StreamSuite) TestCloseWithNothingWrittenToSheetsWithStyle(t *C) {
  407. buffer := bytes.NewBuffer(nil)
  408. file := NewStreamFileBuilder(buffer)
  409. sheetNames := []string{"Sheet1", "Sheet2"}
  410. workbookData := [][][]StreamCell{
  411. {{MakeStringStreamCell("Header1"), MakeStringStreamCell("Header2")}},
  412. {{MakeStringStreamCell("Header3"), MakeStringStreamCell("Header4")}},
  413. }
  414. defaultStyles := []StreamStyle{Strings,BoldStrings,ItalicIntegers,UnderlinedStrings,
  415. Integers, BoldIntegers, ItalicIntegers, UnderlinedIntegers,
  416. Dates}
  417. err := file.AddStreamStyleList(defaultStyles)
  418. if err != nil {
  419. t.Fatal(err)
  420. }
  421. err = file.AddSheetWithStyle(sheetNames[0], workbookData[0][0])
  422. if err != nil {
  423. t.Fatal(err)
  424. }
  425. err = file.AddSheetWithStyle(sheetNames[1], workbookData[1][0])
  426. if err != nil {
  427. t.Fatal(err)
  428. }
  429. stream, err := file.Build()
  430. if err != nil {
  431. t.Fatal(err)
  432. }
  433. err = stream.Close()
  434. if err != nil {
  435. t.Fatal(err)
  436. }
  437. bufReader := bytes.NewReader(buffer.Bytes())
  438. size := bufReader.Size()
  439. actualSheetNames, actualWorkbookData := readXLSXFile(t, "", bufReader, size, false)
  440. // check if data was able to be read correctly
  441. if !reflect.DeepEqual(actualSheetNames, sheetNames) {
  442. t.Fatal("Expected sheet names to be equal")
  443. }
  444. expectedWorkbookDataStrings := [][][]string{}
  445. for j,_ := range workbookData {
  446. expectedWorkbookDataStrings = append(expectedWorkbookDataStrings, [][]string{})
  447. for k,_ := range workbookData[j]{
  448. expectedWorkbookDataStrings[j] = append(expectedWorkbookDataStrings[j], []string{})
  449. for _, cell := range workbookData[j][k] {
  450. expectedWorkbookDataStrings[j][k] = append(expectedWorkbookDataStrings[j][k], cell.cellData)
  451. }
  452. }
  453. }
  454. if !reflect.DeepEqual(actualWorkbookData, expectedWorkbookDataStrings) {
  455. t.Fatal("Expected workbook data to be equal")
  456. }
  457. }
  458. func (s *StreamSuite) TestBuildErrorsAfterBuildWithStyle(t *C) {
  459. file := NewStreamFileBuilder(bytes.NewBuffer(nil))
  460. defaultStyles := []StreamStyle{Strings,BoldStrings,ItalicIntegers,UnderlinedStrings,
  461. Integers, BoldIntegers, ItalicIntegers, UnderlinedIntegers,
  462. Dates}
  463. err := file.AddStreamStyleList(defaultStyles)
  464. if err != nil {
  465. t.Fatal(err)
  466. }
  467. err = file.AddSheetWithStyle("Sheet1", []StreamCell{MakeStringStreamCell("Header")})
  468. if err != nil {
  469. t.Fatal(err)
  470. }
  471. err = file.AddSheetWithStyle("Sheet2", []StreamCell{MakeStringStreamCell("Header")})
  472. if err != nil {
  473. t.Fatal(err)
  474. }
  475. _, err = file.Build()
  476. if err != nil {
  477. t.Fatal(err)
  478. }
  479. _, err = file.Build()
  480. if err != BuiltStreamFileBuilderError {
  481. t.Fatal(err)
  482. }
  483. }
  484. func (s *StreamSuite) TestAddSheetWithStyleErrorsAfterBuild(t *C) {
  485. file := NewStreamFileBuilder(bytes.NewBuffer(nil))
  486. defaultStyles := []StreamStyle{Strings,BoldStrings,ItalicIntegers,UnderlinedStrings,
  487. Integers, BoldIntegers, ItalicIntegers, UnderlinedIntegers,
  488. Dates}
  489. err := file.AddStreamStyleList(defaultStyles)
  490. if err != nil {
  491. t.Fatal(err)
  492. }
  493. err = file.AddSheetWithStyle("Sheet1", []StreamCell{MakeStringStreamCell("Header")})
  494. if err != nil {
  495. t.Fatal(err)
  496. }
  497. err = file.AddSheetWithStyle("Sheet2", []StreamCell{MakeStringStreamCell("Header2")})
  498. if err != nil {
  499. t.Fatal(err)
  500. }
  501. _, err = file.Build()
  502. if err != nil {
  503. t.Fatal(err)
  504. }
  505. err = file.AddSheetWithStyle("Sheet3", []StreamCell{MakeStringStreamCell("Header3")})
  506. if err != BuiltStreamFileBuilderError {
  507. t.Fatal(err)
  508. }
  509. }