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
golang导出execl panic
- 写回答
- 好问题 0 提建议
- 关注问题
- 邀请回答
-
5条回答 默认 最新
阿里嘎多学长 2025-10-11 11:38关注阿里嘎多学长整理AIGC生成,因移动端显示问题导致当前答案未能完全显示,请使用PC端查看更加详细的解答过程
问题分析
你遇到的问题是使用Golang编写的HTTP控制器中,导出Excel文件时发生panic。
解决方案
可能的原因包括:
- Excel导出包: 使用的Excel导出包可能有问题,尝试切换到其他包,如
github.com/360EntSecGroup-Skylar/excel。 - 文件路径: 检查文件路径是否正确,确保导出文件的路径存在且可写。
- 数据类型: 检查导出数据的类型是否正确,确保数据类型与Excel导出包要求的类型匹配。
- 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 }注意: 上述代码仅提供了一个示例,具体的解决方案可能需要根据实际情况进行调整。
解决 无用评论 打赏 举报- Excel导出包: 使用的Excel导出包可能有问题,尝试切换到其他包,如