golang excelize 如何复制单元格及其格式

我github.com/xuri/excelize/v2用来处理excel文件。


我将许多 excel 文件中的许多表附加到一张 excel 中的一张表中。


下面是示例代码。


    var mergedRows [][]string

    for _, f := range files {

        excelPath := folder + "/" + f.Name()

        rows := loadXlsx(excelPath, sheetName)

        for _, row := range rows[rowOffset:] {

            mergedRows = append(mergedRows, row)

        }

    }


    saveXlsx(aggregatedFilePath, sheetName, mergedRows, rowOffset)



...


func loadXlsx(xlsxPath string, sheetName string) [][]string {


    f, err := excelize.OpenFile(xlsxPath)

    if err != nil {

        log.Fatal(err)

    }


    defer func() {

        if err := f.Close(); err != nil{

            fmt.Println(err)

        }

    }()


    rows, err := f.GetRows(sheetName)

    if err != nil {

        log.Fatal(err)

    }


    return rows

}


func saveXlsx(path string, sheetName string, rows [][]string, rowOffset int) {


    f, err := excelize.OpenFile(path)

    if err != nil {

        log.Fatal(err)

    }


    defer func() {

        if err := f.Close(); err != nil{

            fmt.Println(err)

        }

    }()



    index := f.GetSheetIndex(sheetName)

    offset := 1

    sequence := 1

    for _, row := range rows{

        row[0] = strconv.Itoa(sequence)

        sequence = sequence + 1

        offset = offset + 1

        axis := "A" + strconv.Itoa(offset)

        f.SetSheetRow(sheetName, axis, &row)

    }


    for index, _ := range rows[0] {

        axis, _ := excelize.CoordinatesToCellName(index, 2)

        column, _ := excelize.ColumnNumberToName(index)

        styleId, _ := f.GetCellStyle(sheetName, axis)

        cellType, _ := f.GetCellType(sheetName, axis)

        fmt.Println(styleId)

        fmt.Println(cellType)

        f.SetColStyle(sheetName, column, styleId)

    }



    f.SetActiveSheet(index)

    if err := f.Save(); err != nil {

        fmt.Println(err)

    }


}

这有效,除了一些数据格式问题。数字的样式被复制,但不起作用;日期已复制,但值错误。


在源文件中,有一些数字采用 2 位小数格式并显示为70.12,而在输出文件中格式相同但显示为70.119。


在源文件中,有一些 Y/m/d 格式的日期显示为2022/1/12,而在输出文件中格式相同但显示为01-12-22.


天涯尽头无女友
浏览 433回答 1
1回答

当年话下

从手册func (f *File) GetRows(sheet string, opts ...Options) ([][]string, error)如果单元格格式可以应用于单元格的值,将使用应用的值,否则将使用原始值。所以在我的问题中,rows, err := f.GetRows(sheetName)将复制带有格式的日期和数字值,而不是原始数字。格式化值可能会转换为非等值。解决方案只是使用RawCellValue选项读取原始值true,rows, err := f.GetRows(sheetName, excelize.Options{RawCellValue:true})如果格式发生变化,只需将原始文件的样式应用到新文件即可。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go