package iot_excelize import ( "bytes" "context" "fmt" "io" "net/http" "net/url" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/net/ghttp" "github.com/xuri/excelize/v2" ) // WriteHTTP writes an Excel workbook as an attachment to the current HTTP response. func WriteHTTP(ctx context.Context, f *excelize.File, fileName string) (err error) { r := ghttp.RequestFromCtx(ctx) if r == nil { return gerror.New("当前上下文不是HTTP请求") } if fileName == "" { fileName = "export" } writer := r.Response.Writer writer.Header().Set("Content-Type", "application/octet-stream") writer.Header().Set("Content-Disposition", fmt.Sprintf("attachment; filename=%s.xlsx", url.QueryEscape(fileName))) writer.Header().Set("Content-Transfer-Encoding", "binary") writer.Header().Set("Access-Control-Expose-Headers", "Content-Disposition") if err = f.Write(writer); err != nil { return err } r.Response.Status = http.StatusOK writer.Flush() return nil } // ToReadSeeker serializes an Excel workbook into memory for secondary handling. func ToReadSeeker(f *excelize.File) (io.ReadSeeker, error) { var buffer bytes.Buffer if err := f.Write(&buffer); err != nil { return nil, err } return bytes.NewReader(buffer.Bytes()), nil }