Python操作Excel的模块有很多,并且各有优劣,不同模块支持的操作和文件类型也有不同。下面是各个模块的支持情况:
- xlrd:xlrd 读取.xls文件
- xlwings:xlwings 读取写入Excel文件
- openpyxl:openpyxl 读取写入.xlsx文件
一、安装
pip install xlwt
向xls文件中写入内容
import xlwt
#创建一个workbook对象,就相当于创建了一个Excel文件
workbook = xlwt.Workbook(encoding='utf-8',style_compression=0) #encoding:设置编码,可写中文;style_compression:是否压缩
# 创建一个sheet对象,相当于创建一个sheet页
worksheet = workbook.add_sheet('这是sheet1',cell_overwrite_ok=True) # cell_overwrite_ok:是否可以覆盖单元格,默认为False
# 向sheet页中添加数据:worksheet.write(行,列,值)
style = xlwt.XFStyle()# 初始化样式
worksheet.write(0,0,'我要发财啦',style) # 第1行第1列写入数据,style:样式
# 将以上内容保存到指定的文件中
workbook.save('测试文件.xls')
三、设置样式
style = xlwt.XFStyle()# 初始化样式
font = xlwt.Font()# 设置字体样式(font)
pattern = xlwt.Pattern() #背景颜色设置
- 字体样式
font.name = '宋' # 指定字体 font.height = 300 # 和excel字体大小比例是1:20 font.bold = True # 字体是否加粗 font.underline = True # 字体是否下划线 font.struck_out = True # 字体是否有横线 font.italic = True # 是否斜体字 #0x01 #0x02 #0x03 #0x04 #0x05 font.family=0x01 #xlwt.Font.CHARSET_ANSI_LATIN = 0x00C #xlwt.Font.HARSET_SYS_DEFAULT= 0x01C #xlwt.Font.HARSET_SYMBOL= 0x02 #xlwt.Font.CHARSET_APPLE_ROMAN= 0x4D #xlwt.Font.CHARSET_ANSI_JAP_SHIFT_JIS= 0x80C #xlwt.Font.HARSET_ANSI_KOR_HANGUL= 0x81 #xlwt.Font.CHARSET_ANSI_KOR_JOHAB= 0x82 #xlwt.Font.CHARSET_ANSI_CHINESE_GBK= 0x86 #xlwt.Font.CHARSET_ANSI_CHINESE_BIG5= 0x88 #xlwt.Font.CHARSET_ANSI_GREEK= 0xA1 #xlwt.Font.CHARSET_ANSI_TURKISH= 0xA2 #xlwt.Font.CHARSET_ANSI_VIETNAMESE= 0xA3 #xlwt.Font.CHARSET_ANSI_HEBREW= 0xB1 #xlwt.Font.CHARSET_ANSI_ARABIC= 0xB2 #xlwt.Font.CHARSET_ANSI_BALTIC= 0xBA #xlwt.Font.CHARSET_ANSI_CYRILLIC= 0xCC #xlwt.Font.CHARSET_ANSI_THAI= 0xDE #xlwt.Font.CHARSET_ANSI_LATIN_II= 0xEE #xlwt.Font.CHARSET_OEM_LATIN_I= 0xFF font.charset = 0x86 #设置字符集 #可参考中的数值xlwt.Style.colour_map,colour_map属性返回一个字典,里面有颜色对应的序号font.colour_index =xlwt.Style.colour_map['blue'] font.colour_index = 4 # 字体颜色 # xlwt.Font.ESCAPEMENT_SUBSCRIPT 设置字体悬空位于下方 # xlwt.Font.ESCAPEMENT_SUPERSCRIPT 设置字体悬空位于上方 # xlwt.Font.ESCAPEMENT_NONE 设置字体没有这个效果 font.escapement= =xlwt.Font.ESCAPEMENT_SUPERSCRIPT font.num_format_str = '#,##0.00' # 设置文字模式 style.font = font # 设定字体样式
- 背景颜色设置
pattern = xlwt.Pattern() # 创建模式对象 #xlwt.Pattern.SOLID_PATTERN= 0x01 设置模式为实型 #xlwt.Pattern.NO_PATTERN= 0x00 设置模式为无模式 pattern.pattern = xlwt.Pattern.SOLID_PATTERN # 设置背景颜色模式 #可参考中的数值xlwt.Style.colour_map,colour_map属性返回一个字典,里面有颜色对应的序号pattern.pattern_fore_colour =xlwt.Style.colour_map['blue'] pattern.pattern_fore_colour = 3 # 前景色不会影响单元格的边框 pattern.pattern_back_colour = 0x41 # 后景会影响单元格的边框 style.pattern = pattern # 设定背景图案样式
# 设置背景色 xlwt.add_palette_colour("custom_colour", 0x21) workbook.set_colour_RGB(0x21, 219, 229, 241)
- 边框设置
borders = xlwt.Borders() borderinfo = borders._search_key() #可以设置的属性 prit(borderinfo) # 设定边框属性 # xlwt.Borders.NO_LINE = 0x00 无边框 # xlwt.Borders.THIN= 0x01 细实线 # xlwt.Borders.MEDIUM= 0x02 中实线 # xlwt.Borders.DASHED = 0x03中细虚线 # xlwt.Borders.DOTTED= 0x04 细虚线 # xlwt.Borders.THICK= 0x05 粗实线 # xlwt.Borders.DOUBLE0x06 双底线 # xlwt.Borders.HAIR= 0x07 细点虚线· # xlwt.Borders.MEDIUM_DASHED= 0x08 粗虚线 # xlwt.Borders.THIN_DASH_DOTTED= 0x09 细点划线 # xlwt.Borders.MEDIUM_DASH_DOTTED= 0x0A 粗点划线 # xlwt.Borders.THIN_DASH_DOT_DOTTED= 0x0B 细双点划线 # xlwt.Borders.MEDIUM_DASH_DOT_DOTTED= 0x0C 粗双点划线 # xlwt.Borders.SLANTED_MEDIUM_DASH_DOTTED= 0x0D 斜点划线 borders.left = xlwt.Borders.THIN borders.right = xlwt.Borders.THIN borders.top = xlwt.Borders.THIN borders.bottom = xlwt.Borders.THIN #0x00到0x0D。 border.left_colour = 0x40 border.top_colour = 0x40 border.right_colour = 0x40 border.bottom_colour = 0x40 style.borders = borders
- 对齐方式设置(alignment)
alignment = xlwt.Alignment() #xlwt.Alignment.VERT_TOP= 0x00 字体在单元格顶部 #xlwt.Alignment.VERT_CENTER= 0x01 字体垂直居中 #xlwt.Alignment.VERT_BOTTOM= 0x02 字体在单元格底部 #xlwt.Alignment.VERT_JUSTIFIED= 0x03 在合理的位置显示 #xlwt.Alignment.VERT_DISTRIBUTED= 0x04 有垂直居中的效果,如果字体超过单元格范围会垂直分布显示 alignment.vert = 0x01 #字体垂直位置 #xlwt.Alignment.HORZ_GENERAL = 0x00 正常显示 #xlwt.Alignment.HORZ_LEFT=0x01 左对齐 #xlwt.Alignment.HORZ_CENTER= 0x02 居中 #xlwt.Alignment.HORZ_RIGHT=0x03 右对齐 #xlwt.Alignment.HORZ_FILLED=0x04 填充单元格 #xlwt.Alignment.HORZ_JUSTIFIED=0x05 显示在合理的位置 #xlwt.Alignment.HORZ_CENTER_ACROSS_SEL=0x06 我觉得这个应该是显示在单元格的正当中 #xlwt.Alignment.HORZ_DISTRIBUTED=0x07 汉字时字体是水平 平均分布在表格中,如果是英文字母则是水平居中显示 alignment.horz = 0x03 #字体水平位置 #xlwt.Alignment.DIRECTION_GENERAL= 0x00 # BIFF8X 正常显示 #xlwt.Alignment.DIRECTION_LR= 0x01 #xlwt.Alignment.DIRECTION_RL= 0x02 alignment.dire = 0x00 #字体方向 #xlwt.Alignment.ORIENTATION_NOT_ROTATED= 0x00 #xlwt.Alignment.ORIENTATION_STACKED= 0x01 #xlwt.Alignment.ORIENTATION_90_CC= 0x02 #xlwt.Alignment.ORIENTATION_90_CW = 0x03 alignment.orie= 0x00 #xlwt.Alignment.WRAP_AT_RIGHT = 0x01 # 自动换行 #xlwt.Alignment.NOT_WRAP_AT_RIGHT= 0x00 # 默认不自动换行 alignment.wrap = 0x01 # 自动换行 #xlwt.Alignment.SHRINK_TO_FIT = 0x01 # 将字体缩小到适合单元格大小 #xlwt.Alignment.NOT_SHRINK_TO_FIT = 0x00 # 默认正常显示 alignment.shri = 0x01 #自动缩进 #xlwt.Alignment.WRAP_AT_RIGHT = 0x01 # 自动换行 #xlwt.Alignment.NOT_WRAP_AT_RIGHT= 0x00 # 默认不自动换行 alignment.wrap = 0x01 #自动换行 alignment.rota = 2 #旋转方向,值为数字,表示旋转的角度 alignment.inde = 0 alignment.merg = 0 style.alignment = alignment
- 设置单元格宽度
worksheet.col(col_index).width = 256 * len(col_str) * 2 # 设置列宽,计算列宽度:256是单元格基数*用数据长度*2最终的结果单元格的宽度和数据正好填满。
- 设置行样式
tall_style = xlwt.easyxf('font:height 600') # 设置行高 worksheet.row(row_index).set_style(tall_style) # 给第一行设置tall_style样式,也就是行高
worksheet.row(row_index).height_mismatch = True worksheet.row(row_index).height =20 * 30 #20是基数*30是行的高度
四、其他
- 将一个日期输入一个单元格
import datetime #'general' # 默认是此选项,常规显示。 #'0' #'0.00' #'#,##0', #'#,##0.00 #'"$"#,##0_);("$"#,##0)' #'"$"#,##0_);[Red]("$"#,##0)' #'"$"#,##0.00_);("$"#,##0.00)' #'"$"#,##0.00_);[Red]("$"#,##0.00)' #'0%' #'0.00%' #'0.00E+00' #'# ?/?' #'# ??/??' #'M/D/YY' #'D-MMM-YY' #'D-MMM' #'MMM-YY' #'h:mm AM/PM' #'h:mm:ss AM/PM' #'h:mm' #'h:mm:ss' #'M/D/YY h:mm' #'_(#,##0_);(#,##0)' #'_(#,##0_);[Red](#,##0)' #'_(#,##0.00_);(#,##0.00)' #'_(#,##0.00_);[Red](#,##0.00)' #'_("$"* #,##0_);_("$"* (#,##0);_("$"* "-"_);_(@_)' #'_(* #,##0_);_(* (#,##0);_(* "-"_);_(@_)' #'_("$"* #,##0.00_);_("$"* (#,##0.00);_("$"* "-"??_);_(@_)' #'_(* #,##0.00_);_(* (#,##0.00);_(* "-"??_);_(@_)' #'mm:ss' #'[h]:mm:ss' #'mm:ss.0' #'##0.0E+0' #'@' style.num_format_str = 'M/D/YY' worksheet.write(0, 0, datetime.date.today(), style) #时间类型的转换,把excel中时间转成python 时间(两种方式) xlrd.xldate_as_tuple(table.cell(2,2).value, 0) #转化为元组形式 xlrd.xldate.xldate_as_datetime(table.cell(2,2).value, 1) #直接转化为datetime对象 xlrd.xldate_as_tuple(d,0) #d 是从excel中读取出来的浮点数
- 添加一个公式
worksheet.write(0,2,xlwt.Formula('A1 * B1'),style)# 求乘积 worksheet.write(0,2,xlwt.Formula('SUM(A1:A3)'),style)# 求和函数 worksheet.write(0,2, xlwt.Formula('AVERAGE(C1:C3)'),style)# 求平均数
- 单元格中添加超链接
worksheet.write(0, 0, xlwt.Formula('HYPERLINK("https://www.baidu.com";"百度")'),style))
- 合并列和行
worksheet.write_merge(8, 10, 2, 4, '合并单元格', style)
- 插入图片
worksheet.insert_bitmap("mm.bmp",0,0)
- 数据保护,设置单元格数据保护之后,数据只能查看不能修改和编辑
protection = xlwt.Protection() protection.cell_locked = 1 # 设置单元格锁定 protection.formula_hidden = 1 # 设定隐藏单元格内公式 worksheet.set_protect(1) # 只有在st表设置为保护时才有效
- 颜色映射
xlwt.Style.colour_map.aqua=0x31 xlwt.Style.colour_map.black=0x08 xlwt.Style.colour_map.blu=0x0C xlwt.Style.colour_map.blue_gray=0x36 xlwt.Style.colour_map.bright_green=0x0B xlwt.Style.colour_map.brow=0x3C xlwt.Style.colour_map.coral=0x1D xlwt.Style.colour_map.cyan_ega=0x0F xlwt.Style.colour_map.dark_blue=0x12 xlwt.Style.colour_map.dark_blue_ega=0x12 xlwt.Style.colour_map.dark_green=0x3A xlwt.Style.colour_map.dark_green_ega=0x11 xlwt.Style.colour_map.dark_purple=0x1C xlwt.Style.colour_map.dark_red=0x10 xlwt.Style.colour_map.dark_red_ega=0x10 xlwt.Style.colour_map.dark_teal=0x38 xlwt.Style.colour_map.dark_yellow=0x13 xlwt.Style.colour_map.gold=0x33 xlwt.Style.colour_map.gray_ega=0x17 xlwt.Style.colour_map.gray25=0x16 xlwt.Style.colour_map.gray40=0x37 xlwt.Style.colour_map.gray50=0x17 xlwt.Style.colour_map.gray80=0x3F xlwt.Style.colour_map.green=0x11 xlwt.Style.colour_map.ice_blue=0x1F xlwt.Style.colour_map.indigo=0x3E xlwt.Style.colour_map.ivory=0x1A xlwt.Style.colour_map.lavender=0x2E xlwt.Style.colour_map.light_blue=0x30 xlwt.Style.colour_map.light_green=0x2A xlwt.Style.colour_map.light_orange=0x34 xlwt.Style.colour_map.light_turquoise=0x29 xlwt.Style.colour_map.light_yellow=0x2B xlwt.Style.colour_map.lime=0x32 xlwt.Style.colour_map.magenta_ega=0x0E xlwt.Style.colour_map.ocean_blue=0x1E xlwt.Style.colour_map.olive_ega=0x13 xlwt.Style.colour_map.olive_green=0x3B xlwt.Style.colour_map.orange=0x35 xlwt.Style.colour_map.pale_blue=0x2C xlwt.Style.colour_map.periwinkle=0x18 xlwt.Style.colour_map.pink=0x0E xlwt.Style.colour_map.plum=0x3D xlwt.Style.colour_map.purple_ega=0x14 xlwt.Style.colour_map.red=0x0A xlwt.Style.colour_map.rose=0x2D xlwt.Style.colour_map.sea_green=0x39 xlwt.Style.colour_map.silver_ega=0x16 xlwt.Style.colour_map.sky_blue=0x28 xlwt.Style.colour_map.tan=0x2F xlwt.Style.colour_map.teal=0x15 xlwt.Style.colour_map.teal_eg=0x15 xlwt.Style.colour_map.turquoise=0x0F xlwt.Style.colour_map.violet=0x14 xlwt.Style.colour_map.white=0x09 xlwt.Style.colour_map.yellow=0x0D