lib_test.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. package xlsx
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. "strconv"
  6. "strings"
  7. "testing"
  8. )
  9. // Test we can correctly open a XSLX file and return a xlsx.File
  10. // struct.
  11. func TestOpenFile(t *testing.T) {
  12. var xlsxFile *File
  13. var error error
  14. xlsxFile, error = OpenFile("testfile.xlsx")
  15. if error != nil {
  16. t.Error(error.Error())
  17. return
  18. }
  19. if xlsxFile == nil {
  20. t.Error("OpenFile returned nil FileInterface without generating an os.Error")
  21. return
  22. }
  23. }
  24. // Test that when we open a real XLSX file we create xlsx.Sheet
  25. // objects for the sheets inside the file and that these sheets are
  26. // themselves correct.
  27. func TestCreateSheet(t *testing.T) {
  28. var xlsxFile *File
  29. var error error
  30. var sheet *Sheet
  31. var row *Row
  32. xlsxFile, error = OpenFile("testfile.xlsx")
  33. if error != nil {
  34. t.Error(error.Error())
  35. return
  36. }
  37. if xlsxFile == nil {
  38. t.Error("OpenFile returned a nil File pointer but did not generate an error.")
  39. return
  40. }
  41. sheetLen := len(xlsxFile.Sheets)
  42. if sheetLen == 0 {
  43. t.Error("Expected len(xlsxFile.Sheets) > 0, but got ", sheetLen)
  44. return
  45. }
  46. sheet = xlsxFile.Sheets[0]
  47. rowLen := len(sheet.Rows)
  48. if rowLen != 2 {
  49. t.Error("Expected len(sheet.Rows) == 2, but got ", rowLen)
  50. return
  51. }
  52. row = sheet.Rows[0]
  53. if len(row.Cells) != 2 {
  54. t.Error("Expected len(row.Cells) == 2")
  55. return
  56. }
  57. cell := row.Cells[0]
  58. cellstring := cell.String()
  59. if cellstring != "Foo" {
  60. t.Error("Expected cell.String() == 'Foo', got ", cellstring)
  61. }
  62. }
  63. // Test that GetStyle correctly converts the xlsxStyle.Fonts.
  64. func TestGetStyleWithFonts(t *testing.T) {
  65. var cell *Cell
  66. var style *Style
  67. var xStyles *xlsxStyles
  68. var fonts []xlsxFont
  69. var cellXfs []xlsxXf
  70. fonts = make([]xlsxFont, 1)
  71. fonts[0] = xlsxFont{
  72. Sz: xlsxVal{Val: "10"},
  73. Name: xlsxVal{Val: "Calibra"}}
  74. cellXfs = make([]xlsxXf, 1)
  75. cellXfs[0] = xlsxXf{ApplyFont: true, FontId: 0}
  76. xStyles = &xlsxStyles{Fonts: fonts, CellXfs: cellXfs}
  77. cell = &Cell{Value: "123", styleIndex: 1, styles: xStyles}
  78. style = cell.GetStyle()
  79. if style == nil {
  80. t.Error("No style returned by cell.GetStyle()")
  81. }
  82. if style.Font.Size != 10 {
  83. t.Error("Expected style.Font.Size == 10, but got ", style.Font.Size)
  84. }
  85. if style.Font.Name != "Calibra" {
  86. t.Error("Expected style.Font.Name == 'Calibra', but got ", style.Font.Name)
  87. }
  88. }
  89. // Test that GetStyle correctly converts the xlsxStyle.Fills.
  90. func TestGetStyleWithFills(t *testing.T) {
  91. var cell *Cell
  92. var style *Style
  93. var xStyles *xlsxStyles
  94. var fills []xlsxFill
  95. var cellXfs []xlsxXf
  96. fills = make([]xlsxFill, 1)
  97. fills[0] = xlsxFill{
  98. PatternFill: xlsxPatternFill{
  99. PatternType: "solid",
  100. FgColor: xlsxColor{RGB: "FF000000"},
  101. BgColor: xlsxColor{RGB: "00FF0000"}}}
  102. cellXfs = make([]xlsxXf, 1)
  103. cellXfs[0] = xlsxXf{ApplyFill: true, FillId: 0}
  104. xStyles = &xlsxStyles{Fills: fills, CellXfs: cellXfs}
  105. cell = &Cell{Value: "123", styleIndex: 1, styles: xStyles}
  106. style = cell.GetStyle()
  107. fill := style.Fill
  108. if fill.PatternType != "solid" {
  109. t.Error("Expected fill.PatternType == 'solid', but got ",
  110. fill.PatternType)
  111. }
  112. if fill.BgColor != "00FF0000" {
  113. t.Error("Expected fill.BgColor == '00FF0000', but got ",
  114. fill.BgColor)
  115. }
  116. if fill.FgColor != "FF000000" {
  117. t.Error("Expected fill.FgColor == 'FF000000', but got ",
  118. fill.FgColor)
  119. }
  120. }
  121. // Test that we can correctly extract a reference table from the
  122. // sharedStrings.xml file embedded in the XLSX file and return a
  123. // reference table of string values from it.
  124. func TestReadSharedStringsFromZipFile(t *testing.T) {
  125. var xlsxFile *File
  126. var error error
  127. xlsxFile, error = OpenFile("testfile.xlsx")
  128. if error != nil {
  129. t.Error(error.Error())
  130. return
  131. }
  132. if xlsxFile.referenceTable == nil {
  133. t.Error("expected non nil xlsxFile.referenceTable")
  134. return
  135. }
  136. }
  137. func testXf(t *testing.T, result, expected *xlsxXf) {
  138. if result.ApplyAlignment != expected.ApplyAlignment {
  139. t.Error("Expected result.ApplyAlignment == ", expected.ApplyAlignment,
  140. ", got", result.ApplyAlignment)
  141. return
  142. }
  143. if result.ApplyBorder != expected.ApplyBorder {
  144. t.Error("Expected result.ApplyBorder == ", expected.ApplyBorder,
  145. ", got ", result.ApplyBorder)
  146. return
  147. }
  148. if result.ApplyFont != expected.ApplyFont {
  149. t.Error("Expect result.ApplyFont == ", expected.ApplyFont,
  150. ", got ", result.ApplyFont)
  151. return
  152. }
  153. if result.ApplyFill != expected.ApplyFill {
  154. t.Error("Expected result.ApplyFill == ", expected.ApplyFill,
  155. ", got ", result.ApplyFill)
  156. return
  157. }
  158. if result.ApplyProtection != expected.ApplyProtection {
  159. t.Error("Expexcted result.ApplyProtection == ", expected.ApplyProtection,
  160. ", got ", result.ApplyProtection)
  161. return
  162. }
  163. if result.BorderId != expected.BorderId {
  164. t.Error("Expected BorderId == ", expected.BorderId,
  165. ". got ", result.BorderId)
  166. return
  167. }
  168. if result.FillId != expected.FillId {
  169. t.Error("Expected result.FillId == ", expected.FillId,
  170. ", got ", result.FillId)
  171. return
  172. }
  173. if result.FontId != expected.FontId {
  174. t.Error("Expected result.FontId == ", expected.FontId,
  175. ", got ", result.FontId)
  176. return
  177. }
  178. if result.NumFmtId != expected.NumFmtId {
  179. t.Error("Expected result.NumFmtId == ", expected.NumFmtId,
  180. ", got ", result.NumFmtId)
  181. return
  182. }
  183. }
  184. // We can correctly extract a style table from the style.xml file
  185. // embedded in the XLSX file and return a styles struct from it.
  186. func TestReadStylesFromZipFile(t *testing.T) {
  187. var xlsxFile *File
  188. var error error
  189. var fontCount, fillCount, borderCount, cellStyleXfCount, cellXfCount int
  190. var font xlsxFont
  191. var fill xlsxFill
  192. var border xlsxBorder
  193. var xf xlsxXf
  194. xlsxFile, error = OpenFile("testfile.xlsx")
  195. if error != nil {
  196. t.Error(error.Error())
  197. return
  198. }
  199. if xlsxFile.styles == nil {
  200. t.Error("expected non nil xlsxFile.styles")
  201. return
  202. }
  203. fontCount = len(xlsxFile.styles.Fonts)
  204. if fontCount != 4 {
  205. t.Error("expected exactly 4 xslxFonts, got ", fontCount)
  206. return
  207. }
  208. font = xlsxFile.styles.Fonts[0]
  209. if font.Sz.Val != "11" {
  210. t.Error("expected font.Sz.Val == 11, got ", font.Sz.Val)
  211. return
  212. }
  213. if font.Name.Val != "Calibri" {
  214. t.Error("expected font.Name.Val == 'Calibri', got ", font.Name.Val)
  215. return
  216. }
  217. fillCount = len(xlsxFile.styles.Fills)
  218. if fillCount != 3 {
  219. t.Error("Expected exactly 3 xlsxFills, got ", fillCount)
  220. return
  221. }
  222. fill = xlsxFile.styles.Fills[2]
  223. if fill.PatternFill.PatternType != "solid" {
  224. t.Error("Expected PatternFill.PatternType == 'solid', but got ",
  225. fill.PatternFill.PatternType)
  226. return
  227. }
  228. borderCount = len(xlsxFile.styles.Borders)
  229. if borderCount != 2 {
  230. t.Error("Expected exactly 2 xlsxBorders, got ", borderCount)
  231. return
  232. }
  233. border = xlsxFile.styles.Borders[1]
  234. if border.Left.Style != "thin" {
  235. t.Error("Expected border.Left.Style == 'thin', got ", border.Left.Style)
  236. return
  237. }
  238. if border.Right.Style != "thin" {
  239. t.Error("Expected border.Right.Style == 'thin', got ", border.Right.Style)
  240. return
  241. }
  242. if border.Top.Style != "thin" {
  243. t.Error("Expected border.Top.Style == 'thin', got ", border.Top.Style)
  244. return
  245. }
  246. if border.Bottom.Style != "thin" {
  247. t.Error("Expected border.Bottom.Style == 'thin', got ", border.Bottom.Style)
  248. return
  249. }
  250. cellStyleXfCount = len(xlsxFile.styles.CellStyleXfs)
  251. if cellStyleXfCount != 20 {
  252. t.Error("Expected excactly 20 cellStyleXfs, got ", cellStyleXfCount)
  253. return
  254. }
  255. xf = xlsxFile.styles.CellStyleXfs[0]
  256. expectedXf := &xlsxXf{
  257. ApplyAlignment: true,
  258. ApplyBorder: true,
  259. ApplyFont: true,
  260. ApplyFill: false,
  261. ApplyProtection: true,
  262. BorderId: 0,
  263. FillId: 0,
  264. FontId: 0,
  265. NumFmtId: 164}
  266. testXf(t, &xf, expectedXf)
  267. cellXfCount = len(xlsxFile.styles.CellXfs)
  268. if cellXfCount != 3 {
  269. t.Error("Expected excactly 3 cellXfs, got ", cellXfCount)
  270. return
  271. }
  272. xf = xlsxFile.styles.CellXfs[0]
  273. expectedXf = &xlsxXf{
  274. ApplyAlignment: false,
  275. ApplyBorder: false,
  276. ApplyFont: false,
  277. ApplyFill: false,
  278. ApplyProtection: false,
  279. BorderId: 0,
  280. FillId: 0,
  281. FontId: 0,
  282. NumFmtId: 164}
  283. testXf(t, &xf, expectedXf)
  284. }
  285. func TestLettersToNumeric(t *testing.T) {
  286. cases := map[string]int{"A": 0, "G": 6, "z": 25, "AA": 26, "Az": 51,
  287. "BA": 52, "Bz": 77, "ZA": 26*26 + 0, "ZZ": 26*26 + 25,
  288. "AAA": 26*26 + 26 + 0, "AMI": 1022}
  289. for input, ans := range cases {
  290. output := lettersToNumeric(input)
  291. if output != ans {
  292. t.Error("Expected output '"+input+"' == ", ans,
  293. "but got ", strconv.Itoa(output))
  294. }
  295. }
  296. }
  297. func TestLetterOnlyMapFunction(t *testing.T) {
  298. var input string = "ABC123"
  299. var output string = strings.Map(letterOnlyMapF, input)
  300. if output != "ABC" {
  301. t.Error("Expected output == 'ABC' but got ", output)
  302. }
  303. input = "abc123"
  304. output = strings.Map(letterOnlyMapF, input)
  305. if output != "ABC" {
  306. t.Error("Expected output == 'ABC' but got ", output)
  307. }
  308. }
  309. func TestIntOnlyMapFunction(t *testing.T) {
  310. var input string = "ABC123"
  311. var output string = strings.Map(intOnlyMapF, input)
  312. if output != "123" {
  313. t.Error("Expected output == '123' but got ", output)
  314. }
  315. }
  316. func TestGetCoordsFromCellIDString(t *testing.T) {
  317. var cellIDString string = "A3"
  318. var x, y int
  319. var error error
  320. x, y, error = getCoordsFromCellIDString(cellIDString)
  321. if error != nil {
  322. t.Error(error)
  323. }
  324. if x != 0 {
  325. t.Error("Expected x == 0, but got ", strconv.Itoa(x))
  326. }
  327. if y != 2 {
  328. t.Error("Expected y == 2, but got ", strconv.Itoa(y))
  329. }
  330. }
  331. func TestGetMaxMinFromDimensionRef(t *testing.T) {
  332. var dimensionRef string = "A1:B2"
  333. var minx, miny, maxx, maxy int
  334. var err error
  335. minx, miny, maxx, maxy, err = getMaxMinFromDimensionRef(dimensionRef)
  336. if err != nil {
  337. t.Error(err)
  338. }
  339. if minx != 0 {
  340. t.Error("Expected minx == 0, but got ", strconv.Itoa(minx))
  341. }
  342. if miny != 0 {
  343. t.Error("Expected miny == 0, but got ", strconv.Itoa(miny))
  344. }
  345. if maxx != 1 {
  346. t.Error("Expected maxx == 0, but got ", strconv.Itoa(maxx))
  347. }
  348. if maxy != 1 {
  349. t.Error("Expected maxy == 0, but got ", strconv.Itoa(maxy))
  350. }
  351. }
  352. func TestGetRangeFromString(t *testing.T) {
  353. var rangeString string
  354. var lower, upper int
  355. var error error
  356. rangeString = "1:3"
  357. lower, upper, error = getRangeFromString(rangeString)
  358. if error != nil {
  359. t.Error(error)
  360. }
  361. if lower != 1 {
  362. t.Error("Expected lower bound == 1, but got ", strconv.Itoa(lower))
  363. }
  364. if upper != 3 {
  365. t.Error("Expected upper bound == 3, but got ", strconv.Itoa(upper))
  366. }
  367. }
  368. func TestMakeRowFromSpan(t *testing.T) {
  369. var rangeString string
  370. var row *Row
  371. var length int
  372. rangeString = "1:3"
  373. row = makeRowFromSpan(rangeString)
  374. length = len(row.Cells)
  375. if length != 3 {
  376. t.Error("Expected a row with 3 cells, but got ", strconv.Itoa(length))
  377. }
  378. rangeString = "5:7" // Note - we ignore lower bound!
  379. row = makeRowFromSpan(rangeString)
  380. length = len(row.Cells)
  381. if length != 7 {
  382. t.Error("Expected a row with 7 cells, but got ", strconv.Itoa(length))
  383. }
  384. rangeString = "1:1"
  385. row = makeRowFromSpan(rangeString)
  386. length = len(row.Cells)
  387. if length != 1 {
  388. t.Error("Expected a row with 1 cells, but got ", strconv.Itoa(length))
  389. }
  390. }
  391. func TestReadRowsFromSheet(t *testing.T) {
  392. var sharedstringsXML = bytes.NewBufferString(`
  393. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  394. <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="4" uniqueCount="4">
  395. <si>
  396. <t>Foo</t>
  397. </si>
  398. <si>
  399. <t>Bar</t>
  400. </si>
  401. <si>
  402. <t xml:space="preserve">Baz </t>
  403. </si>
  404. <si>
  405. <t>Quuk</t>
  406. </si>
  407. </sst>`)
  408. var sheetxml = bytes.NewBufferString(`
  409. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  410. <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
  411. xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  412. <dimension ref="A1:B2"/>
  413. <sheetViews>
  414. <sheetView tabSelected="1" workbookViewId="0">
  415. <selection activeCell="C2" sqref="C2"/>
  416. </sheetView>
  417. </sheetViews>
  418. <sheetFormatPr baseColWidth="10" defaultRowHeight="15"/>
  419. <sheetData>
  420. <row r="1" spans="1:2">
  421. <c r="A1" t="s">
  422. <v>0</v>
  423. </c>
  424. <c r="B1" t="s">
  425. <v>1</v>
  426. </c>
  427. </row>
  428. <row r="2" spans="1:2">
  429. <c r="A2" t="s">
  430. <v>2</v>
  431. </c>
  432. <c r="B2" t="s">
  433. <v>3</v>
  434. </c>
  435. </row>
  436. </sheetData>
  437. <pageMargins left="0.7" right="0.7"
  438. top="0.78740157499999996"
  439. bottom="0.78740157499999996"
  440. header="0.3"
  441. footer="0.3"/>
  442. </worksheet>`)
  443. worksheet := new(xlsxWorksheet)
  444. error := xml.NewDecoder(sheetxml).Decode(worksheet)
  445. if error != nil {
  446. t.Error(error.Error())
  447. return
  448. }
  449. sst := new(xlsxSST)
  450. error = xml.NewDecoder(sharedstringsXML).Decode(sst)
  451. if error != nil {
  452. t.Error(error.Error())
  453. return
  454. }
  455. file := new(File)
  456. file.referenceTable = MakeSharedStringRefTable(sst)
  457. rows, maxCols, maxRows := readRowsFromSheet(worksheet, file)
  458. if maxRows != 2 {
  459. t.Error("Expected maxRows == 2")
  460. }
  461. if maxCols != 2 {
  462. t.Error("Expected maxCols == 2")
  463. }
  464. row := rows[0]
  465. if len(row.Cells) != 2 {
  466. t.Error("Expected len(row.Cells) == 2, got ", strconv.Itoa(len(row.Cells)))
  467. }
  468. cell1 := row.Cells[0]
  469. if cell1.String() != "Foo" {
  470. t.Error("Expected cell1.String() == 'Foo', got ", cell1.String())
  471. }
  472. cell2 := row.Cells[1]
  473. if cell2.String() != "Bar" {
  474. t.Error("Expected cell2.String() == 'Bar', got ", cell2.String())
  475. }
  476. }
  477. func TestReadRowsFromSheetWithEmptyCells(t *testing.T) {
  478. var sharedstringsXML = bytes.NewBufferString(`
  479. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  480. <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="8" uniqueCount="5"><si><t>Bob</t></si><si><t>Alice</t></si><si><t>Sue</t></si><si><t>Yes</t></si><si><t>No</t></si></sst>`)
  481. var sheetxml = bytes.NewBufferString(`
  482. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  483. <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="A1:C3"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="D3" sqref="D3"/></sheetView></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="15"/>
  484. <sheetData>
  485. <row r="1" spans="1:3">
  486. <c r="A1" t="s">
  487. <v>
  488. 0
  489. </v>
  490. </c>
  491. <c r="B1" t="s">
  492. <v>
  493. 1
  494. </v>
  495. </c>
  496. <c r="C1" t="s">
  497. <v>
  498. 2
  499. </v>
  500. </c>
  501. </row>
  502. <row r="2" spans="1:3">
  503. <c r="A2" t="s">
  504. <v>
  505. 3
  506. </v>
  507. </c>
  508. <c r="B2" t="s">
  509. <v>
  510. 4
  511. </v>
  512. </c>
  513. <c r="C2" t="s">
  514. <v>
  515. 3
  516. </v>
  517. </c>
  518. </row>
  519. <row r="3" spans="1:3">
  520. <c r="A3" t="s">
  521. <v>
  522. 4
  523. </v>
  524. </c>
  525. <c r="C3" t="s">
  526. <v>
  527. 3
  528. </v>
  529. </c>
  530. </row>
  531. </sheetData>
  532. <pageMargins left="0.7" right="0.7" top="0.78740157499999996" bottom="0.78740157499999996" header="0.3" footer="0.3"/>
  533. </worksheet>
  534. `)
  535. worksheet := new(xlsxWorksheet)
  536. error := xml.NewDecoder(sheetxml).Decode(worksheet)
  537. if error != nil {
  538. t.Error(error.Error())
  539. return
  540. }
  541. sst := new(xlsxSST)
  542. error = xml.NewDecoder(sharedstringsXML).Decode(sst)
  543. if error != nil {
  544. t.Error(error.Error())
  545. return
  546. }
  547. file := new(File)
  548. file.referenceTable = MakeSharedStringRefTable(sst)
  549. rows, maxCols, maxRows := readRowsFromSheet(worksheet, file)
  550. if maxRows != 3 {
  551. t.Error("Expected maxRows == 3, got ", strconv.Itoa(len(rows)))
  552. }
  553. if maxCols != 3 {
  554. t.Error("Expected maxCols == 3, got ", strconv.Itoa(maxCols))
  555. }
  556. row := rows[2]
  557. if len(row.Cells) != 3 {
  558. t.Error("Expected len(row.Cells) == 3, got ", strconv.Itoa(len(row.Cells)))
  559. }
  560. cell1 := row.Cells[0]
  561. if cell1.String() != "No" {
  562. t.Error("Expected cell1.String() == 'No', got ", cell1.String())
  563. }
  564. cell2 := row.Cells[1]
  565. if cell2.String() != "" {
  566. t.Error("Expected cell2.String() == '', got ", cell2.String())
  567. }
  568. cell3 := row.Cells[2]
  569. if cell3.String() != "Yes" {
  570. t.Error("Expected cell3.String() == 'Yes', got ", cell3.String())
  571. }
  572. }
  573. func TestReadRowsFromSheetWithTrailingEmptyCells(t *testing.T) {
  574. var row *Row
  575. var cell1, cell2, cell3, cell4 *Cell
  576. var sharedstringsXML = bytes.NewBufferString(`
  577. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  578. <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="4" uniqueCount="4"><si><t>A</t></si><si><t>B</t></si><si><t>C</t></si><si><t>D</t></si></sst>`)
  579. var sheetxml = bytes.NewBufferString(`
  580. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  581. <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"><dimension ref="A1:D8"/><sheetViews><sheetView tabSelected="1" workbookViewId="0"><selection activeCell="A7" sqref="A7"/></sheetView></sheetViews><sheetFormatPr baseColWidth="10" defaultRowHeight="15"/><sheetData><row r="1" spans="1:4"><c r="A1" t="s"><v>0</v></c><c r="B1" t="s"><v>1</v></c><c r="C1" t="s"><v>2</v></c><c r="D1" t="s"><v>3</v></c></row><row r="2" spans="1:4"><c r="A2"><v>1</v></c></row><row r="3" spans="1:4"><c r="B3"><v>1</v></c></row><row r="4" spans="1:4"><c r="C4"><v>1</v></c></row><row r="5" spans="1:4"><c r="D5"><v>1</v></c></row><row r="6" spans="1:4"><c r="C6"><v>1</v></c></row><row r="7" spans="1:4"><c r="B7"><v>1</v></c></row><row r="8" spans="1:4"><c r="A8"><v>1</v></c></row></sheetData><pageMargins left="0.7" right="0.7" top="0.78740157499999996" bottom="0.78740157499999996" header="0.3" footer="0.3"/></worksheet>
  582. `)
  583. worksheet := new(xlsxWorksheet)
  584. error := xml.NewDecoder(sheetxml).Decode(worksheet)
  585. if error != nil {
  586. t.Error(error.Error())
  587. return
  588. }
  589. sst := new(xlsxSST)
  590. error = xml.NewDecoder(sharedstringsXML).Decode(sst)
  591. if error != nil {
  592. t.Error(error.Error())
  593. return
  594. }
  595. file := new(File)
  596. file.referenceTable = MakeSharedStringRefTable(sst)
  597. rows, maxCol, maxRow := readRowsFromSheet(worksheet, file)
  598. if maxCol != 4 {
  599. t.Error("Expected maxCol == 4, got ", strconv.Itoa(maxCol))
  600. }
  601. if maxRow != 8 {
  602. t.Error("Expected maxRow == 8, got ", strconv.Itoa(maxRow))
  603. }
  604. row = rows[0]
  605. if len(row.Cells) != 4 {
  606. t.Error("Expected len(row.Cells) == 4, got ", strconv.Itoa(len(row.Cells)))
  607. }
  608. cell1 = row.Cells[0]
  609. if cell1.String() != "A" {
  610. t.Error("Expected cell1.String() == 'A', got ", cell1.String())
  611. }
  612. cell2 = row.Cells[1]
  613. if cell2.String() != "B" {
  614. t.Error("Expected cell2.String() == 'B', got ", cell2.String())
  615. }
  616. cell3 = row.Cells[2]
  617. if cell3.String() != "C" {
  618. t.Error("Expected cell3.String() == 'C', got ", cell3.String())
  619. }
  620. cell4 = row.Cells[3]
  621. if cell4.String() != "D" {
  622. t.Error("Expected cell4.String() == 'D', got ", cell4.String())
  623. }
  624. row = rows[1]
  625. if len(row.Cells) != 4 {
  626. t.Error("Expected len(row.Cells) == 4, got ", strconv.Itoa(len(row.Cells)))
  627. }
  628. cell1 = row.Cells[0]
  629. if cell1.String() != "1" {
  630. t.Error("Expected cell1.String() == '1', got ", cell1.String())
  631. }
  632. cell2 = row.Cells[1]
  633. if cell2.String() != "" {
  634. t.Error("Expected cell2.String() == '', got ", cell2.String())
  635. }
  636. cell3 = row.Cells[2]
  637. if cell3.String() != "" {
  638. t.Error("Expected cell3.String() == '', got ", cell3.String())
  639. }
  640. cell4 = row.Cells[3]
  641. if cell4.String() != "" {
  642. t.Error("Expected cell4.String() == '', got ", cell4.String())
  643. }
  644. }