Python xlrd/xlwt 创建excel文件及常用操作


Posted in Python onSeptember 24, 2020

一、创建excel代码

备注:封装好了(可直接调用)

"""
-*- coding:utf-8 -*-
@Time :2020/8/20 21:02
@Author :Jarvis
@File :jar_excel_util.py
@Version:1.0
"""
from typing import List

import xlwt


class JarExcelUtil:
 def __init__(self, header_list: List[list]):
  """
  :param header_list: 如下格式
   例1:默认列宽
   header_list = [
    ['序号'], # 表格第0列[此列表头名称]
    ['姓名'],
    ['性别'],
    ['爱好'],
    ['生日']
   ]
   例2:自定义列宽(列宽值为int类型 英文字符长度 如:10 表示列宽为10个英文字符长度)
   header = [
    ['序号', 5], # 表格第0列[此列表头名称,列宽]
    ['姓名', 10], # 表格第1列[此列表头名称,列宽]
    ['性别', 10],
    ['爱好', 10],
    ['生日', 20]
   ]
  """
  self.data = header_list
  self.__color_str = 'aqua 0x31\r\n\
black 0x08\r\n\
blue 0x0C\r\n\
blue_gray 0x36\r\n\
bright_green 0x0B\r\n\
brown 0x3C\r\n\
coral 0x1D\r\n\
cyan_ega 0x0F\r\n\
dark_blue 0x12\r\n\
dark_blue_ega 0x12\r\n\
dark_green 0x3A\r\n\
dark_green_ega 0x11\r\n\
dark_purple 0x1C\r\n\
dark_red 0x10\r\n\
dark_red_ega 0x10\r\n\
dark_teal 0x38\r\n\
dark_yellow 0x13\r\n\
gold 0x33\r\n\
gray_ega 0x17\r\n\
gray25 0x16\r\n\
gray40 0x37\r\n\
gray50 0x17\r\n\
gray80 0x3F\r\n\
green 0x11\r\n\
ice_blue 0x1F\r\n\
indigo 0x3E\r\n\
ivory 0x1A\r\n\
lavender 0x2E\r\n\
light_blue 0x30\r\n\
light_green 0x2A\r\n\
light_orange 0x34\r\n\
light_turquoise 0x29\r\n\
light_yellow 0x2B\r\n\
lime 0x32\r\n\
magenta_ega 0x0E\r\n\
ocean_blue 0x1E\r\n\
olive_ega 0x13\r\n\
olive_green 0x3B\r\n\
orange 0x35\r\n\
pale_blue 0x2C\r\n\
periwinkle 0x18\r\n\
pink 0x0E\r\n\
plum 0x3D\r\n\
purple_ega 0x14\r\n\
red 0x0A\r\n\
rose 0x2D\r\n\
sea_green 0x39\r\n\
silver_ega 0x16\r\n\
sky_blue 0x28\r\n\
tan 0x2F\r\n\
teal 0x15\r\n\
teal_ega 0x15\r\n\
turquoise 0x0F\r\n\
violet 0x14\r\n\
white 0x09\r\n\
yellow 0x0D'
  self.color_list = [] # [[]] [['aqua', '0x31'], ['black', '0x08'], ...]
  for color in self.__color_str.split('\r\n'):
   color = color.split(' ')
   self.color_list.append(color)

 def write(self, out_file, data_body: List[list], sheet_name='sheet', frozen_row: int = 1, frozen_col: int = 0):
  """
  写入数据
  :param out_file: 保存文件(如:test.xlsx)
  :param data_body: data_body[0]为表格第0行数据 data_body[0][0]为表格第0行第0列单元格值
  :param sheet_name:
  :param frozen_row: 冻结行(默认首行)
  :param frozen_col: 冻结列(默认不冻结)
  """
  # step1 判断数据正确性(每行列数是否与表头相同)
  count = 0
  for pro in data_body:
   if len(pro) != len(self.data):
    raise Exception(
     'data_body数据错误 第{}行(从0开始) 需为{}个元素 当前行{}个元素:{}'.format(count, len(self.data), len(pro), str(pro)))
   count += 1

  # step2 写入数据
  wd = xlwt.Workbook()
  sheet = wd.add_sheet(sheet_name)

  ali_horiz = 'align: horiz center' # 水平居中
  ali_vert = 'align: vert center' # 垂直居中
  fore_colour = 'pattern: pattern solid,fore_colour pale_blue' # 设置单元格背景色为pale_blue色
  # 表头格式(垂直+水平居中、表头背景色)
  style_header = xlwt.easyxf('{};{};{}'.format(fore_colour, ali_horiz, ali_vert))

  # 表体格式(垂直居中)
  style_body = xlwt.easyxf('{}'.format(ali_vert))

  # 表头
  for col in self.data:
   # 默认列宽
   if len(col) == 1:
    sheet.write(0, self.data.index(col), str(col[0]), style_header)
   # 自定义列宽
   if len(col) == 2:
    sheet.write(0, self.data.index(col), str(col[0]), style_header)
    # 设置列宽
    sheet.col(self.data.index(col)).width = 256 * col[1] # 256为基数 * n个英文字符
  # 行高(第0行)
  sheet.row(0).height_mismatch = True
  sheet.row(0).height = 20 * 20 # 20为基数 * 20榜

  # 表体
  index = 1
  for pro in data_body:
   sheet.row(index).height_mismatch = True
   sheet.row(index).height = 20 * 20 # 20为基数 * 20榜
   for d in self.data:
    value = pro[self.data.index(d)]
    # 若值类型是int、float 直接写入 反之 转成字符串写入
    if type(value) == int or type(value) == float:
     sheet.write(index, self.data.index(d), value, style_body)
    else:
     sheet.write(index, self.data.index(d), str(value), style_body)
   index += 1
  # 冻结(列与行)
  sheet.set_panes_frozen('1')
  sheet.set_horz_split_pos(frozen_row) # 冻结前n行
  sheet.set_vert_split_pos(frozen_col) # 冻结前n列

  wd.save(out_file)

 def color_test(self):
  """
  测试颜色
  """
  body_t = []
  for color in self.color_list:
   print(color)
   body_t.append(color)
  wd = xlwt.Workbook()
  sheet = wd.add_sheet('sheet')

  index = 0
  for b in body_t:
   ali = 'align: horiz center;align: vert center' # 垂直居中 水平居中
   fore_colour = 'pattern: pattern solid,fore_colour {}'.format(
    self.color_list[index][0]) # 设置单元格背景色为pale_blue色
   style_header = xlwt.easyxf(
    '{};{}'.format(fore_colour, ali))
   sheet.write(index, 0, str(b), style_header)
   sheet.col(0).width = 256 * 150 # 256为基数 * n个英文字符
   index += 1

  wd.save('颜色测试.xlsx')


# 测试颜色
# if __name__ == '__main__':
#  header_t = [
#   ['颜色']
#  ]
#  JarExcelUtil(header_t).color_test()

if __name__ == '__main__':
 header = [
  ['序号', 5],
  ['姓名', 10],
  ['性别', 10],
  ['爱好', 10],
  ['生日', 20]
 ]

 # header = [
 #  ['序号'],
 #  ['姓名'],
 #  ['性别'],
 #  ['爱好'],
 #  ['生日']
 # ]

 body = [
  [1, '张三', '男', '篮球', '1994-07-23'],
  [2, '李四', '女', '足球', '1994-04-03'],
  [3, '王五', '男', '兵乓球', '1994-09-13']
 ]

 JarExcelUtil(header_list=header).write(out_file='测试.xlsx', data_body=body)

二、效果

生成的Excel

Python xlrd/xlwt 创建excel文件及常用操作

三、常用操作

3.1、设置行高

# 行高(第0行)
sheet.row(0).height_mismatch = True
sheet.row(0).height = 20 * 20 # 20为基数 * 20榜

3.2、设置列宽

# 列宽(第0列)
sheet.col(0).width = 256 * 30 # 256为基数 * 30个英文字符(约)

3.3、冻结(列与行)

# 冻结(列与行)
sheet.set_panes_frozen('1')
sheet.set_horz_split_pos(2) # 冻结前2行
sheet.set_vert_split_pos(3) # 冻结前3列
  
# 冻结首行
sheet.set_panes_frozen('1')
sheet.set_horz_split_pos(1) # 冻结前1行(即首行)

3.4、设置单元格对齐方式

# 方式1
style_1 = xlwt.XFStyle()
al_1 = xlwt.Alignment()
al_1.horz = xlwt.Alignment.HORZ_CENTER # 水平居中
al_1.vert = xlwt.Alignment.VERT_CENTER # 垂直居中
style_1.alignment = al_1
sheet.write(0, 0, '第0行第0列单元格值', style_1)
  
# 方式2(推荐)
ali_horiz = 'align: horiz center' # 水平居中
ali_vert = 'align: vert center' # 垂直居中
style_2 = xlwt.easyxf('{};{}'.format(ali_horiz, ali_vert))
sheet.write(0, 0, '第0行第0列单元格值', style_2)

3.5、设置单元格背景色

# 设置单元格背景色
fore_colour = 'pattern: pattern solid,fore_colour pale_blue' # 设置单元格背景色为pale_blue色 (具体颜色值 参考上面代码JarExcelUtil类中的color_test方法的运行结果)
style = xlwt.easyxf('{}'.format(fore_colour))
sheet.write(0, 0, '第0行第0列单元格值', style)

以上就是Python xlrd/xlwt 创建excel文件及常用操作的详细内容,更多关于python 操作excel的资料请关注三水点靠木其它相关文章!

Python 相关文章推荐
初学python数组的处理代码
Jan 04 Python
使用Python对IP进行转换的一些操作技巧小结
Nov 09 Python
Python实现通过文件路径获取文件hash值的方法
Apr 29 Python
致Python初学者 Anaconda入门使用指南完整版
Apr 05 Python
使用python绘制二元函数图像的实例
Feb 12 Python
Python 迭代,for...in遍历,迭代原理与应用示例
Oct 12 Python
用openCV和Python 实现图片对比,并标识出不同点的方式
Dec 19 Python
PyQt5 控件字体样式等设置的实现
May 13 Python
在pycharm中使用matplotlib.pyplot 绘图时报错的解决
Jun 01 Python
详解如何在pyqt中通过OpenCV实现对窗口的透视变换
Sep 20 Python
python os.listdir()乱码解决方案
Jan 31 Python
python 实现体质指数BMI计算
May 26 Python
安装并免费使用Pycharm专业版(学生/教师)
Sep 24 #Python
Pycharm学生免费专业版安装教程的方法步骤
Sep 24 #Python
python 多线程共享全局变量的优劣
Sep 24 #Python
改变 Python 中线程执行顺序的方法
Sep 24 #Python
浅析Python 字符编码与文件处理
Sep 24 #Python
学生如何注册Pycharm专业版以及pycharm的安装
Sep 24 #Python
python判断元素是否存在的实例方法
Sep 24 #Python
You might like
php二分法在IP地址查询中的应用
2008/08/12 PHP
9个比较实用的php代码片段
2016/03/15 PHP
PHP面向对象程序设计组合模式与装饰模式详解
2016/12/02 PHP
PHP实现找出链表中环的入口节点
2018/01/16 PHP
php设计模式之组合模式实例详解【星际争霸游戏案例】
2020/03/27 PHP
Js 弹出框口并返回值的两种常用方法
2010/12/30 Javascript
jQuery1.3.2 升级到jQuery1.4.4需要修改的地方
2011/01/06 Javascript
基于jquery的内容循环滚动小模块(仿新浪微博未登录首页滚动微博显示)
2011/03/28 Javascript
5个最佳的Javascript日期处理类库分享
2012/04/15 Javascript
dotopAlert 提示用户需安装播放器的代码
2012/09/17 Javascript
基于jquery插件实现常见的幻灯片效果
2013/11/01 Javascript
正则表达式中特殊符号及正则表达式的几种方法总结(replace,test,search)
2013/11/26 Javascript
Javascript中3个需要注意的运算符
2015/04/02 Javascript
javascript中递归函数用法注意点
2015/07/30 Javascript
ajax跨域调用webservice的实现代码
2016/05/09 Javascript
JavaScript知识点总结(十)之this关键字
2016/05/31 Javascript
Vue中控制v-for循环次数的实现方法
2018/09/26 Javascript
Angular7.2.7路由使用初体验
2019/03/01 Javascript
Javascript组合继承方法代码实例解析
2020/04/02 Javascript
python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等
2019/07/19 Python
python 动态迁移solr数据过程解析
2019/09/04 Python
wxPython多个窗口的基本结构
2019/11/19 Python
使用python 计算百分位数实现数据分箱代码
2020/03/03 Python
PIL.Image.open和cv2.imread的比较与相互转换的方法
2020/06/03 Python
基于python实现计算两组数据P值
2020/07/10 Python
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
美国用餐电影院:Alamo Drafthouse Cinema
2020/01/23 全球购物
俄罗斯家居用品购物网站:Евродом
2020/11/21 全球购物
公司年会搞笑主持词
2014/03/24 职场文书
单位委托书
2014/10/15 职场文书
2014年新农村建设工作总结
2014/12/01 职场文书
2014年挂职干部工作总结
2014/12/06 职场文书
无罪辩护词范文
2015/05/21 职场文书
三八节活动主持词
2015/07/04 职场文书
六一儿童节新闻稿
2015/07/17 职场文书
numpy数据类型dtype转换实现
2021/04/24 Python