lib.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. package xlsx
  2. import (
  3. "archive/zip"
  4. "io"
  5. "os"
  6. "xml"
  7. )
  8. type XLSXReaderError struct {
  9. Error string
  10. }
  11. func (e *XLSXReaderError) String() string {
  12. return e.Error
  13. }
  14. type XLSXV struct {
  15. Data string "chardata"
  16. }
  17. type XLSXC struct {
  18. R string "attr"
  19. T string "attr"
  20. V XLSXV
  21. }
  22. type XLSXRow struct {
  23. R string "attr"
  24. Spans string "attr"
  25. C []XLSXC
  26. }
  27. type XLSXSheetData struct {
  28. Row []XLSXRow
  29. }
  30. type XLSXSheetFormatPr struct {
  31. BaseColWidth string "attr"
  32. DefaultRowHeight string "attr"
  33. }
  34. type XLSXSelection struct {
  35. ActiveCell string "attr"
  36. SQRef string "attr"
  37. }
  38. type XLSXSheetView struct {
  39. TabSelected string "attr"
  40. WorkbookViewID string "attr"
  41. Selection XLSXSelection
  42. }
  43. type XLSXSheetViews struct {
  44. SheetView []XLSXSheetView
  45. }
  46. type XLSXDimension struct {
  47. Ref string "attr"
  48. }
  49. type XLSXWorksheet struct {
  50. Dimension XLSXDimension
  51. SheetViews XLSXSheetViews
  52. SheetFormatPr XLSXSheetFormatPr
  53. SheetData XLSXSheetData
  54. }
  55. type XLSXT struct {
  56. Data string "chardata"
  57. }
  58. type XLSXSI struct {
  59. T XLSXT
  60. }
  61. type XLSXSST struct {
  62. Count string "attr"
  63. UniqueCount string "attr"
  64. SI []XLSXSI
  65. }
  66. type XLSXSheetStruct struct {
  67. }
  68. type XLSXFile struct {
  69. Sheets []*XLSXSheetStruct
  70. }
  71. type XLSXFileInterface interface {
  72. GetSheet(sheetname string) XLSXSheetStruct
  73. }
  74. func MakeSharedStringRefTable(source *XLSXSST) []string {
  75. reftable := make([]string, len(source.SI))
  76. for i, si := range source.SI {
  77. reftable[i] = si.T.Data
  78. }
  79. return reftable
  80. }
  81. func ResolveSharedString(reftable []string, index int) string {
  82. return reftable[index]
  83. }
  84. func readSheetsFromZipFile(f *zip.File) ([]*XLSXSheetStruct, os.Error) {
  85. var workbook *XLSXWorkbook
  86. var error os.Error
  87. var rc io.ReadCloser
  88. workbook = new(XLSXWorkbook)
  89. rc, error = f.Open()
  90. if error != nil {
  91. return nil, error
  92. }
  93. error = xml.Unmarshal(rc, workbook)
  94. if error != nil {
  95. return nil, error
  96. }
  97. sheets := make([]*XLSXSheetStruct, len(workbook.Sheets.Sheet))
  98. for i, _ := range workbook.Sheets.Sheet {
  99. sheet := new(XLSXSheetStruct)
  100. sheets[i] = sheet
  101. }
  102. return sheets, nil
  103. }
  104. func OpenXLSXFile(filename string) (x *XLSXFile, e os.Error) {
  105. var f *zip.ReadCloser
  106. var error os.Error
  107. var xlsxFile *XLSXFile
  108. var v *zip.File
  109. f, error = zip.OpenReader(filename)
  110. if error != nil {
  111. return nil, error
  112. }
  113. xlsxFile = new(XLSXFile)
  114. for _, v = range f.File {
  115. if v.Name == "xl/workbook.xml" {
  116. sheets, error := readSheetsFromZipFile(v)
  117. if error != nil {
  118. return nil, error
  119. }
  120. if sheets == nil {
  121. error := new(XLSXReaderError)
  122. error.Error = "No sheets found in XLSX File"
  123. return nil, error
  124. }
  125. xlsxFile.Sheets = sheets
  126. }
  127. }
  128. f.Close()
  129. return xlsxFile, nil
  130. }