lib.go 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  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 readSheetsFromZipFile(f *zip.File) ([]*Sheet, os.Error) {
  23. var workbook *XLSXWorkbook
  24. var error os.Error
  25. var rc io.ReadCloser
  26. workbook = new(XLSXWorkbook)
  27. rc, error = f.Open()
  28. if error != nil {
  29. return nil, error
  30. }
  31. error = xml.Unmarshal(rc, workbook)
  32. if error != nil {
  33. return nil, error
  34. }
  35. sheets := make([]*Sheet, len(workbook.Sheets.Sheet))
  36. for i, _ := range workbook.Sheets.Sheet {
  37. sheet := new(Sheet)
  38. sheets[i] = sheet
  39. }
  40. return sheets, nil
  41. }
  42. func OpenFile(filename string) (x *File, e os.Error) {
  43. var f *zip.ReadCloser
  44. var error os.Error
  45. var xlsxFile *File
  46. var v *zip.File
  47. f, error = zip.OpenReader(filename)
  48. if error != nil {
  49. return nil, error
  50. }
  51. xlsxFile = new(File)
  52. for _, v = range f.File {
  53. if v.Name == "xl/workbook.xml" {
  54. sheets, error := readSheetsFromZipFile(v)
  55. if error != nil {
  56. return nil, error
  57. }
  58. if sheets == nil {
  59. error := new(XLSXReaderError)
  60. error.Error = "No sheets found in XLSX File"
  61. return nil, error
  62. }
  63. xlsxFile.Sheets = sheets
  64. }
  65. }
  66. f.Close()
  67. return xlsxFile, nil
  68. }