openpyxl中定义了多种数据格式,其中最重要的三种:
NULL:空值,对应于python中的None,表示这个cell里面没有数据。
numberic:数字型,统一按照浮点数来进行处理。对应于python中的float。
string:字符串型,对应于python中的unicode。
每一个Excel数据文件从上至下分为三个层级的对象:
workbook: 每一个Excel文件就是一个workbook。
sheet: 每一个workbook中可以包含多个sheet,具体就对应Excel中我们在左下脚所看到的“sheet1”,“sheet2”等。
cell: 每一个sheet就是我们通常所看到的一个表格,可以含有m行,n列,每个确定的行号,列号所对应的一个格子就是一个cell。
从Excel中读取数据
从xlsx文件中读取数据,按照Excel文件的三个层级,分别做以下三个步骤
1. 打开workbook:
from openpyxl import load_workbook
wb = load_workbook('file_name.xlsx') 2.
2.打开所需的sheet:这样打开workbook中的第一个sheet:
ws = wb.get_active_sheet()变量_active_sheet_index用来确定获取哪一个sheet,而默认情况下它被置为0。也可以通过sheet的名称来获取sheet:
ws = wb.get_sheet_by_name("sheet_name")openpyxl似乎没有提供按索引来读取sheet,不过我们总是能很容易地通过sheet_name来实现:
sheet_names = wb.get_sheet_names()
ws = wb.get_sheet_by_name(sheet_names[index])
3. 获取对应cell的值:
openpyxl提供可两种方式来读取cell,一是按照Excel的习惯用字母来代表列号,例如:
c = ws.cell('A4').value也可以按照行号列号来读取:
d = ws.cell(row = 3, column = 0)
将数据写入Excel
同读取类似,写入一个Excel文件,要经历一下四个步骤:
1. 新建workbook
直接新建一个workbook对象即可:
wb = Workbook()2. 新建sheet
默认情况下,新创建的sheet是排在最后的,若想要创建一个排在最前的sheet,可以传入参数0:
ws1 = wb.create_sheet() # insert at the end
ws2 = wb.create_sheet(0) # insert at the first position
3. 写入数据
直接将要写入的数据赋值给相应的cell即可,若仅仅是修改一个表。可以跳过前两个步骤,不过要注意不要覆盖掉其它数据:
ws.cell('B5') = value1
ws.cell(row = 3, column = 7) = value24. 保存数据
最后写入将数据写入即可,注意若保存路径下有同名的文件的话,之前的文件会被覆盖:
wb.save('file_name.xlsx')
其他方法汇总:
wb = load_workbook(filename = r'empty_book.xlsx')
#显示有多少张表
print "Worksheet range(s):", wb.get_named_ranges()
print "Worksheet name(s):", wb.get_sheet_names()
#显示表名,表行数,表列数
print "Work Sheet Titile:",ws.title
print "Work Sheet Rows:",ws.get_highest_row()
print "Work Sheet Cols:",ws.get_highest_column()
#把数据存到字典中
# 建立存储数据的字典
data_dic = {}
for rx in range(ws.get_highest_row()):
temp_list = []
pid = ws.cell(row = rx,column = 0).value
w1 = ws.cell(row = rx,column = 1).value
w2 = ws.cell(row = rx,column = 2).value
w3 = ws.cell(row = rx,column = 3).value
w4 = ws.cell(row = rx,column = 4).value
temp_list = [w1,w2,w3,w4]
data_dic[pid] = temp_list
注意的是ws.cell()方法,支持的参数有两种,cell(coordinate=None, row=None,column=None)
coordinate坐标,eg ws.cell("B1")
row 和 column 是行和列 ,都是从0开始
还有,如果想取得格里的值,得用ws.cell("A1").value 取到
网上推荐的一个实例
#!/usr/bin/python
import random
from openpyxl.workbook import Workbook
from openpyxl.writer.excel import save_workbook
from openpyxl.chart import ScatterChart, Serie, Reference
def test_scatterchart_write():
wb = Workbook() ##打开workbook:
ws = wb.get_active_sheet()##用来确定获取哪一个sheet而默认情况下它被置为0
ws.title = u'scatterdata' ###名称为scatterdata的sheet
ws.cell(row=0, column=1).value = 'Scatter 1' ##第0行1列为Scatter 1
ws.cell(row=0, column=2).value = 'Scatter 2' ##第0行2列为Scatter 2
for i in range(1,12): ##循环对表格赋值
ws.cell(row=i, column=0).value = (i-1) / 10.
ws.cell(row=i, column=1).value = random.random()
ws.cell(row=i, column=2).value = random.random()
#Excel使用SERIES()函数绘制曲线
#Reference对一个或多个单元格区域的引用。如果为 reference 输入一个不连续的区域,必须将 reference 其用括号括起来。
xyserie1 = Serie( Reference(ws, (1,1), (11,1)), ##第1行1列到11行1列
xvalues=Reference(ws, (1,0), (11,0)),#第1行0列到第11行0列
legend=Reference(ws, (0,1))) ##0行1列的数据)
xyserie2 = Serie( Reference(ws, (2,1), (11,1)),
xvalues=Reference(ws, (1,0), (11,0)),
legend=Reference(ws, (0,2)))
scatterchart = ScatterChart()
scatterchart.add_serie(xyserie1)
scatterchart.add_serie(xyserie2)
##坐标的x轴即使横轴
scatterchart.x_axis.min = 0
scatterchart.x_axis.max = 1
scatterchart.x_axis.unit = 0.2
scatterchart.y_axis.min = 0
scatterchart.y_axis.max = 1
scatterchart.y_axis.unit = 0.2
# 图片区域的位置,大小
scatterchart.drawing.left = 200
scatterchart.drawing.top = 200
scatterchart.drawing.height = 200
scatterchart.drawing.width = 500
#在容器中的百分比(如何控制)
scatterchart.width = .9
scatterchart.height = .9
scatterchart.margin_top = .1
ws.add_chart(scatterchart)
wb.save(r'chart.xlsx')
test_scatterchart_write()
print ("完成")