前言
本文代码来源:
在原代码的基础上,我会做一些应用上的修改,并力争理清楚代码的功能。
1. 写文件 xlwt
先贴 因为偷懒 修改后的源码:
import xlwt
#设置表格样式
def set_style(name, height, bold = False):
style = xlwt.XFStyle()
font = xlwt.Font()
font.name = name
font.bold = bold
font.color_index = 4
font.height = height
style.font = font
return style
#写
def write_excel():
f = xlwt.Workbook()
sheet1 = f.add_sheet('学生', cell_overwrite_ok = True)
row0 = ["name", "age", "birth", "hobby"]
colum0 = ["A", "B", "C", "D"]
#第一行
for i in range(0, len(row0)):
sheet1.write(0, i, row0[i], set_style('Times New Roman', 220, True))
#第一列
for i in range(0, len(colum0)):
sheet1.write(i+1, 0, colum0[i], set_style('Times New Roman', 220, True))
sheet1.write(1, 3, '2019/12/25')
sheet1.write_merge(6, 6, 1, 3, 'Unknown')#合并单元格
sheet1.write_merge(1, 2, 3, 3, 'Play')#合并列
sheet1.write_merge(4, 5, 3, 3,'Basketball')
f.save('test.xls')
if __name__ == '__main__':
write_excel()
解析:
-
设置表格样式
set_style() 函数,有3个变量:name 传入字体,height 传入字体高度,220 在 excel 中显示为11,bold 设置字体加粗。 -
创建工作表
sheet1 = f.add_sheet('学生', cell_overwrite_ok = True)
这里新建一张“学生”表,cell_overwrite_ok 设置是否可以修改表。
row0 设置首行,colum0 设置首列。值得注意的是,这里是先写入首行,然后在首列中从第二格开始:
执行row0 = ["name", "age", "birth", "hobby"]
后:
执行 colum0 = ["A", "B", "C", "D"]
这个设定和代码的执行顺序无关,即使修改了 row 和 colum 的顺序依然如此。
两个 for 循环分别设置首行和首列的字体。
- 写数据
sheet1.write(3, 4, '2019/12/25')
在 sheet1 的 3-4 写入 ‘2019/12/25’。
可以看出,这里的行、列序号是从 0 开始的。
- 合并单元格
sheet1.write_merge(6, 6, 1, 3, 'Unknown')
拿此段距离。[6, 6, 1, 3] 表示 “行:6-6, 列:1-3” 合并。不要忘了,序号是从 0 开始的。
2. 读文件 xlrd
读文件我们按功能模块来讲。
首先建好如图所示的表:
给出完整读取表内容的代码:
import xlrd
file = 'test.xls'
def read_excel():
wb = xlrd.open_workbook(filename=file)#打开文件
print(wb.sheet_names())#获取所有表格名字
sheet = wb.sheet_by_index(0)
for i in range(sheet.nrows):
print(sheet.row_values(i))
if __name__ == '__main__':
read_excel()
效果如下:
这里需要注意的有两点,先按下不表:
- 合并单元格显示效果会和空格一样
- 日期显示的格式不正确
对代码进行解释:
sheet = wb.sheet_by_index(0)
通过索引获取表格,这里索引序号从 0 开始。
for i in range(sheet.nrows):
print(sheet.row_values(i))
按行顺序进行循环打印。
每个循环内sheet.row_values(i)
代表取出第 i 行的数据。
按列即:
for i in range(sheet.nrows):
print(sheet.col_values(i))
要取出单个单元格数据,有三种方式:
print(sheet1.cell(1,0).value)#获取表格里的内容,三种方式
print(sheet1.cell_value(1,0))
print(sheet1.row(1)[0].value)
可以取单元格之后,我们来解决上面的两个问题。
首先是合并的单元格:
要取出合并后的单元格的内容,只需将横纵序号都按最小来取,比如图中的打游戏:
直接取它左上角的单元格,即 (1,3)
然后是日期:
这里涉及到 Python 读取 Excel 中单元格的内容时,返回的 5 种类型:
ctype :
0 empty
1 string
2 number
3 date
4 boolean
5 error
date 的类型为 3 ,可以验证:
要取出日期的内容,有以下几种方式:
date_value = xlrd.xldate_as_tuple(sheet.cell_value(1,1),wb.datemode)
print(date_value)
print(date(*date_value[:3]))
print(date(*date_value[:3]).strftime('%Y/%m/%d'))
效果如下: