python openpyxl使用方法详解


Posted in Python onJuly 18, 2019

openpyxl特点

openpyxl(可读写excel表)专门处理Excel2007及以上版本产生的xlsx文件,xls和xlsx之间转换容易 注意:如果文字编码是“gb2312” 读取后就会显示乱码,请先转成Unicode

1、openpyxl 读写单元格时,单元格的坐标位置起始值是(1,1),即下标最小值为1,否则报错!

tableTitle = ['userName', 'Phone', 'age', 'Remark']

 # 维护表头
 #  if row < 1 or column < 1:
 #   raise ValueError("Row or column values must be at least 1")
 # 如上,openpyxl 的首行、首列 是 (1,1)而不是(0,0),如果坐标输入含有小于1的值,提示 :Row or column values must be at least 1,即最小值为1.
 for col in range(len(tableTitle)):
  c = col + 1
  ws.cell(row=1, column=c).value = tableTitle[col]

2、openpyxl 支持直接横纵坐标访问,如A1,B2...

ws['A4'] = 4 #直接赋值

openpyxl操作excel

Excel文件三个对象

  • workbook: 工作簿,一个excel文件包含多个sheet。
  • sheet:工作表,一个workbook有多个,表名识别,如“sheet1”,“sheet2”等。
  • cell: 单元格,存储数据对象

1、新建表

A workbook至少创建一个worksheet.

通过openpyxl.workbook.Workbook.active()得到worksheet

wb = Workbook(encoding='UTF-8')

ws = wb.active

注意:

该方法使用_active_sheet_index属性, 默认会设置0,也就是第一个worksheet。除非手动修改,否则使用active方法得到都是第一个worksheet。

你也可以创建worksheets,通过 openpyxl.workbook.Workbook.create_sheet() 方法:

ws = wb.create_sheet("Mysheet") #插入到最后(default)
#或者
 ws = wb.create_sheet("Mysheet", 0) #插入到最开始的位置

创建的sheet的名称会自动创建,按照sheet,sheet1,sheet2自动增长,通过title属性可以修改其名称。

ws.title = "New Title"
ws = wb.create_sheet(title="Pip")

默认的sheet的tab是白色的,可以通过 RRGGBB颜色来修改sheet_properties.tabColor属性从而修改sheet tab按钮的颜色:

ws.sheet_properties.tabColor = "1072BA"

当你设置了sheet的名称,可以将其看成workbook中的一个key。也可以使用openpyxl.workbook.Workbook.get_sheet_by_name() 方法

单元格赋值

#设定单元格的值,三种方式
sheet.cell(row=2,column=5).value=99
sheet.cell(row=3,column=5,value=100)
ws['A4'] = 4 #write

逐行写

ws.append(iterable)
 #添加一行到当前sheet的最底部(即逐行追加从第一行开始) iterable必须是list,tuple,dict,range,generator类型的。 1,如果是list,将list从头到尾顺序添加。 2,如果是dict,按照相应的键添加相应的键值。
 ws.append([‘This is A1', ‘This is B1', ‘This is C1'])
 ws.append({‘A' : ‘This is A1', ‘C' : ‘This is C1'})
 ws.append({1 : ‘This is A1', 3 : ‘This is C1'})

2、读表操作

#打开文件:
from openpyxl import load_workbook
excel=load_workbook('E:/test.xlsx')
#获取sheet:
table = excel.get_sheet_by_name('Sheet1')  #通过表名获取 
#获取行数和列数:
rows=table.max_row  #获取行数
cols=table.max_column  #获取列数
#获取单元格值:
Data=table.cell(row=row,column=col).value #获取表格内容,是从第一行第一列是从1开始的,注意不要丢掉 .value
#通过名字
  ws = wb["frequency"] 
  #等同于 ws2 = wb.get_sheet_by_name('frequency')
  #不知道名字用index
  sheet_names = wb.get_sheet_names()
  ws = wb.get_sheet_by_name(sheet_names[index])# index为0为第一张表 
#或者
  ws =wb.active
  # 等同于 ws = wb.get_active_sheet() #通过_active_sheet_index设定读取的表,默认0读第一个表
  #活动表表名
  wb.get_active_sheet().title

单元格使用

c = ws['A4'] 
d = ws.cell(row = 4, column = 2) #行列读写

逐行读取

#逐行读
    ws.iter_rows(range_string=None, row_offset=0, column_offset=0): range-string(string)-单元格的范围:例如('A1:C4') row_offset-添加行 column_offset-添加列 
  # 返回一个生成器, 注意取值时要用value,例如:
  for row in ws.iter_rows('A1:C2'):
    for cell in row:
      print cell
  #读指定行、指定列:
  rows=ws.rows#row是可迭代的 
  columns=ws.columns#column是可迭代的
  #打印第n行数据 
  print rows[n]#不需要用.value 
  print columns[n]#不需要用.value

显示有多少张表

wb.get_sheet_names() 
#显示表名,表行数,表列数  
print ws.title 
print ws.max_row
print ws.max_column

公式计算formulae

ws["A1"] = "=SUM(1, 1)"
ws["A1"] = "=SUM(B1:C1)"

3、操作实例

#-*-coding:utf-8-*-
# Time:2017/9/21 19:02
# Author:YangYangJun


from openpyxl import Workbook
from openpyxl.reader.excel import load_workbook

import os
import time



def writeExcel():
  # 获取文件路径
  excelPath = os.path.join(os.getcwd(), 'ExcelData')
  print "****"
  print excelPath
  # 定义文件名称
  # invalid mode ('wb') or filename: 'Excel2017-09-21_20:15:57.xlsx'  这种方式明明文件,会提示保存失败,无效的文件名。
  # nameTime = time.strftime('%Y-%m-%d_%H:%M:%S')
  nameTime = time.strftime('%Y-%m-%d_%H-%M-%S')
  excelName = 'Excel' + nameTime + '.xlsx'
  ExcelFullName= os.path.join(excelPath,excelName)
  print ExcelFullName

  wb = Workbook()

  ws = wb.active

  tableTitle = ['userName', 'Phone', 'age', 'Remark']

  # 维护表头
  #    if row < 1 or column < 1:
  #     raise ValueError("Row or column values must be at least 1")
  # 如上,openpyxl 的首行、首列 是 (1,1)而不是(0,0),如果坐标输入含有小于1的值,提示 :Row or column values must be at least 1,即最小值为1.
  for col in range(len(tableTitle)):
    c = col + 1
    ws.cell(row=1, column=c).value = tableTitle[col]

  # 数据表基本信息
  tableValues = [['张学友', 15201062100, 18, '测试数据!'], ['李雷', 15201062598, 19, '测试数据!'],['Marry', 15201062191, 28, '测试数据!']]

  for row in range(len(tableValues)):
    ws.append(tableValues[row])
  #wb.save(ExcelFullName)
  wb.save(filename=ExcelFullName)
  return ExcelFullName

def readExcel(ExcelFullName):
  wb = load_workbook(ExcelFullName)
  #wb = load_workbook(filename=ExcelFullName)

  # 获取当前活跃的worksheet,默认就是第一个worksheet
  #ws = wb.active
  # 当然也可以使用下面的方法
  # 获取所有表格(worksheet)的名字
  sheets = wb.get_sheet_names()
  print sheets
  # # 第一个表格的名称
  sheet_first = sheets[0]
  # # 获取特定的worksheet
  #
  ws = wb.get_sheet_by_name(sheet_first)
  print "***"
  print sheet_first
  print ws.title
  print "^^^"
  # 获取表格所有行和列,两者都是可迭代的
  rows = ws.rows
  print rows

  columns = ws.columns
  # 迭代所有的行
  for row in rows:
    line = [col.value for col in row]
    print line

  # 通过坐标读取值

  print ws['A1'].value # A表示列,1表示行
  print ws.cell(row=1, column=1).value

if __name__ == '__main__':
  ExcelFullName = writeExcel()
  readExcel(ExcelFullName)
# 显示表名,表行数,表列数
print "Work Sheet Titile:", ws.title
print "Work Sheet Rows:", ws.max_row
print "Work Sheet Cols:", ws.max_column

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python求众数问题实例
Sep 26 Python
Python Web框架Flask下网站开发入门实例
Feb 08 Python
在IIS服务器上以CGI方式运行Python脚本的教程
Apr 25 Python
TensorFlow 实战之实现卷积神经网络的实例讲解
Feb 26 Python
Python+Selenium+phantomjs实现网页模拟登录和截图功能(windows环境)
Dec 11 Python
Python读取csv文件实例解析
Dec 30 Python
python3用urllib抓取贴吧邮箱和QQ实例
Mar 10 Python
PyQt5中向单元格添加控件的方法示例
Mar 24 Python
python一些性能分析的技巧
Aug 30 Python
在Python中字典按值排序的实现方法
Nov 12 Python
python开发一个解析protobuf文件的简单编译器
Nov 17 Python
如何判断pytorch是否支持GPU加速
Jun 01 Python
Python Django基础二之URL路由系统
Jul 18 #Python
使用django的objects.filter()方法匹配多个关键字的方法
Jul 18 #Python
Django基础三之视图函数的使用方法
Jul 18 #Python
详解python实现小波变换的一个简单例子
Jul 18 #Python
Django基础知识 URL路由系统详解
Jul 18 #Python
对Django项目中的ORM映射与模糊查询的使用详解
Jul 18 #Python
Django基础知识 web框架的本质详解
Jul 18 #Python
You might like
《星际争霸2》终章已出 RTS时代宣告终结
2017/02/07 星际争霸
PHP 强制下载文件代码
2010/10/24 PHP
php使用Jpgraph绘制简单X-Y坐标图的方法
2015/06/10 PHP
php自定义函数转换html标签示例
2016/09/29 PHP
PHP date()格式MySQL中插入datetime方法
2019/01/29 PHP
基于JQuery制作的产品广告效果
2010/12/08 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
打印json对象的内容及JSON.stringify函数应用
2013/03/29 Javascript
JavaScript动态加载样式表的方法
2015/03/21 Javascript
js闭包实现按秒计数
2015/04/23 Javascript
Javascript验证Visa和MasterCard信用卡号的方法
2015/07/27 Javascript
JS中使用mailto实现将用户在网页中输入的内容传递到本地邮件客户端
2016/10/08 Javascript
js中Generator函数的深入讲解
2019/04/07 Javascript
Python中使用ElementTree解析XML示例
2015/06/02 Python
python魔法方法-属性转换和类的表示详解
2016/07/22 Python
python读写json文件的简单实现
2017/04/11 Python
Python3.6实现连接mysql或mariadb的方法分析
2018/05/18 Python
python实现自动登录
2018/09/17 Python
python hook监听事件详解
2018/10/25 Python
python自制包并用pip免提交到pypi仅安装到本机【推荐】
2019/06/03 Python
django数据库自动重连的方法实例
2019/07/21 Python
Python基于正则表达式实现计算器功能
2020/07/13 Python
python如何操作mysql
2020/08/17 Python
利用css3-animation实现逐帧动画效果
2016/03/10 HTML / CSS
HTML5的Video标签有部分MP4无法播放的问题解析(多图)
2017/08/18 HTML / CSS
英国最出名高街品牌:Forever Unique
2018/02/24 全球购物
怎样让char类型的东西转换成int类型
2013/12/09 面试题
受欢迎的大学生自我评价
2013/12/05 职场文书
《尊严》教学反思
2014/02/11 职场文书
《挑山工》的教学反思
2014/02/16 职场文书
第一批党的群众路线教育实践活动工作总结
2014/03/03 职场文书
司法局群众路线教育实践活动开展情况总结
2014/10/25 职场文书
2014年行政助理工作总结
2014/11/19 职场文书
幼儿园个人总结
2015/02/28 职场文书
2016年党员岗位承诺书
2016/03/24 职场文书
MySQL系列之五 视图、存储函数、存储过程、触发器
2021/07/02 MySQL