python操作excel主要用到xlrd和xlwt这两个库,即xlrd是读excel,xlwt是写excel的库。可从这里下载https://pypi.python.org/pypi。下面分别记录python读和写excel.
python读excel——xlrd
这个过程有几个比较麻烦的问题,比如读取日期、读合并单元格内容。下面先看看基本的操作
import xlrd
import xlwt
import uuid
from datetime import datetime
workbook = xlrd.open_workbook('shujuzhengli.xls')
print(workbook.sheet_names())
li = []
tem = []
fields = ['name', 'full_name', 'model', 'brand', 'leader', 'entry_date', 'start_date']
for sheet in workbook.sheet_names():
table = workbook.sheet_by_name(sheet) #根据名称获取sheet内容
nrows = table.nrows#有效行数
ncols = table.ncols#有效列数
print(nrows,ncols)
if nrows and ncols:
for nrows_num in range(nrows): #行
print("nrows_num",nrows)
dic = {}
for ncols_num in range(ncols): #列
print("ncols_num",ncols_num)
value = table.cell_value(nrows_num, ncols_num)
dic[fields[ncols_num]]=value
print("dic",dic)
li.append(dic)
print("li",li)
import pymysql
conn = pymysql.connect(host='192.168.99.200',port=3306,database='bms',user='root',passwd='Cwtc@2018',charset='utf8')
cursor = conn.cursor()
t = datetime.now()
for i in li:
name = i["name"]
sql = "select * from bms_system_equipment where name = '%s'"%(name)
cursor.execute(sql )
ret = cursor.fetchone()
u = str(uuid.uuid4()).replace("-","")
if not ret:
sql = "insert into bms_system_equipment(uuid,name,full_name,model,brand,leader,entry_date,start_date,status,created_at,updated_at,deleted) values ('%s','%s','%s','%s','%s','%s','%s','%s',%s,'%s','%s',%s) "\
%(u,i["name"],i["full_name"],i["model"],i["brand"],i["leader"],datetime.strptime(str(i["entry_date"]), "%Y.%m"),datetime.strptime(str(i["start_date"],), "%Y.%m"),2,t,t,0)
print(sql)
# 根据sheet索引或者名称获取sheet内容
sheet2 = workbook.sheet_by_index(1) # sheet索引从0开始
sheet2 = workbook.sheet_by_name('sheet2')
# 获取整行和整列的值(数组)
rows = sheet2.row_values(3) # 获取第四行内容
cols = sheet2.col_values(2) # 获取第三列内容
print rows
print cols
# 获取单元格内容
print sheet2.cell(1,0).value.encode('utf-8')
print sheet2.cell_value(1,0).encode('utf-8')
print sheet2.row(1)[0].value.encode('utf-8')
# 获取单元格内容的数据类型
print sheet2.cell(1,0).ctype
python读取excel中单元格内容为日期的方式
python读取excel中单元格的内容返回的有5种类型,即上面例子中的ctype:
ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
即date的ctype=3,这时需要使用xlrd的xldate_as_tuple来处理为date格式,先判断表格的ctype=3时xldate才能开始操作。现在命令行看下:
>>> sheet2.cell(2,2).ctype #1990/2/22
>>> sheet2.cell(2,1).ctype #24
>>> sheet2.cell(2,0).ctype #小胖
>>> sheet2.cell(2,4).ctype #空值(这里是合并单元格的原因)
>>> sheet2.cell(2,2).value #1990/2/22
33656.0
>>> xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
(1992, 2, 22, 0, 0, 0)
>>> date_value = xlrd.xldate_as_tuple(sheet2.cell_value(2,2),workbook.datemode)
>>> date_value
(1992, 2, 22, 0, 0, 0)>>> date(*date_value[:3])datetime.date(1992, 2, 22)>>> date(*date_value[:3]).strftime('%Y/%m/%d') '1992/02/22'
即可以做下简单处理,判断ctype是否等于3,如果等于3,则用时间格式处理
if (sheet.cell(row,col).ctype == 3):
date_value = xlrd.xldate_as_tuple(sheet.cell_value(rows,3),book.datemode)
date_tmp = date(*date_value[:3]).strftime('%Y/%m/%d')
读取合并单元格的内容
只能获取合并单元格的第一个cell的行列索引,才能读到值,读错了就是空值。
即合并行单元格读取行的第一个索引,合并列单元格读取列的第一个索引
合并单元格可能出现空值,但是表格本身的普通单元格也可能是空值,要怎么获取单元格所谓的"第一个行或列的索引"呢?
这就要先知道哪些是单元格是被合并的!
获取合并的单元格
读取文件的时候需要将formatting_info参数设置为True,默认是False,所以上面获取合并的单元格数组为空,
>>> workbook = xlrd.open_workbook(r'F:\demo.xlsx',formatting_info=True)
>>> sheet2 = workbook.sheet_by_name('sheet2')
>>> sheet2.merged_cells
[(7, 8, 2, 5), (1, 3, 4, 5), (3, 6, 4, 5)]
merged_cells返回的这四个参数的含义是:(row,row_range,col,col_range),其中[row,row_range)包括row,不包括row_range,col也是一样,即(1, 3, 4, 5)的含义是:第1到2行(不包括3)合并,(7, 8, 2, 5)的含义是:第2到4列合并。
利用这个,可以分别获取合并的三个单元格的内容:
>>> print sheet2.cell_value(1,4) #(1, 3, 4, 5)
好朋友
>>> print sheet2.cell_value(3,4) #(3, 6, 4, 5)
同学
>>> print sheet2.cell_value(7,2) #(7, 8, 2, 5)
暂无
发现规律了没?是的,获取merge_cells返回的row和col低位的索引即可! 于是可以这样一劳永逸
>>> merge = []
>>> for (rlow,rhigh,clow,chigh) in sheet2.merged_cells:
merge.append([rlow,clow])
>>> merge
[[7, 2], [1, 4], [3, 4]]
>>> for index in merge:
print sheet2.cell_value(index[0],index[1])
暂无
好朋友
同学
>>>
写EXCEL--xlwt
def write_excel():
# 创建工作簿
workbook = xlwt.Workbook(encoding='utf-8')
# 创建sheet
data_sheet = workbook.add_sheet('demo')
row0 = [u'状态', u'设备编号', u'楼层', u'系统',u"类型"]
row1 = [u'测试', '15:50:33-15:52:14', 22706, 4190202]
# {
# "id": "2db098e82c70434cad582386664ccc68",
# "name": "EAF-L7-29",
# "type": "BPV",
# "module": [
# {
# "空调系统": {
# "id": 1,
# "index": -2,
# "child": {
# "空调风系统": {
# "id": 2,
# "index": 0,
# "child": 0
# }
# }
# }
# }
# ],
# "installFloor": "B1",
# "state": 0
# },
# 生成第一行和第二行
i = 0
for j in dict:
row = [str(j.get("state")),j.get("name"),j.get("installFloor"),u"空调系统",str(j.get("type"))]
i +=1
for k in range(len(row0)):
data_sheet.write(i, k, row[k], set_style('Times New Roman', 220, True))
# 保存文件
workbook.save('demo2.xls')
if __name__ == '__main__':
write_excel()
print(u'创建demo.xlsx文件成功')
参考:https://www.cnblogs.com/zhoujie/p/python18.html