转自:https://blog.youkuaiyun.com/weixin_37356900/article/details/92759471
已解决】python 使用xlrd,xlwt 修改execl单元格的背景色
【解决过程】
之前查百度,问同事,一直没找到满意的答案,后来找到了几篇不相干的文章,自己整理整理,理解理解,总算是理出了令自己比较满意的答案:
分两种情况:
一、 原execl 表格中的数据不改变,只改变需要改变的单元格的背景
import xlrd
from xlutils.copy import copy
import xlwt
# 第一步 把原表格中的数据拷贝一份
path = 'E:\\测试文件\\test.xls'
book = xlrd.open_workbook(path)
# book = xlrd.open_workbook(path, formatting_info=True)
# 设置 formatting_info=True ,当打开表格是保存表格原有的样式,进行保存时,
# 原来的样式不会丢失
sheet = book.sheets()[0]
wb = copy(book)
ws = wb.get_sheet(0)
# 第二步 设置样式
pattern = xlwt.Pattern()
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour = 5 # 5 背景颜色为黄色
#1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon,
# 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray
style = xlwt.XFStyle()
style.pattern = pattern
# 第三步 写入数据并保存
ws.write(1, 1, '苹果', style) # 顺序为 row, column, value, style
ws.write(1, 2, '南瓜', style)
ws.write(1, 3, '猫头鹰', style)
ws.write(2, 2, '', style) # 单元格数据为空,背景为黄色
# value会覆盖原单元格的数据,如果不想被覆盖了,需提前把原单元格的数据获取到再写入
wb.save(path)
# 开始时的样式

# 运行后的样式

``
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
二、新建一个工作薄,写入数据后再保存到指定的表格中
如果原表格中有数据,那么数据会丢失
如果是空白表格,则不会影响结果
# 第一步
wb = xlwt.Workbook()
ws = wb.add_sheet("大千世界") # 大千世界 为sheet名,可自行定义
# 第二步,第三步同上
# 运行结果

# 其他数据已丢失
# 可以通过修改 wb.save(path) 里面的 path 来改变保存的位置,原表格的数据就不会丢失了
# sheet 的名称也改过来了

- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
三、在循环中灵活控制是否添加背景色(隔行变色)
将第二步中的
pattern.pattern = xlwt.Pattern.SOLID_PATTERN
改为:
pattern.pattern = xlwt.Pattern.NO_PATTERN
其他地方不变,依然不会添加背景色
- 1
- 2
- 3
- 4
- 5
- 6
四、添加背景色导致单元格边框消失
【解决办法】
方法一、灵活控制是否添加背景色
方法二、添加表格样式
添加表格样式
在上述第三步,设置样式的地方添加表格的样式
borders = xlwt.Borders() # Create borders
borders.left = xlwt.Borders.MEDIUM # 添加边框-虚线边框
borders.right = xlwt.Borders.MEDIUM
borders.top = xlwt.Borders.MEDIUM
borders.bottom = xlwt.Borders.MEDIUM
borders.left_colour = 0x90 # 边框上色
borders.right_colour = 0x90
borders.top_colour = 0x90
borders.bottom_colour = 0x90
style = xlwt.XFStyle() # Create style
style.borders = borders # Add borders to style