lib.go 1.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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 Sheet struct {
  15. }
  16. type File struct {
  17. Sheets []*Sheet
  18. }
  19. type FileInterface interface {
  20. GetSheet(sheetname string) Sheet
  21. }
  22. func MakeSharedStringRefTable(source *XLSXSST) []string {
  23. reftable := make([]string, len(source.SI))
  24. for i, si := range source.SI {
  25. reftable[i] = si.T.Data
  26. }
  27. return reftable
  28. }
  29. func ResolveSharedString(reftable []string, index int) string {
  30. return reftable[index]
  31. }
  32. func readSheetsFromZipFile(f *zip.File) ([]*Sheet, os.Error) {
  33. var workbook *XLSXWorkbook
  34. var error os.Error
  35. var rc io.ReadCloser
  36. workbook = new(XLSXWorkbook)
  37. rc, error = f.Open()
  38. if error != nil {
  39. return nil, error
  40. }
  41. error = xml.Unmarshal(rc, workbook)
  42. if error != nil {
  43. return nil, error
  44. }
  45. sheets := make([]*Sheet, len(workbook.Sheets.Sheet))
  46. for i, _ := range workbook.Sheets.Sheet {
  47. sheet := new(Sheet)
  48. sheets[i] = sheet
  49. }
  50. return sheets, nil
  51. }
  52. func OpenFile(filename string) (x *File, e os.Error) {
  53. var f *zip.ReadCloser
  54. var error os.Error
  55. var xlsxFile *File
  56. var v *zip.File
  57. f, error = zip.OpenReader(filename)
  58. if error != nil {
  59. return nil, error
  60. }
  61. xlsxFile = new(File)
  62. for _, v = range f.File {
  63. if v.Name == "xl/workbook.xml" {
  64. sheets, error := readSheetsFromZipFile(v)
  65. if error != nil {
  66. return nil, error
  67. }
  68. if sheets == nil {
  69. error := new(XLSXReaderError)
  70. error.Error = "No sheets found in XLSX File"
  71. return nil, error
  72. }
  73. xlsxFile.Sheets = sheets
  74. }
  75. }
  76. f.Close()
  77. return xlsxFile, nil
  78. }