showliuzp 2025-10-11 11:38 采纳率: 84.3%
浏览 2

golang导出execl panic


controller:
//财务管理-业务员待发工资-导出
func BusinessSalaryExport(r *http.Request) (resp interface{},err error){
    var req = new(iapi.BusinessSalaryListReq)
    if resp,err = ParseReq(r,&req,"财务管理-业务员待发工资-导出,前端参数错误",log_tag_user_streamer);err != nil{
        return
    }

    w := r.Context().Value("responseWriter").(http.ResponseWriter)
    finance_obj.BusinessSalaryExport(w,req,(*r).Header.Get(types.HEADER_AUTH))

    return nil,nil
}

BusinessSalaryExport定义:
func (f *Finance) BusinessSalaryExport(w http.ResponseWriter,req *iapi.BusinessSalaryListReq,authorization string){
    funs_log_tag := "财务管理-业务员待发工资导出"

    var err error
    //fmt.Printf("header头:%+v\n",*r)
    if err = f.get_token_detail(&authorization);err != nil{
        fmt.Printf("错误:%+v\n",err)
        return
    }

    (*req).PageSize = 1000
    list,_,err := dao.BusinessSalaryList(f.TokenDetail.GuildId,req)
    if err != nil{
        logx.Error(fmt.Sprintf("tags:%+v,%+v,数据库异常,req:%+v,err:%+v", f.LogTag,req,funs_log_tag,err))
        return
    }
    fmt.Printf("list:%+v\n",list)


    fs := excelize.NewFile()
    defer fs.Close()

    // 创建工作表并设置表头
    index, err := fs.NewSheet("业务员工资")
    if err != nil {
        fmt.Println(err)
        http.Error(w, "创建Excel失败", http.StatusInternalServerError)
        return
    }
    
    fs.SetActiveSheet(index)


    // 设置表头
    headers := []string{"姓名", "工号", "部门", "基本工资", "绩效工资", "应发工资", "状态"}
    for i, header := range headers {
        cell, _ := excelize.CoordinatesToCellName(i+1, 1)
        fs.SetCellValue("业务员工资", cell, header)
    }


    // 填充数据(根据您的数据结构调整)
    for i, _ := range list {
        row := i + 2 // 从第2行开始,第1行是表头
        // 示例数据填充,根据您的实际数据结构调整
        fs.SetCellValue("业务员工资", fmt.Sprintf("A%d", row), "aaa")
        fs.SetCellValue("业务员工资", fmt.Sprintf("B%d", row), "bbb")
        // ... 继续设置其他单元格
    }

    // 设置响应头,触发文件下载
    w.Header().Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
    w.Header().Set("Content-Disposition", "attachment; filename=business_salary.xlsx")
    w.Header().Set("Content-Transfer-Encoding", "binary")
    w.Header().Set("Cache-Control", "no-cache")


    // 将Excel文件写入HTTP响应
    if err := fs.Write(w); err != nil {
        fmt.Printf("写入Excel到响应失败: %+v\n", err)
        http.Error(w, "导出失败", http.StatusInternalServerError)
        return
    }
    return
}

报错:
2025/10/11 11:37:24 http: panic serving 127.0.0.1:34246: interface conversion: interface is nil, not http.ResponseWriter
goroutine 54 [running]:
net/http.(*conn).serve.func1()
        /usr/local/go/src/net/http/server.go:1943 +0xd3
panic({0x167a860?, 0xc00028a780?})
        /usr/local/go/src/runtime/panic.go:783 +0x132
x_dream_guild/controller.BusinessSalaryExport(0xc000443900)
        /home/liuzhenpeng/project/x_dream_guild/controller/finance.go:38 +0x188
x_dream_guild/controller.Router.WrapResponse.func49({0x1b18dd0, 0xc0004605a0}, 0xc000443900)
        /home/liuzhenpeng/project/x_dream_guild/response/response.go:39 +0x39
net/http.HandlerFunc.ServeHTTP(0xc00028a660?, {0x1b18dd0?, 0xc0004605a0?}, 0x18c1abc?)
        /usr/local/go/src/net/http/server.go:2322 +0x29
  • 写回答

5条回答 默认 最新

  • 阿里嘎多学长 2025-10-11 11:38
    关注

    阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程

    问题分析

    你遇到的问题是使用Golang编写的HTTP控制器中,导出Excel文件时发生panic。

    解决方案

    可能的原因包括:

    1. Excel导出包: 使用的Excel导出包可能有问题,尝试切换到其他包,如github.com/360EntSecGroup-Skylar/excel
    2. 文件路径: 检查文件路径是否正确,确保导出文件的路径存在且可写。
    3. 数据类型: 检查导出数据的类型是否正确,确保数据类型与Excel导出包要求的类型匹配。
    4. panic捕获: 使用defer语句捕获panic,获取panic的错误信息,以便于调试。

    核心代码

    package main
    
    import (
    	"github.com/360EntSecGroup-Skylar/excel"
    	"log"
    )
    
    func BusinessSalaryExport(r *http.Request) (resp interface{}, err error) {
    	// ...
    	defer func() {
    		if r := recover(); r != nil {
    			log.Println("panic:", r)
    		}
    	}()
    
    	// 使用excel包导出Excel文件
    	err = excel.NewExcel("业务员待发工资").SetSheetName("Sheet1").SetHeader([]string{"列1", "列2"}).SetRows([][]string{{"值1", "值2"}}).Export("output.xlsx")
    	if err != nil {
    		return nil, err
    	}
    
    	return resp, nil
    }
    

    注意: 上述代码仅提供了一个示例,具体的解决方案可能需要根据实际情况进行调整。

    评论

报告相同问题?

问题事件

  • 创建了问题 10月11日