首页 > 技术文章 > python Excel读写操作

CaesarLinsa 2019-06-30 13:44 原文

背景

在数据的存储上,习惯使用txt,json或者数据库,但是如果友好地存储,对外提供,则还是基于Excel显示。如果是简单的字符串,或许会选择cvs,默认使用,作为分割,可以存储为txt,生成文件后修改后缀,但cvs有一个比较坑的地方,使用英文逗号,进行分割。如果处理的字符串中有逗号,或者字符串分行,是没有办法处理的。这种情况下,必须使用Excel。在JAVA中使用POI库对Excel进行操作,在python中使用openpyxl进行操作,版本2007以上的Excel,后缀xlsx。

几种python Excel操作库比较

openpyxl可以友好的实现对文件的追加写入

xlrd,xlwt,pandons 如果不断打开文档写入,会发现是不断在覆盖上次记录,最终还是一条记录。如果做一次性写入若干数据,则可以。如果需要不断打开文档追加,不能实现。

openpyxl写操作

可以参考鄙人的脚本,路径 https://github.com/CaesarLinsa/shell/blob/master/linux/diff_changes_to_excel.sh,将数据多次写入Excel中。

a.创建Excel文件

from  openpyxl import Workbook
wb = Workbook() # Excel对象
sheet = wb.active # sheet一个sheet页操作对象
sheet.title="caesar" #新建一个sheet页命名为"caesar"

b.写入数据

sheet.cell(1,1,"caesar") # 向第一行第一列的Excel单元格中写入"caesar"

c.保存Excel

wb.save("caesar.xlsx")# 以上sheet页命名及数据存入caesar.xlsx中

d.Excel追加 

 在追加Excel时,先要加载Excel,计算出当前sheet中已经使用多上行,从哪一行开始存入数据。

  1.加载Excel 

wb=openpyxl.load_workbook("caesar.xlsx")

  2. 获取sheet对象,并计算行数,写入数据

sheet=wb.worksheets[0]
rows=sheet.max_row
sheet.cell(rows+1, 1, 'Marcovaldo')# 像开始行的第一列写入“Marcovaldo”

openpyxl读操作

行列读取

sheet.rows为生成器, 里面是每一行的数据,每一行又是一个tuple。
sheet.columns类似,里面是每个tuple是每一列的单元格。
如果需要获取某一行或列的数据,需要在外部定义计数器,获取到那一行时,遍历其中每个cell

for row in sheet.rows:
    for cell in row:
        print(cell.value)

# A1, A2, A3这样的顺序
for column in sheet.columns:
    for cell in column:
        print(cell.value)

单元格读取

在读前,确保行列都小于等于最大的行数和列数,否则会报错,而不是返回None

>>> d=sheet.cell(row=2, column =1)
>>> print d
<Cell u'caesar'.A2>
>>> d.value
u'+++ ceilometer-10.0.1/AUTHORS\t2018-06-14 23:58:01.000000000 +1000\n'
>>>

推荐阅读