file.go 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  1. package excelize
  2. import (
  3. "archive/zip"
  4. "bytes"
  5. "encoding/xml"
  6. "fmt"
  7. "io"
  8. "os"
  9. )
  10. // CreateFile provides function to create new file by default template. For
  11. // example:
  12. //
  13. // xlsx := CreateFile()
  14. //
  15. func CreateFile() *File {
  16. file := make(map[string]string)
  17. file["_rels/.rels"] = templateRels
  18. file["docProps/app.xml"] = templateDocpropsApp
  19. file["docProps/core.xml"] = templateDocpropsCore
  20. file["xl/_rels/workbook.xml.rels"] = templateWorkbookRels
  21. file["xl/theme/theme1.xml"] = templateTheme
  22. file["xl/worksheets/sheet1.xml"] = templateSheet
  23. file["xl/styles.xml"] = templateStyles
  24. file["xl/workbook.xml"] = templateWorkbook
  25. file["[Content_Types].xml"] = templateContentTypes
  26. return &File{
  27. XLSX: file,
  28. Sheet: make(map[string]*xlsxWorksheet),
  29. }
  30. }
  31. // Save provides function to override the xlsx file with origin path.
  32. func (f *File) Save() error {
  33. if f.Path == "" {
  34. return fmt.Errorf("No path defined for file, consider File.WriteTo or File.Write")
  35. }
  36. return f.WriteTo(f.Path)
  37. }
  38. // WriteTo provides function to create or update to an xlsx file at the provided
  39. // path.
  40. func (f *File) WriteTo(name string) error {
  41. file, err := os.OpenFile(name, os.O_WRONLY|os.O_TRUNC|os.O_CREATE, 0666)
  42. if err != nil {
  43. return err
  44. }
  45. defer file.Close()
  46. return f.Write(file)
  47. }
  48. // Write provides function to write to an io.Writer.
  49. func (f *File) Write(w io.Writer) error {
  50. buf := new(bytes.Buffer)
  51. zw := zip.NewWriter(buf)
  52. for path, sheet := range f.Sheet {
  53. if sheet == nil {
  54. continue
  55. }
  56. output, err := xml.Marshal(sheet)
  57. if err != nil {
  58. return err
  59. }
  60. f.saveFileList(path, replaceWorkSheetsRelationshipsNameSpace(string(output)))
  61. }
  62. for path, content := range f.XLSX {
  63. fi, err := zw.Create(path)
  64. if err != nil {
  65. return err
  66. }
  67. _, err = fi.Write([]byte(content))
  68. if err != nil {
  69. return err
  70. }
  71. }
  72. err := zw.Close()
  73. if err != nil {
  74. return err
  75. }
  76. if _, err := buf.WriteTo(w); err != nil {
  77. return err
  78. }
  79. return nil
  80. }