0%

Excel 转 Json

前言

用 Python 读取 Excel 文件并转换为 Json 的实现

最近由于一些日常的事情,需要对 Excel 里提供的数据进行分类或排序等相关操作。虽然用 Excel 软件做这些工作完全没有问题,但是处理的数据还是在 Excel 表格里,并没有办法直接使用,还是习惯直接处理 Json 格式的数据。Excel 本身有类似 ExcelToJson 的插件,但使用这样的插件有一些缺点。

  • 需要联网
  • 需要打开 Excel 软件

为了方便,这里通过万能的胶水语言 Python 尝试一下。

使用 xlrd 库

1
pip install xlrd

xlrl 简单了解

总的来说 xlrd 的 api 取名是非常人性化的,基本上看到方法名字你就知道用来干什么了。

比如

  • xl_workbook = xlrd.open_workbook(path)

    • 按文件路径读文件并返回一个对象
  • xl_workbook.sheet_names()

    • 返回一个 excel 文件中所有的表名,就是底部的 Sheet1,这个其实很有用,这个干啥用呢?看下面
  • xl_workbook.sheet_by_name(sheet_names[0])

    • 通过表名返回一个表

    当然,如果你的 excel 文件很简单,只有一张表,那么也可以通过 xl_workbook.sheet_by_index(0) 这样简单的方式,直接用下标索引按顺序访问表。

为了方便,后面以下图中这张表为例

对于一张普通的表来说,第一行特别重要,因为他记录了这张表要统计哪些具体的信息,相当于是一个对象的属性。当然,在某些情况下,不一定是表的第一行,但一定是某个固定的行。

获取表的关键属性

1
2
3
4
5
6
7
8
row = xl_sheet.row(0)  # 1st row
keys = [] # sheet prop

for idx, cell_obj in enumerate(row):
cell_type_str = ctype_text.get(cell_obj.ctype, 'unknown type')
print('(%s) %s %s' % (idx, cell_type_str, cell_obj.value))
keys.append(cell_obj.value)
print(keys)

output

1
2
3
4
5
(0) text Company
(1) text Address 1
(2) text City
(3) text State
['Company', 'Address 1', 'City', 'State']

可以看到我们可以获取表格中每一列的内容的值和他的属性。

这里的属性其实非常有用,由于上述表格非常简单,每一列都只是简单的文字描述,因此都是 text。如果你的表格设计的比较高端,比如这里是一个 excel 的选择器,那么就可以做更多的事情了。

按行读取文件

其实,上图中的表就是一个 list ,每一个相当于是一个对象或者说是字典,因此我们要做的就是按行访问表,并按照每一行进行赋值即可

1
2
3
4
5
6
7
8
9
results = []
num_cols = xl_sheet.ncols # 表格的列数
for row_idx in range(1, xl_sheet.nrows): # 对表格的行数循环
result = {}
for col_idx in range(0, num_cols): # Iterate through columns
cell_obj = xl_sheet.cell(row_idx, col_idx) # Get cell object by row, col
result[keys[col_idx]] = cell_obj.value
results.append(result)
print(json.dumps(results, ensure_ascii=False))

由于第0行是属性,因此直接从第一行开始遍历,用属性构造字典对象并添加到数组中,最后使用 json 库进行一个转换即可。

总结

用 Python 进行数据处理果然方便,同样的功能用其他语言,可能需要多的代码,但是 Python 却可以非常快速的完成。

加个鸡腿呗.