Scott

xls vs xlsx a year ago

go
excel
3996个字符
共有194人围观

xls是什么文件格式?

  • 1.xls其实就是Microsoft Excel工作表,属于一种经常使用的电子表格文件格式。作为Excel 2003及以前版本生成的文件格式,是一个特有的二进制格式,而它的核心结构是复合文档类型的结构。
  • 2.xls文件通常可以使用Microsoft Excel打开,另外微软为那些没有安装Excel的用户开发了专门的查看器Excel Viewer。使用金山WPS也可以打开、操作xls文件。
  • 3.使用Microsoft Excel可以将xls格式的表格转换为多种格式:XML表格、XML数据、网页、使用制表符分割的文本文件(.txt)、使用逗号分隔的文本文件(.csv)等。

xlsx和xls有什么区别?

  • 1.文件格式不同:xls是一个特有的二进制格式,其核心结构是复合文档类型的结构,而xlsx的核心结构是XML类型的结构,采用的是基于 XML 的压缩方式,使其占用的空间更小。xlsx 中最后一个 x 的意义就在于此。
  • 2.版本不同:xls是excel2003及以前版本生成的文件格式,而xlsx是excel2007及以后版本生成的文件格式。
  • 3.兼容性不同:xlsx格式是向下兼容的,可兼容xls格式。

golang如何读写xls

xls文件比较特殊,是一种很古老excel表格格式

不同于xlsx xlsm,很多开源库都不支持xls, 比如说 excelize 就有如下明确说明:

所以要读写xls需要特殊的库

方案1-shakinm/xlsReader

package main

import (
	"fmt"
	"github.com/shakinm/xlsReader/xls"
	"log"
)

func main() {

	workbook, err := xls.OpenFile("small_1_sheet.xls")

	if err!=nil {
		log.Panic(err.Error())
	}

	// Кол-во листов в книге
	// Number of sheets in the workbook
	//
	// for i := 0; i <= workbook.GetNumberSheets()-1; i++ {}

	fmt.Println(workbook.GetNumberSheets())

	sheet, err := workbook.GetSheet(0)

	if err!=nil {
		log.Panic(err.Error())
	}

	// Имя листа
	// Print sheet name
	println(sheet.GetName())

	// Вывести кол-во строк в листе
	// Print the number of rows in the sheet
	println(sheet.GetNumberRows())

	for i := 0; i <= sheet.GetNumberRows(); i++ {
		if row, err := sheet.GetRow(i); err == nil {
			if cell, err := row.GetCol(1); err == nil {

				// Значение ячейки, тип строка
				// Cell value, string type
				fmt.Println(cell.GetString())

				//fmt.Println(cell.GetInt64())
				//fmt.Println(cell.GetFloat64())

				// Тип ячейки (записи)
				// Cell type (records)
				fmt.Println(cell.GetType())

				// Получение отформатированной строки, например для ячеек с датой или проценты
				// Receiving a formatted string, for example, for cells with a date or a percentage
				xfIndex:=cell.GetXFIndex()
				formatIndex:=workbook.GetXFbyIndex(xfIndex)
				format:=workbook.GetFormatByIndex(formatIndex.GetFormatIndex())
				fmt.Println(format.GetFormatString(cell))

			}

		}
	}
}

最近写了个处理proofHQ comment的项目:https://gitlab.scott-xiong.com/scott-x/ExtractPHQCommentToText/-/blob/main/main.go

方案2-extrame/xls

之前已经做过封装了, 详情:https://github.com/scott-x/gutils/tree/master/excel

golang如何读写xlsx

1, 读

package main

import (
    "fmt"

    "github.com/xuri/excelize/v2"
)

func main() {
    f, err := excelize.OpenFile("Book1.xlsx")
    if err != nil {
        fmt.Println(err)
        return
    }
    defer func() {
        // Close the spreadsheet.
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // Get value from cell by given worksheet name and cell reference.
    cell, err := f.GetCellValue("Sheet1", "B2")
    if err != nil {
        fmt.Println(err)
        return
    }
    fmt.Println(cell)
    // Get all the rows in the Sheet1.
    rows, err := f.GetRows("Sheet1")
    if err != nil {
        fmt.Println(err)
        return
    }
    for _, row := range rows {
        for _, colCell := range row {
            fmt.Print(colCell, "\t")
        }
        fmt.Println()
    }
}

实际案例:提取wmt sku list关键信息,导入数据库 https://gitlab.scott-xiong.com/scott-x/sku/-/blob/main/main.go

2, 写

package main

import (
    "fmt"

    "github.com/xuri/excelize/v2"
)

func main() {
    f := excelize.NewFile()
    defer func() {
        if err := f.Close(); err != nil {
            fmt.Println(err)
        }
    }()
    // Create a new sheet.
    index, err := f.NewSheet("Sheet2")
    if err != nil {
        fmt.Println(err)
        return
    }
    // Set value of a cell.
    f.SetCellValue("Sheet2", "A2", "Hello world.")
    f.SetCellValue("Sheet1", "B2", 100)
    // Set active sheet of the workbook.
    f.SetActiveSheet(index)
    // Save spreadsheet by the given path.
    if err := f.SaveAs("Book1.xlsx"); err != nil {
        fmt.Println(err)
    }
}