xlwt:写入数据到excle表格中,表格存在则直接写入(会清空原来数据),表格不存在则创建表格。
xlwd:从excel中读取数据,只能读取,不能修改。put_cell也不可以。
xlutils:修改excel表格中数据,思路是用 xlwd
模块读取数据,然后用 xlutils
模块进行复制读取的数据,最后用xlwt
写入新的数据来达到修改的目的。
三个模块的关系见下图
常用属性设置:
- cell_overwrite_ok:创建sheet设置是否可以覆盖单元格
- formatting_info:创建sheet设置是否可以保留表格原来数据,读取合并单元格
- xlwt.Workbook(encoding=’utf-8’):创建工作簿设置编码(或者在字符串前加
u
, 如u"中文"
),不设置的话中文无法写入,
其他常用操作见下方代码(在windows7,ubuntu上测试通过
),代码中有详细注释
xlrd
模块 取出指定路径的excel表格的数据,注意处理单元格的数据类型( 类型 0:empty,1:string, 2:number, 3:date, 4:boolean, 5:error),比如日期不做处理直接取出是浮点数
def read_excel(execl_file):
"""
读取excel数据
:param execl_file:excel工作簿
:return:
"""
data = xlrd.open_workbook(execl_file, formatting_info=True) # 打开execl_file
sheet_name = data.sheet_names() # 获取xls文件中所有sheet的名称
table_one = data.sheets()[0] # 获取xls文件第一个工作表
table_index = data.sheet_by_index(0) # 通过索引获取xls文件第0个sheet
table_name = data.sheet_by_name('merge') # 通过工作表名获取 sheet
for sheet in sheet_name:
print "工作表:", sheet
# 工作表名字
sheet = table_index.name
print "工作表名:", sheet
# 获取行数
rows = table_one.nrows
# 获取列数
cols = table_name.ncols
print "row: %s, col: %s" % (rows, cols)
# 获取整行的值
rows_value = table_index.row_values(0)
for i, value in enumerate(rows_value):
value = value.encode('utf-8') if isinstance(value, unicode) else value
print value,
print
# 获取整列的值
cols_value = table_index.col_values(0)
for value in cols_value:
value = value.encode('utf-8') if isinstance(value, unicode) else value
print value,
print
# 获取单元格数据类型
cell_type = table_index.cell(0, 0).ctype # 行、列
# 获取单元格数据
cell = table_index.cell(0, 0).value
# 转为日期类型,但转之前要确认 ctype = 3
if cell_type == 3:
date_value = xlrd.xldate_as_tuple(table_index.cell_value(0, 0), data.datemode)
print "date_value:", date_value
# 使用行索引
cell_row = table_index.row(2)[2].value
# 使用列索引
cell_col = table_index.col(2)[2].value
print "cell_type: %s, cell: %s, cell_row: %s, cell_col: %s" % (cell_type, cell, cell_row, cell_col)
row = 2
col = 2
c_type = 2 # 类型 0:empty,1:string, 2:number, 3:date, 4:boolean, 5:error
value = 1234
xf = 0 # 扩展的格式化 (默认是0)
table_index.put_cell(row, col, c_type, value, xf) # 值不会写入,但是现在能被获取
# 获取合并的单元格 此时,formatting_info参数要设置为 True,否则无法读取合并单元格的值
merge_value = table_index.merged_cells
print "merge_value:", merge_value
xlwt
模块 把数据写入execl表格,不保留原来数据
def write_excel(execl_file):
"""
不保留原来数据
:param execl_file:excel工作簿
:return:
"""
wb = xlwt.Workbook()
# 工作表名
ws = wb.add_sheet('1')
# 设置 单元格宽度
first_col = ws.col(0)
first_col.width = 256 * 30 # 设置单元格宽带30
ws.write(2, 0, "Header") # excel x,y轴都是从0开始计算,2,0代表在第三行第一列交叉那个单元格写入数据
ws.write(2, 1, "CatalogNumber")
ws.write(2, 2, "PartNumber")
wb.save(execl_file)
写入数据时同时设置单元格样式
def set_style(font_name, height, bold=False):
"""
设置内容样式
:param font_name: 字体
:param height: 字号
:param bold: 是否加粗
:return:
"""
style = xlwt.XFStyle() # 初始化样式
font = xlwt.Font() # 为样式创建字体
font.name = font_name # 'Times New Roman'
font.bold = bold # 是否加粗
font.colour_index = 0x34 # 字体颜色
font.height = height # 除以 20 就是字号
borders = xlwt.Borders() # 设置边框
borders.left = 6
borders.right = 6
borders.top = 6
borders.bottom = 6
style.font = font
style.borders = borders
return style
插入数据的同时保留原来数据
def save_old_excel(execl_file):
"""
保留原数据
:param execl_file:excel工作簿
:return:
"""
# formatting_info=True 保留表格原来数据
old_wb = xlrd.open_workbook(execl_file, formatting_info=True)
new_wb = copy(old_wb)
new_ws = new_wb.add_sheet('2')
for i in xrange(1, 20):
new_ws.write(10, i, i)
new_wb.save(execl_file)
写入数据到合并单元格
def write_merge_table(execl_file):
"""
创建合并单元格
:param execl_file:excel工作簿
:return:
"""
f = xlwt.Workbook(encoding='utf-8') # 创建工作簿
sheet1 = f.add_sheet('merge', cell_overwrite_ok=True, ) # 创建sheet, cell_overwrite_ok:是否可以覆盖单元格
row0 = ['业务', '状态', '北京', '上海', '广州', '深圳', '状态小计', '合计']
column0 = ['机票', '船票', '火车票', '汽车票', '其它']
status = ['预订', '出票', '退票', '业务小计']
# status = [u'预订', u'出票', u'退票', u'业务小计'] # 未设置编码写法
# 生成第一行
for i in range(0, len(row0)):
sheet1.write(0, i, row0[i], set_style('Times New Roman', 300, True))
# 生成第一列和最后一列(合并4行)
i, j = 1, 0
while i < 4 * len(column0) and j < len(column0):
sheet1.write_merge(i, i + 3, 0, 0, column0[j], set_style('Arial', 220)) # 第一列
# write_merge(x, x + m, y, y + n, string, sytle)
# x表示行,y表示列,m表示跨行个数,n表示跨列个数,string表示要写入的单元格内容,style表示单元格样式。其中,x,y,w,h,都是以0开始计算的。
sheet1.write_merge(i, i + 3, 7, 8) # 最后一列"合计"
i += 4
j += 1
sheet1.write_merge(21, 21, 0, 1, u'合计', set_style('Times New Roman', 220))
# 生成第二列
i = 0
while i < 4 * len(column0):
for j in range(0, len(status)):
sheet1.write(j + i + 1, 1, status[j])
i += 4
f.save(execl_file) # 保存文件
写入超链接
def write_link(execl_file):
"""
创建超链接
:param execl_file: excel工作簿
:return:
"""
f = xlwt.Workbook(encoding='utf-8') # 创建工作簿
sheet1 = f.add_sheet('merge', cell_overwrite_ok=True, ) # 创建sheet, cell_overwrite_ok:是否可以覆盖单元格
# 添加超链接
n = "HYPERLINK"
sheet1.write_merge(9, 10, 9, 10, xlwt.Formula(n + u'("http://www.cnblogs.com/hm24"; "黄剑冬")'))
f.save(execl_file) # 保存文件
插入图片
def add_image(execl_file):
"""
插入图片
:param execl_file:excel工作簿
:return:
"""
# 使用PIL模块转换图片格式
img = Image.open('D:\er.jpg')
img.convert('RGB')
img.save('D:\er.bmp', 'BMP')
image = xlwt.Workbook(encoding='utf-8') # 创建工作簿
new_ws = image.add_sheet('image', cell_overwrite_ok=True) # 创建sheet
# 只能保存bmp格式的图片
# new_ws.insert_bitmap('D:\er.bmp', 0, 0)
new_ws.insert_bitmap('D:\er.bmp', 0, 0, 100, 100, scale_x=1, scale_y=1)
# img表示要插入的图像地址
# x表示行
# y表示列
# x1表示相对原来位置向下偏移的像素
# y1表示相对原来位置向右偏移的像素
# scale_x表示相对原图宽的比例
# scale_y表示相对原图高的比例
image.save(execl_file)