Insun Lee

命由己造,相由心生,世间万物皆是化相,心不动,万物皆不动,心不变,万物皆不变
WechatinsunLee
Email insunsgmail.com
Country China
LocationHangZhou, ZheJiang

Golang解析xls文件


由于工作原因,我跟xls打交道很多,经常需要解析xls文件,读出其中的一些内容以供项目使用。在这过程中,我曾用过php、python、java、c#、golang解析xls文件。下面将主要介绍用golang解析xls文件。

Golang解析xls

在网上搜索到的能读xls的golang库主要是extrame/xlsshakinm/xlsReader。最开始我使用的是extrame/xls,但是在测试后发现extrame/xls在读取一些xls文件时,经常会莫名其妙的出现乱码。而且master分支实际上是无法使用的(至少在我使用中有各种问题),我测试的时候实际是用new_formatter分支,这个分支除了偶尔出现一些乱码,其他的倒是没遇到太多问题。

extrame/xls已经好几年没更新了,估计作者已经不再维护,所以不建议使用。

我目前使用的golang读取xls文件的库是shakinm/xlsReader,截止目前为止在我使用中没遇到问题。因此下文主要介绍shakinm/xlsReader的一些用法。

安装shakinm/xlsReader

  • 通过go.mod引入:require github.com/shakinm/xlsReader latest
  • 直接下载到本地:go get github.com/shakinm/xlsReader

使用示例

xlsReader使用起来比较简单,参考官方readme.md即可。我主要讲下操作步骤和使用中需要注意的地方。

使用步骤

主要步骤:打开工作蒲 --> 获得工作表 --> 循环行 --> 处理行中所关注的列

  1. xls.OpenFile打开xls文件,在这之前先自行判断文件是否存在,后缀是否为.xls

    //xlsPath 为xls文件路径,util.Exists是我内部实现的用来判断文件是否存在的方法
    if util.Exists(xlsPath) == false || !strings.HasSuffix(xlsPath, ".xls") {
        logger.Errorf("xls不存在:%s", xlsPath)
        return
    }
    //OpenFile打开成功返回的是workBook对象
    wb, err := xls.OpenFile(xlsPath)
    if err != nil {
        //logger是我使用的内部日志记录器,下同
        logger.Errorf("打开xls文件「%s」失败,格式有误?", xlsPath)
        return
    }
  2. 如果你使用中需要用到工作表的数量,则可以通过wb.GetNumberSheets()可以获取

    //我的项目中,不同的年份的xls文件中工作表数量不同,通常需要根据工作表的数量来判断是否有某种数据
    hasOption := false
    if wb.GetNumberSheets() > 5 {
        hasOption = true
    } 
  3. 利用GetSheet(index)获得某一张工作表:

    //获得第一张工作表
    sheet, err := wb.GetSheet(0)
    if err != nil {
        logger.Error(err.Error())
    }
  4. 利用GetNumberRows()获得工作表的行数,然后即可循环操作

    //获得工作表的行数
    rn := sheet.GetNumberRows()
    //循环处理每一行
    for i := 0; i <= rn; i++ {
        //获取行
        if row, e := sheet.GetRow(i); e == nil && row != nil {
            //获取这行的所有列
            cols := row.GetCols()
            if cols == nil || len(cols) < 1 {
                continue
            }
            //获得列数
            colen := len(cols)
            //获得第一列的字符串
            firstCol := strings.TrimSpace(cols[0].GetString())
            //其他列值处理...
        }
    }

拓展阅读:XLS解析库索引

PHP的XLS解析库

PHP解析xls常用的库PhpSpreadsheetPHPExcel。本人早期用过PHPExcel,当时由于在解析大文件或者连续解析(循环)时,经常会导致内存溢出,后来换用了python的xlrd解析,从此之后不再使用PHPExcel。PHPExcel目前这个项目已经不在维护,建议使用PHPSpreadsheet,下列是PHPExcel的公告:

PHPExcel last version, 1.8.1, was released in 2015. The project was officially deprecated in 2017 and permanently archived in 2019.

The project has not be maintained for years and must not be used anymore. All users must migrate to its direct successor PhpSpreadsheet, or another alternative.

PHPSpreadsheet VS PHPExcel

PhpSpreadsheet is the next version of PHPExcel. It breaks compatibility to dramatically improve the code base quality (namespaces, PSR compliance, use of latest PHP language features, etc.).

Because all efforts have shifted to PhpSpreadsheet, PHPExcel will no longer be maintained. All contributions for PHPExcel, patches and new features, should target PhpSpreadsheet master branch.

PHPSpreadsheet文档地址: PhpSpreadsheet Doc

Python的XLS解析库

python操作xls文件主要用到xlrdxlwt这两个库,即xlrd是读excel,xlwt是写excel的库。由于我主要是读取文件,因此只使用过xlrd。

安装

xlrd的安装很简单,通过python的pip包管理器安装只要执行pip install xlrd即可。在centos系统通常还可以根据python版本用yum安装,python2可通过sudo yum install python2-xlrd来安装,python3则通过sudo yum install python3-xlrd安装.

xlrd用例

import xlrd
book = xlrd.open_workbook("myfile.xls")
print("The number of worksheets is {0}".format(book.nsheets))
print("Worksheet name(s): {0}".format(book.sheet_names()))
sh = book.sheet_by_index(0)
print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols))
print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3)))
for rx in range(sh.nrows):
    print(sh.row(rx))

xlwt用例

import xlwt
from datetime import datetime

style0 = xlwt.easyxf('font: name Times New Roman, color-index red, bold on',
    num_format_str='#,##0.00')
style1 = xlwt.easyxf(num_format_str='D-MMM-YY')

wb = xlwt.Workbook()
ws = wb.add_sheet('A Test Sheet')

ws.write(0, 0, 1234.56, style0)
ws.write(1, 0, datetime.now(), style1)
ws.write(2, 0, 1)
ws.write(2, 1, 1)
ws.write(2, 2, xlwt.Formula("A3+B3"))

wb.save('example.xls')

java的xls解析库

java的xls解析库我之前使用的是poi. 文档参考: POI Javadocs。 poi用例请参考相关文档。

c#的xls解析库

c#解析xls主要用的是NPOI。NPOI的用例请参考:NPOI examples

  • 分享:
评论

    • 博主

    说点什么