如何让Excel下载时默认选中.xlsx扩展名而非‘所有文件’?
解决Gin中Excel文件下载默认扩展名问题
问题描述
我有一个用于下载示例Excel文件的Gin处理器,目前下载时默认选中「所有文件」扩展名,希望无需手动指定即可默认下载.xlsx格式文件。现有处理器代码如下:
func (glh *GlobalHandler) getSampleFile_ExcelDbPopulation_of_CountriesStatesCitiesAreas(c *gin.Context) { // Define the sample Excel file data with all columns // '*' means columns are mandatory sampleData := [][]string{ {"S No.", "*Country", "*State", "*City", "*Area", "*Pincode"}, {"1", "CountryA", "StateA", "CityA", "AreaA", "123456"}, } // Create a new Excel file file := excelize.NewFile() // Set sheet name to "Sheet1" sheetName := "Sheet1" // Add rows to the sheet for rowIndex, row := range sampleData { for columnIndex, value := range row { // Convert the column index to column name (e.g., 0 -> "A", 1 -> "B", etc.) columnName, _ := excelize.ColumnNumberToName(columnIndex + 1) cell := columnName + strconv.Itoa(rowIndex+1) // Merge cells for the note row if rowIndex == len(sampleData)-1 { err := file.MergeCell(sheetName, "A6", "D6") if err != nil { gb_utils.LogError(glh.logger, "Error in getSampleFile_ExcelDbPopulation_of_CountriesStatesCitiesAreas: merging cells", err.Error(), 0, nil) c.JSON(http.StatusInternalServerError, &gb_utils.GenericResponse{Message: gb_utils.ErrMsgOperationFailed("Sample File Download")}) return } // set the note file.SetCellValue(sheetName, "A6", "Note: * fields are mandatory") } file.SetCellValue(sheetName, cell, value) } } // Generate the Excel file contents buffer := new(bytes.Buffer) if err := file.Write(buffer); err != nil { gb_utils.LogError(glh.logger, "Error in getSampleFile_ExcelDbPopulation_of_CountriesStatesCitiesAreas: writing Excel file", err.Error(), 0, nil) c.JSON(http.StatusInternalServerError, &gb_utils.GenericResponse{Message: gb_utils.ErrMsgOperationFailed("Sample File Download")}) return } // Set the appropriate headers for Excel file download downloadName := "SamplePopulationData.xlsx" c.Header("Content-Description", "File Transfer") c.Header("Content-Disposition", "attachment; filename="+downloadName) // Write the Excel file to the response c.Data(http.StatusOK, "application/octet-stream", buffer.Bytes()) }
解决步骤
只需修改响应头的两处设置即可实现默认.xlsx格式下载:
替换Content-Type为xlsx标准MIME类型
将application/octet-stream替换为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,这是.xlsx文件的官方MIME类型,浏览器能直接识别为Excel文件。规范Content-Disposition的文件名格式
给文件名添加双引号,避免特殊字符导致的解析异常,格式调整为attachment; filename="SamplePopulationData.xlsx"。
修改后的响应头设置代码片段:
// Set the appropriate headers for Excel file download downloadName := "SamplePopulationData.xlsx" c.Header("Content-Description", "File Transfer") c.Header("Content-Disposition", "attachment; filename=\""+downloadName+"\"") // 添加双引号 // Write the Excel file to the response c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", buffer.Bytes()) // 修改MIME类型
修改后的完整处理器代码
func (glh *GlobalHandler) getSampleFile_ExcelDbPopulation_of_CountriesStatesCitiesAreas(c *gin.Context) { // Define the sample Excel file data with all columns // '*' means columns are mandatory sampleData := [][]string{ {"S No.", "*Country", "*State", "*City", "*Area", "*Pincode"}, {"1", "CountryA", "StateA", "CityA", "AreaA", "123456"}, } // Create a new Excel file file := excelize.NewFile() // Set sheet name to "Sheet1" sheetName := "Sheet1" // Add rows to the sheet for rowIndex, row := range sampleData { for columnIndex, value := range row { // Convert the column index to column name (e.g., 0 -> "A", 1 -> "B", etc.) columnName, _ := excelize.ColumnNumberToName(columnIndex + 1) cell := columnName + strconv.Itoa(rowIndex+1) // Merge cells for the note row if rowIndex == len(sampleData)-1 { err := file.MergeCell(sheetName, "A6", "D6") if err != nil { gb_utils.LogError(glh.logger, "Error in getSampleFile_ExcelDbPopulation_of_CountriesStatesCitiesAreas: merging cells", err.Error(), 0, nil) c.JSON(http.StatusInternalServerError, &gb_utils.GenericResponse{Message: gb_utils.ErrMsgOperationFailed("Sample File Download")}) return } // set the note file.SetCellValue(sheetName, "A6", "Note: * fields are mandatory") } file.SetCellValue(sheetName, cell, value) } } // Generate the Excel file contents buffer := new(bytes.Buffer) if err := file.Write(buffer); err != nil { gb_utils.LogError(glh.logger, "Error in getSampleFile_ExcelDbPopulation_of_CountriesStatesCitiesAreas: writing Excel file", err.Error(), 0, nil) c.JSON(http.StatusInternalServerError, &gb_utils.GenericResponse{Message: gb_utils.ErrMsgOperationFailed("Sample File Download")}) return } // Set the appropriate headers for Excel file download downloadName := "SamplePopulationData.xlsx" c.Header("Content-Description", "File Transfer") c.Header("Content-Disposition", "attachment; filename=\""+downloadName+"\"") // Write the Excel file to the response c.Data(http.StatusOK, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", buffer.Bytes()) }
内容的提问来源于stack exchange,提问作者prag-sri
相关产品推荐
相关产品推荐

