stream_server.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package main
  2. import (
  3. . "github.com/damianszkuat/xlsx"
  4. "io"
  5. "net/http"
  6. "strconv"
  7. "math/rand"
  8. )
  9. func StreamFileWithDate(w http.ResponseWriter, r *http.Request) {
  10. w.Header().Add("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  11. sheetNames, workbookData := generateExcelFile(1, 1000000, 10)
  12. writeStreamFileWithStyle(w, sheetNames, workbookData, []StreamStyle{})
  13. }
  14. // writeStreamFile will write the file using this stream package
  15. func writeStreamFileWithStyle(fileBuffer io.Writer, sheetNames []string,
  16. workbookData [][][]StreamCell, customStyles []StreamStyle) error {
  17. var file *StreamFileBuilder
  18. var err error
  19. file = NewStreamFileBuilder(fileBuffer)
  20. defaultStyles := []StreamStyle{StreamStyleDefaultString, StreamStyleBoldString, StreamStyleItalicString, StreamStyleUnderlinedString,
  21. StreamStyleDefaultInteger, StreamStyleBoldInteger, StreamStyleItalicInteger, StreamStyleUnderlinedInteger,
  22. StreamStyleDefaultDate}
  23. allStylesToBeAdded := append(defaultStyles, customStyles...)
  24. err = file.AddStreamStyleList(allStylesToBeAdded)
  25. if err != nil {
  26. return err
  27. }
  28. for i, sheetName := range sheetNames {
  29. var colStyles []StreamStyle
  30. for range workbookData[i][0] {
  31. colStyles = append(colStyles, StreamStyleDefaultString)
  32. }
  33. err := file.AddSheetS(sheetName, colStyles)
  34. if err != nil {
  35. return err
  36. }
  37. }
  38. streamFile, err := file.Build()
  39. if err != nil {
  40. return err
  41. }
  42. for i, sheetData := range workbookData {
  43. if i != 0 {
  44. err = streamFile.NextSheet()
  45. if err != nil {
  46. return err
  47. }
  48. }
  49. for _, row := range sheetData {
  50. err = streamFile.WriteS(row)
  51. if err != nil {
  52. return err
  53. }
  54. }
  55. }
  56. err = streamFile.Close()
  57. if err != nil {
  58. return err
  59. }
  60. return nil
  61. }
  62. func generateExcelFile(numOfSheets int, numOfRows int, numOfCols int) ([]string, [][][]StreamCell) {
  63. var sheetNames []string
  64. var workbookData [][][]StreamCell
  65. for i := 0; i<numOfSheets; i++{
  66. sheetNames = append(sheetNames, strconv.Itoa(i))
  67. workbookData = append(workbookData, [][]StreamCell{})
  68. for j := 0; j<numOfRows; j++ {
  69. workbookData[i] = append(workbookData[i], []StreamCell{})
  70. for k := 0; k<numOfCols; k++ {
  71. var style StreamStyle
  72. if k%2==0 {
  73. style = StreamStyleDefaultInteger
  74. } else if k%3 == 0 {
  75. style = StreamStyleBoldInteger
  76. } else if k%5 == 0 {
  77. style = StreamStyleItalicInteger
  78. } else {
  79. style = StreamStyleUnderlinedInteger
  80. }
  81. workbookData[i][j] = append(workbookData[i][j], NewStyledIntegerStreamCell(rand.Intn(100),style))
  82. }
  83. }
  84. }
  85. return sheetNames, workbookData
  86. }
  87. func main() {
  88. http.HandleFunc("/", StreamFileWithDate)
  89. if err := http.ListenAndServe(":8080", nil); err != nil {
  90. panic(err)
  91. }
  92. }