Golang中Xlsx默认将单元格格式设置为字符串数据类型的问题

Golang中Xlsx默认将单元格格式设置为字符串数据类型的问题 我是Go语言的新手。目前正在尝试将数据导出到Excel表格中。我使用tealeg的xlsx包来实现这个功能。我准备写入xlsx的行数据是多维字符串对象。然而,这些数据包含日期、浮点数和整数类型,我希望它们在Excel中能保持这些数据类型。以下是我的数据示例:

[
     "ESSEN",
     "2019-08-24 00:00:00",
     "0.9706181883811951"
   ],
   [
     "ESSEN",
     "2019-08-24 00:00:00",
     "0.9706181883811951"
   ],
   [
     "ESSEN",
     "2019-08-24 00:00:00",
     "0.9706181883811951"
   ]

以下是代码实现:

// Create header row and insert values strings as bold string.
headerRow := sheet.AddRow()
headerStyle := xlsx.NewStyle()
headerStyle.Font.Bold = true
for _, val := range headers {
	cell := headerRow.AddCell()
	cell.SetValue(val)
	cell.SetStyle(headerStyle)
}

// Put remaining row values.
for _, rowData := range rows {
	row := sheet.AddRow()
	for _, val := range rowData {
		cell := row.AddCell()
		cell.SetValue(val)
	}
}

将这些数据导出到Excel后,我发现这些数据类型都被存储为字符串,而不是日期、浮点数或整数。有没有什么方法可以解决这个问题?


更多关于Golang中Xlsx默认将单元格格式设置为字符串数据类型的问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

1 回复

更多关于Golang中Xlsx默认将单元格格式设置为字符串数据类型的问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


在tealeg/xlsx包中,单元格默认确实会被设置为字符串格式。要保留原始数据类型,您需要显式设置单元格的格式。以下是解决方案:

package main

import (
    "github.com/tealeg/xlsx"
    "time"
    "strconv"
)

func main() {
    file := xlsx.NewFile()
    sheet, err := file.AddSheet("Sheet1")
    if err != nil {
        panic(err)
    }

    // 创建表头
    headers := []string{"City", "Date", "Value"}
    headerRow := sheet.AddRow()
    headerStyle := xlsx.NewStyle()
    headerStyle.Font.Bold = true
    
    for _, val := range headers {
        cell := headerRow.AddCell()
        cell.SetValue(val)
        cell.SetStyle(headerStyle)
    }

    // 示例数据
    rows := [][]string{
        {"ESSEN", "2019-08-24 00:00:00", "0.9706181883811951"},
        {"ESSEN", "2019-08-24 00:00:00", "0.9706181883811951"},
        {"ESSEN", "2019-08-24 00:00:00", "0.9706181883811951"},
    }

    // 处理数据行
    for _, rowData := range rows {
        row := sheet.AddRow()
        
        // 第一列:字符串(保持不变)
        cell1 := row.AddCell()
        cell1.SetString(rowData[0])
        
        // 第二列:日期
        cell2 := row.AddCell()
        date, err := time.Parse("2006-01-02 15:04:05", rowData[1])
        if err == nil {
            cell2.SetDate(date)
            // 设置日期格式
            dateStyle := xlsx.NewStyle()
            dateStyle.Format = "yyyy-mm-dd hh:mm:ss"
            cell2.SetStyle(dateStyle)
        } else {
            cell2.SetString(rowData[1])
        }
        
        // 第三列:浮点数
        cell3 := row.AddCell()
        floatVal, err := strconv.ParseFloat(rowData[2], 64)
        if err == nil {
            cell3.SetFloat(floatVal)
            // 设置数字格式
            numStyle := xlsx.NewStyle()
            numStyle.Format = "0.##########"
            cell3.SetStyle(numStyle)
        } else {
            cell3.SetString(rowData[2])
        }
    }

    err = file.Save("output.xlsx")
    if err != nil {
        panic(err)
    }
}

对于更通用的解决方案,您可以创建一个辅助函数来处理不同类型的数据:

func setCellWithType(cell *xlsx.Cell, value string) {
    // 尝试解析为日期
    if date, err := time.Parse("2006-01-02 15:04:05", value); err == nil {
        cell.SetDate(date)
        dateStyle := xlsx.NewStyle()
        dateStyle.Format = "yyyy-mm-dd hh:mm:ss"
        cell.SetStyle(dateStyle)
        return
    }
    
    // 尝试解析为整数
    if intVal, err := strconv.ParseInt(value, 10, 64); err == nil {
        cell.SetInt64(intVal)
        return
    }
    
    // 尝试解析为浮点数
    if floatVal, err := strconv.ParseFloat(value, 64); err == nil {
        cell.SetFloat(floatVal)
        numStyle := xlsx.NewStyle()
        numStyle.Format = "0.##########"
        cell.SetStyle(numStyle)
        return
    }
    
    // 默认为字符串
    cell.SetString(value)
}

// 在循环中使用:
for _, rowData := range rows {
    row := sheet.AddRow()
    for _, val := range rowData {
        cell := row.AddCell()
        setCellWithType(cell, val)
    }
}

关键点:

  • 使用SetDate()SetFloat()SetInt64()等特定类型的方法而不是通用的SetValue()
  • 通过xlsx.NewStyle()创建样式并设置格式字符串
  • 日期格式使用Excel的格式字符串,如"yyyy-mm-dd hh:mm:ss"
  • 数字格式使用"0.##########"来保留小数位数

这样导出的Excel文件将正确显示日期、数字等数据类型,而不是全部作为字符串处理。

回到顶部