lib_test.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610
  1. package xlsx
  2. import (
  3. "bytes"
  4. "encoding/xml"
  5. // "strconv"
  6. "strings"
  7. . "gopkg.in/check.v1"
  8. )
  9. type LibSuite struct {}
  10. var _ = Suite(&LibSuite{})
  11. // Test we can correctly open a XSLX file and return a xlsx.File
  12. // struct.
  13. func (l *LibSuite) TestOpenFile(c *C) {
  14. var xlsxFile *File
  15. var error error
  16. xlsxFile, error = OpenFile("testfile.xlsx")
  17. c.Assert(error, IsNil)
  18. c.Assert(xlsxFile, NotNil)
  19. }
  20. // Test we can create a File object from scratch
  21. func (l *LibSuite) TestCreateFile(c *C) {
  22. var xlsxFile *File
  23. xlsxFile = NewFile()
  24. c.Assert(xlsxFile, NotNil)
  25. }
  26. // Test that when we open a real XLSX file we create xlsx.Sheet
  27. // objects for the sheets inside the file and that these sheets are
  28. // themselves correct.
  29. func (l *LibSuite) TestCreateSheet(c *C) {
  30. var xlsxFile *File
  31. var err error
  32. var sheet *Sheet
  33. var row *Row
  34. xlsxFile, err = OpenFile("testfile.xlsx")
  35. c.Assert(err, IsNil)
  36. c.Assert(xlsxFile, NotNil)
  37. sheetLen := len(xlsxFile.Sheets)
  38. c.Assert(sheetLen, Equals, 3)
  39. sheet = xlsxFile.Sheets[0]
  40. rowLen := len(sheet.Rows)
  41. c.Assert(rowLen, Equals, 2)
  42. row = sheet.Rows[0]
  43. c.Assert(len(row.Cells), Equals, 2)
  44. cell := row.Cells[0]
  45. cellstring := cell.String()
  46. c.Assert(cellstring, Equals, "Foo")
  47. }
  48. // Test that GetStyle correctly converts the xlsxStyle.Fonts.
  49. func (l *LibSuite) TestGetStyleWithFonts(c *C) {
  50. var cell *Cell
  51. var style *Style
  52. var xStyles *xlsxStyles
  53. var fonts []xlsxFont
  54. var cellXfs []xlsxXf
  55. fonts = make([]xlsxFont, 1)
  56. fonts[0] = xlsxFont{
  57. Sz: xlsxVal{Val: "10"},
  58. Name: xlsxVal{Val: "Calibra"}}
  59. cellXfs = make([]xlsxXf, 1)
  60. cellXfs[0] = xlsxXf{ApplyFont: true, FontId: 0}
  61. xStyles = &xlsxStyles{Fonts: fonts, CellXfs: cellXfs}
  62. cell = &Cell{Value: "123", styleIndex: 1, styles: xStyles}
  63. style = cell.GetStyle()
  64. c.Assert(style, NotNil)
  65. c.Assert(style.Font.Size, Equals, 10)
  66. c.Assert(style.Font.Name, Equals, "Calibra")
  67. }
  68. // Test that GetStyle correctly converts the xlsxStyle.Fills.
  69. func (l *LibSuite) TestGetStyleWithFills(c *C) {
  70. var cell *Cell
  71. var style *Style
  72. var xStyles *xlsxStyles
  73. var fills []xlsxFill
  74. var cellXfs []xlsxXf
  75. fills = make([]xlsxFill, 1)
  76. fills[0] = xlsxFill{
  77. PatternFill: xlsxPatternFill{
  78. PatternType: "solid",
  79. FgColor: xlsxColor{RGB: "FF000000"},
  80. BgColor: xlsxColor{RGB: "00FF0000"}}}
  81. cellXfs = make([]xlsxXf, 1)
  82. cellXfs[0] = xlsxXf{ApplyFill: true, FillId: 0}
  83. xStyles = &xlsxStyles{Fills: fills, CellXfs: cellXfs}
  84. cell = &Cell{Value: "123", styleIndex: 1, styles: xStyles}
  85. style = cell.GetStyle()
  86. fill := style.Fill
  87. c.Assert(fill.PatternType, Equals, "solid")
  88. c.Assert(fill.BgColor, Equals, "00FF0000")
  89. c.Assert(fill.FgColor, Equals, "FF000000")
  90. }
  91. // Test that GetStyle correctly converts the xlsxStyle.Borders.
  92. func (l *LibSuite) TestGetStyleWithBorders(c *C) {
  93. var cell *Cell
  94. var style *Style
  95. var xStyles *xlsxStyles
  96. var borders []xlsxBorder
  97. var cellXfs []xlsxXf
  98. borders = make([]xlsxBorder, 1)
  99. borders[0] = xlsxBorder{
  100. Left: xlsxLine{Style: "thin"},
  101. Right: xlsxLine{Style: "thin"},
  102. Top: xlsxLine{Style: "thin"},
  103. Bottom: xlsxLine{Style: "thin"}}
  104. cellXfs = make([]xlsxXf, 1)
  105. cellXfs[0] = xlsxXf{ApplyBorder: true, BorderId: 0}
  106. xStyles = &xlsxStyles{Borders: borders, CellXfs: cellXfs}
  107. cell = &Cell{Value: "123", styleIndex: 1, styles: xStyles}
  108. style = cell.GetStyle()
  109. border := style.Border
  110. c.Assert(border.Left, Equals, "thin")
  111. c.Assert(border.Right, Equals, "thin")
  112. c.Assert(border.Top, Equals, "thin")
  113. c.Assert(border.Bottom, Equals, "thin")
  114. }
  115. // Test that we can correctly extract a reference table from the
  116. // sharedStrings.xml file embedded in the XLSX file and return a
  117. // reference table of string values from it.
  118. func (l *LibSuite) TestReadSharedStringsFromZipFile(c *C) {
  119. var xlsxFile *File
  120. var err error
  121. xlsxFile, err = OpenFile("testfile.xlsx")
  122. c.Assert(err, IsNil)
  123. c.Assert(xlsxFile.referenceTable, NotNil)
  124. }
  125. // Helper function used to test contents of a given xlsxXf against
  126. // expectations.
  127. func testXf(c *C, result, expected *xlsxXf) {
  128. c.Assert(result.ApplyAlignment, Equals, expected.ApplyAlignment)
  129. c.Assert(result.ApplyBorder, Equals, expected.ApplyBorder)
  130. c.Assert(result.ApplyFont, Equals, expected.ApplyFont)
  131. c.Assert(result.ApplyFill, Equals, expected.ApplyFill)
  132. c.Assert(result.ApplyProtection, Equals, expected.ApplyProtection)
  133. c.Assert(result.BorderId, Equals, expected.BorderId)
  134. c.Assert(result.FillId, Equals, expected.FillId)
  135. c.Assert(result.FontId, Equals, expected.FontId)
  136. c.Assert(result.NumFmtId, Equals, expected.NumFmtId)
  137. }
  138. // We can correctly extract a style table from the style.xml file
  139. // embedded in the XLSX file and return a styles struct from it.
  140. func (l *LibSuite) TestReadStylesFromZipFile(c *C) {
  141. var xlsxFile *File
  142. var err error
  143. var fontCount, fillCount, borderCount, cellStyleXfCount, cellXfCount int
  144. var font xlsxFont
  145. var fill xlsxFill
  146. var border xlsxBorder
  147. var xf xlsxXf
  148. xlsxFile, err = OpenFile("testfile.xlsx")
  149. c.Assert(err, IsNil)
  150. c.Assert(xlsxFile.styles, NotNil)
  151. fontCount = len(xlsxFile.styles.Fonts)
  152. c.Assert(fontCount, Equals, 4)
  153. font = xlsxFile.styles.Fonts[0]
  154. c.Assert(font.Sz.Val, Equals, "11")
  155. c.Assert(font.Name.Val, Equals, "Calibri")
  156. fillCount = len(xlsxFile.styles.Fills)
  157. c.Assert(fillCount, Equals, 3)
  158. fill = xlsxFile.styles.Fills[2]
  159. c.Assert(fill.PatternFill.PatternType, Equals, "solid")
  160. borderCount = len(xlsxFile.styles.Borders)
  161. c.Assert(borderCount, Equals, 2)
  162. border = xlsxFile.styles.Borders[1]
  163. c.Assert(border.Left.Style, Equals, "thin")
  164. c.Assert(border.Right.Style, Equals, "thin")
  165. c.Assert(border.Top.Style, Equals, "thin")
  166. c.Assert(border.Bottom.Style, Equals, "thin")
  167. cellStyleXfCount = len(xlsxFile.styles.CellStyleXfs)
  168. c.Assert(cellStyleXfCount, Equals, 20)
  169. xf = xlsxFile.styles.CellStyleXfs[0]
  170. expectedXf := &xlsxXf{
  171. ApplyAlignment: true,
  172. ApplyBorder: true,
  173. ApplyFont: true,
  174. ApplyFill: false,
  175. ApplyProtection: true,
  176. BorderId: 0,
  177. FillId: 0,
  178. FontId: 0,
  179. NumFmtId: 164}
  180. testXf(c, &xf, expectedXf)
  181. cellXfCount = len(xlsxFile.styles.CellXfs)
  182. c.Assert(cellXfCount, Equals, 3)
  183. xf = xlsxFile.styles.CellXfs[0]
  184. expectedXf = &xlsxXf{
  185. ApplyAlignment: false,
  186. ApplyBorder: false,
  187. ApplyFont: false,
  188. ApplyFill: false,
  189. ApplyProtection: false,
  190. BorderId: 0,
  191. FillId: 0,
  192. FontId: 0,
  193. NumFmtId: 164}
  194. testXf(c, &xf, expectedXf)
  195. }
  196. // We can correctly extract a map of relationship Ids to the worksheet files in
  197. // which they are contained from the XLSX file.
  198. func (l *LibSuite) TestReadWorkbookRelationsFromZipFile(c *C) {
  199. var xlsxFile *File
  200. var err error
  201. xlsxFile, err = OpenFile("testfile.xlsx")
  202. c.Assert(err, IsNil)
  203. sheetCount := len(xlsxFile.Sheet)
  204. c.Assert(sheetCount, Equals, 3)
  205. }
  206. // which they are contained from the XLSX file, even when the
  207. // worksheet files have arbitrary, non-numeric names.
  208. func (l *LibSuite) TestReadWorkbookRelationsFromZipFileWithFunnyNames(c *C) {
  209. var xlsxFile *File
  210. var err error
  211. xlsxFile, err = OpenFile("testrels.xlsx")
  212. c.Assert(err, IsNil)
  213. sheetCount := len(xlsxFile.Sheet)
  214. c.Assert(sheetCount, Equals, 2)
  215. bob := xlsxFile.Sheet["Bob"]
  216. row1 := bob.Rows[0]
  217. cell1 := row1.Cells[0]
  218. c.Assert(cell1.String(), Equals, "I am Bob")
  219. }
  220. func (l *LibSuite) TestLettersToNumeric(c *C) {
  221. cases := map[string]int{"A": 0, "G": 6, "z": 25, "AA": 26, "Az": 51,
  222. "BA": 52, "Bz": 77, "ZA": 26*26 + 0, "ZZ": 26*26 + 25,
  223. "AAA": 26*26 + 26 + 0, "AMI": 1022}
  224. for input, ans := range cases {
  225. output := lettersToNumeric(input)
  226. c.Assert(output, Equals, ans)
  227. }
  228. }
  229. func (l *LibSuite) TestLetterOnlyMapFunction(c *C) {
  230. var input string = "ABC123"
  231. var output string = strings.Map(letterOnlyMapF, input)
  232. c.Assert(output, Equals, "ABC")
  233. input = "abc123"
  234. output = strings.Map(letterOnlyMapF, input)
  235. c.Assert(output, Equals, "ABC")
  236. }
  237. func (l *LibSuite) TestIntOnlyMapFunction(c *C) {
  238. var input string = "ABC123"
  239. var output string = strings.Map(intOnlyMapF, input)
  240. c.Assert(output, Equals, "123")
  241. }
  242. func (l *LibSuite) TestGetCoordsFromCellIDString(c *C) {
  243. var cellIDString string = "A3"
  244. var x, y int
  245. var err error
  246. x, y, err = getCoordsFromCellIDString(cellIDString)
  247. c.Assert(err, IsNil)
  248. c.Assert(x, Equals, 0)
  249. c.Assert(y, Equals, 2)
  250. }
  251. func (l *LibSuite) TestGetMaxMinFromDimensionRef(c *C) {
  252. var dimensionRef string = "A1:B2"
  253. var minx, miny, maxx, maxy int
  254. var err error
  255. minx, miny, maxx, maxy, err = getMaxMinFromDimensionRef(dimensionRef)
  256. c.Assert(err, IsNil)
  257. c.Assert(minx, Equals, 0)
  258. c.Assert(miny, Equals, 0)
  259. c.Assert(maxx, Equals, 1)
  260. c.Assert(maxy, Equals, 1)
  261. }
  262. func (l *LibSuite) TestGetRangeFromString(c *C) {
  263. var rangeString string
  264. var lower, upper int
  265. var err error
  266. rangeString = "1:3"
  267. lower, upper, err = getRangeFromString(rangeString)
  268. c.Assert(err, IsNil)
  269. c.Assert(lower, Equals, 1)
  270. c.Assert(upper, Equals, 3)
  271. }
  272. func (l *LibSuite) TestMakeRowFromSpan(c *C) {
  273. var rangeString string
  274. var row *Row
  275. var length int
  276. rangeString = "1:3"
  277. row = makeRowFromSpan(rangeString)
  278. length = len(row.Cells)
  279. c.Assert(length, Equals, 3)
  280. rangeString = "5:7" // Note - we ignore lower bound!
  281. row = makeRowFromSpan(rangeString)
  282. length = len(row.Cells)
  283. c.Assert(length, Equals, 7)
  284. rangeString = "1:1"
  285. row = makeRowFromSpan(rangeString)
  286. length = len(row.Cells)
  287. c.Assert(length, Equals, 1)
  288. }
  289. func (l *LibSuite) TestReadRowsFromSheet(c *C) {
  290. var sharedstringsXML = bytes.NewBufferString(`
  291. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  292. <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="4" uniqueCount="4">
  293. <si>
  294. <t>Foo</t>
  295. </si>
  296. <si>
  297. <t>Bar</t>
  298. </si>
  299. <si>
  300. <t xml:space="preserve">Baz </t>
  301. </si>
  302. <si>
  303. <t>Quuk</t>
  304. </si>
  305. </sst>`)
  306. var sheetxml = bytes.NewBufferString(`
  307. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  308. <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"
  309. xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
  310. <dimension ref="A1:B2"/>
  311. <sheetViews>
  312. <sheetView tabSelected="1" workbookViewId="0">
  313. <selection activeCell="C2" sqref="C2"/>
  314. </sheetView>
  315. </sheetViews>
  316. <sheetFormatPr baseColWidth="10" defaultRowHeight="15"/>
  317. <sheetData>
  318. <row r="1" spans="1:2">
  319. <c r="A1" t="s">
  320. <v>0</v>
  321. </c>
  322. <c r="B1" t="s">
  323. <v>1</v>
  324. </c>
  325. </row>
  326. <row r="2" spans="1:2">
  327. <c r="A2" t="s">
  328. <v>2</v>
  329. </c>
  330. <c r="B2" t="s">
  331. <v>3</v>
  332. </c>
  333. </row>
  334. </sheetData>
  335. <pageMargins left="0.7" right="0.7"
  336. top="0.78740157499999996"
  337. bottom="0.78740157499999996"
  338. header="0.3"
  339. footer="0.3"/>
  340. </worksheet>`)
  341. worksheet := new(xlsxWorksheet)
  342. err := xml.NewDecoder(sheetxml).Decode(worksheet)
  343. c.Assert(err, IsNil)
  344. sst := new(xlsxSST)
  345. err = xml.NewDecoder(sharedstringsXML).Decode(sst)
  346. c.Assert(err, IsNil)
  347. file := new(File)
  348. file.referenceTable = MakeSharedStringRefTable(sst)
  349. rows, maxCols, maxRows := readRowsFromSheet(worksheet, file)
  350. c.Assert(maxRows, Equals, 2)
  351. c.Assert(maxCols, Equals, 2)
  352. row := rows[0]
  353. c.Assert(len(row.Cells), Equals, 2)
  354. cell1 := row.Cells[0]
  355. c.Assert(cell1.String(), Equals, "Foo")
  356. cell2 := row.Cells[1]
  357. c.Assert(cell2.String(), Equals, "Bar")
  358. }
  359. func (l *LibSuite) TestReadRowsFromSheetWithLeadingEmptyRows(c *C) {
  360. var sharedstringsXML = bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  361. <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="2" uniqueCount="2"><si><t>ABC</t></si><si><t>DEF</t></si></sst>`)
  362. var sheetxml = bytes.NewBufferString(`<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  363. <worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
  364. <dimension ref="A4:A5"/>
  365. <sheetViews>
  366. <sheetView tabSelected="1" workbookViewId="0">
  367. <selection activeCell="A2" sqref="A2"/>
  368. </sheetView>
  369. </sheetViews>
  370. <sheetFormatPr baseColWidth="10" defaultRowHeight="15" x14ac:dyDescent="0"/>
  371. <sheetData>
  372. <row r="4" spans="1:1">
  373. <c r="A4" t="s">
  374. <v>0</v>
  375. </c>
  376. </row>
  377. <row r="5" spans="1:1">
  378. <c r="A5" t="s">
  379. <v>1</v>
  380. </c>
  381. </row>
  382. </sheetData>
  383. <pageMargins left="0.75" right="0.75" top="1" bottom="1" header="0.5" footer="0.5"/>
  384. <pageSetup paperSize="9" orientation="portrait" horizontalDpi="4294967292" verticalDpi="4294967292"/>
  385. <extLst>
  386. <ext uri="{64002731-A6B0-56B0-2670-7721B7C09600}" xmlns:mx="http://schemas.microsoft.com/office/mac/excel/2008/main">
  387. <mx:PLV Mode="0" OnePage="0" WScale="0"/>
  388. </ext>
  389. </extLst>
  390. </worksheet>
  391. `)
  392. worksheet := new(xlsxWorksheet)
  393. err := xml.NewDecoder(sheetxml).Decode(worksheet)
  394. c.Assert(err, IsNil)
  395. sst := new(xlsxSST)
  396. err = xml.NewDecoder(sharedstringsXML).Decode(sst)
  397. c.Assert(err, IsNil)
  398. file := new(File)
  399. file.referenceTable = MakeSharedStringRefTable(sst)
  400. _, maxCols, maxRows := readRowsFromSheet(worksheet, file)
  401. c.Assert(maxRows, Equals, 2)
  402. c.Assert(maxCols, Equals, 1)
  403. }
  404. func (l *LibSuite) TestReadRowsFromSheetWithEmptyCells(c *C) {
  405. var sharedstringsXML = bytes.NewBufferString(`
  406. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  407. <sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="8" uniqueCount="5">
  408. <si>
  409. <t>Bob</t>
  410. </si>
  411. <si>
  412. <t>Alice</t>
  413. </si>
  414. <si>
  415. <t>Sue</t>
  416. </si>
  417. <si>
  418. <t>Yes</t>
  419. </si>
  420. <si>
  421. <t>No</t>
  422. </si>
  423. </sst>
  424. `)
  425. var sheetxml = bytes.NewBufferString(`
  426. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  427. <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"/>
  428. <sheetData>
  429. <row r="1" spans="1:3">
  430. <c r="A1" t="s">
  431. <v>
  432. 0
  433. </v>
  434. </c>
  435. <c r="B1" t="s">
  436. <v>
  437. 1
  438. </v>
  439. </c>
  440. <c r="C1" t="s">
  441. <v>
  442. 2
  443. </v>
  444. </c>
  445. </row>
  446. <row r="2" spans="1:3">
  447. <c r="A2" t="s">
  448. <v>
  449. 3
  450. </v>
  451. </c>
  452. <c r="B2" t="s">
  453. <v>
  454. 4
  455. </v>
  456. </c>
  457. <c r="C2" t="s">
  458. <v>
  459. 3
  460. </v>
  461. </c>
  462. </row>
  463. <row r="3" spans="1:3">
  464. <c r="A3" t="s">
  465. <v>
  466. 4
  467. </v>
  468. </c>
  469. <c r="C3" t="s">
  470. <v>
  471. 3
  472. </v>
  473. </c>
  474. </row>
  475. </sheetData>
  476. <pageMargins left="0.7" right="0.7" top="0.78740157499999996" bottom="0.78740157499999996" header="0.3" footer="0.3"/>
  477. </worksheet>
  478. `)
  479. worksheet := new(xlsxWorksheet)
  480. err := xml.NewDecoder(sheetxml).Decode(worksheet)
  481. c.Assert(err, IsNil)
  482. sst := new(xlsxSST)
  483. err = xml.NewDecoder(sharedstringsXML).Decode(sst)
  484. c.Assert(err, IsNil)
  485. file := new(File)
  486. file.referenceTable = MakeSharedStringRefTable(sst)
  487. rows, maxCols, maxRows := readRowsFromSheet(worksheet, file)
  488. c.Assert(maxRows, Equals, 3)
  489. c.Assert(maxCols, Equals, 3)
  490. row := rows[2]
  491. c.Assert(len(row.Cells), Equals, 3)
  492. cell1 := row.Cells[0]
  493. c.Assert(cell1.String(), Equals, "No")
  494. cell2 := row.Cells[1]
  495. c.Assert(cell2.String(), Equals,"")
  496. cell3 := row.Cells[2]
  497. c.Assert(cell3.String(), Equals, "Yes")
  498. }
  499. func (l *LibSuite) TestReadRowsFromSheetWithTrailingEmptyCells(c *C) {
  500. var row *Row
  501. var cell1, cell2, cell3, cell4 *Cell
  502. var sharedstringsXML = bytes.NewBufferString(`
  503. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  504. <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>`)
  505. var sheetxml = bytes.NewBufferString(`
  506. <?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  507. <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>
  508. `)
  509. worksheet := new(xlsxWorksheet)
  510. err := xml.NewDecoder(sheetxml).Decode(worksheet)
  511. c.Assert(err, IsNil)
  512. sst := new(xlsxSST)
  513. err = xml.NewDecoder(sharedstringsXML).Decode(sst)
  514. c.Assert(err, IsNil)
  515. file := new(File)
  516. file.referenceTable = MakeSharedStringRefTable(sst)
  517. rows, maxCol, maxRow := readRowsFromSheet(worksheet, file)
  518. c.Assert(maxCol, Equals, 4)
  519. c.Assert(maxRow, Equals, 8)
  520. row = rows[0]
  521. c.Assert(len(row.Cells), Equals, 4)
  522. cell1 = row.Cells[0]
  523. c.Assert(cell1.String(), Equals, "A")
  524. cell2 = row.Cells[1]
  525. c.Assert(cell2.String(), Equals, "B")
  526. cell3 = row.Cells[2]
  527. c.Assert(cell3.String(), Equals, "C")
  528. cell4 = row.Cells[3]
  529. c.Assert(cell4.String(), Equals, "D")
  530. row = rows[1]
  531. c.Assert(len(row.Cells), Equals, 4)
  532. cell1 = row.Cells[0]
  533. c.Assert(cell1.String(), Equals, "1")
  534. cell2 = row.Cells[1]
  535. c.Assert(cell2.String(), Equals, "")
  536. cell3 = row.Cells[2]
  537. c.Assert(cell3.String(), Equals, "")
  538. cell4 = row.Cells[3]
  539. c.Assert(cell4.String(), Equals, "")
  540. }