背景
在数据的存储上,习惯使用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' >>>