python对excel进行读写操作

python对excel进行读写操作

  • 欢迎使用Markdown编辑器
  • 一、安装库
  • 1.安装xlrd模块
  • 2.安装xlwt模块
  • 2.安装openpyxl模块
  • 补充(多个python版本)
  • 二、使用介绍
  • 1、常用单元格中的数据类型
  • 2、导入模块
  • 3、Excel文件基础操作(读取excel数据)
  • 3.1 打开Excel文件读取数据(所有工作簿sheet)
  • 3.2获取工作簿sheet名称
  • 3.3获取指定工作簿的行和列值
  • 3.4获取指定单元格的内容
  • 3.5获取单元内容为日期类型的方式
  • 3.6获取合并单元格的内容
  • 3.7函数
  • 4、Excel文件基础操作(写入excel数据)
  • 4.1创建Excel文件和sheeet工作簿
  • 4.2对指定excel写入数据
  • 4.3保存文件
  • 4.4自定义字体样式设置
  • 4.5设置单元格的宽度
  • 4.6
  • 4.7
  • 4.8
  • 三、
  • python操作excel主要用到xlrd和xlwt这两个库,xlrd是读excel,xlwt是写excel的库。

    欢迎使用Markdown编辑器

    你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章,了解一下Markdown的基本语法知识。

    一、安装库

    想要实现对excel文件的读写功能,需要安装一些库。下面三个库对excel进行读写操作必不可少。
    1.xlwt:对xls等excel文件的写入
    2.xlrd:对xls等excel文件的读取
    3.openpyxl:对xlsm、xlsx等excel文件进行读写操作
    4.xlutils结合xlrd可以达到修改excel文件目的
    5.xlsxwriter可以写excel文件并加上图表

    1.安装xlrd模块

    到python官网下载http://pypi.python.org/pypi/xlrd模块安装,前提是已经安装了python 环境。
    或者在cmd窗口 pip install xlrd

    #查看版本
    pip list
    #安装指定版本
    pip install xlrd == 1.2.0
    #卸载
    pip uninstall xlrd
    
    

    2.安装xlwt模块

    到python官网下载http://pypi.python.org/pypi/xlwt模块安装,前提是已经安装了python 环境。
    或者在cmd窗口 pip install xlwt

    2.安装openpyxl模块

    或者在cmd窗口 pip install openpyxl

    补充(多个python版本)

    使用pip安装第三方模块
      1.python2.x: cmd窗口输入python -m pip install 模块名
        如 python -m pip install requests
      2.python3.x: cmd窗口输入python3 -m pip install 模块名
        如 python3 -m pip install requests

    二、使用介绍

    操作excel表格如图所示
    操作工作簿如图所示
    操作文件位于桌面

    1、常用单元格中的数据类型

    0 – empty(空的) 1 – string(text) 2 – number 3 – date 4 – boolea 5 – error 6 – blank(空白表格)

    2、导入模块

    import xlrd
    import xlwt

    3、Excel文件基础操作(读取excel数据)

    #判断文件是否存在
    print os.path.exists([路径/文件名]);
    

    3.1 打开Excel文件读取数据(所有工作簿sheet)

    data = xlrd.open_workbook(filename)

    import xlrd;#对excel数据进行读取的库
    workbook= xlrd.open_workbook(r'C:\Users\Administrator\Desktop\999.xls')
    

    #文件名以及路径,如果路径或者文件名有中文给前面加一个r拜师原生字符。
    #使用r就防止了\n的转义。

    3.2获取工作簿sheet名称

    print workbook.sheet_names()#输出sheet名[u'Sheet1', u'test', u'Sheet3']
    

    #根据下标获取sheet名称
    sheet_name=workbook.sheet_names()[0]
    print sheet_name
    
    #根据sheet索引获取sheet内容,同时获取sheet名称、行数nrows、列数ncols
    sheet1 = workbook.sheet_by_index(0)
    print sheet1.name,sheet1.nrows,sheet1.ncols
    #根据sheet名称获取sheet内容,同时获取sheet名称、行数nrows、列数ncols
    sheet1 = workbook.sheet_by_name('999')
    print sheet1.name,sheet1.nrows,sheet1.ncols
    

    3.3获取指定工作簿的行和列值

    #根据sheet名称获取整行和整列的值

    sheetData= workbook.sheet_by_name('test')
    rows = sheetData.row_values(3)#第四行
    cols = sheetData.col_values(0)#第一列
    print rows
    print cols
    print workbook.sheet_names()
    

    3.4获取指定单元格的内容

    #sheetData= workbook.sheet_by_name('test')
    print sheetData.cell(0,0).value#第一行第列
    print sheetData.cell(9,0).value
    print sheetData.cell_value(8,3)
    print sheetData.row(7)[3].value
    


    中文转码,在python文件首行加(#--coding:UTF-8-sig –-)字符.首行首行注意。

    如果不行的话,可加。encode(‘UTF-8’)进行转码例如:
    sheet2.cell(0,0).value.encode(‘UTF-8’)

    #获取单元格内容的数据类型
    #(说明:ctype : 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error)

    print sheetData.cell(3,0).ctype #4行1列: 2 为number类型
    print sheetData.cell(3,1).ctype #4行2列: 3 为date类型
    print sheetData.cell(3,2).ctype #4行3列: 1 为string类型
    

    3.5获取单元内容为日期类型的方式

    #获取单元内容为日期类型的方式
    #使用xlrd的xldate_as_tuple处理为date格式,先判断表格的ctype=3时xlrd才能执行操作
    先导入日期时间类型的库

    from datetime import datetime,date
    
    print sheetData.cell(9,1).ctype#第四行第三列的类型
    print sheetData.cell(9,1).value#第四行第三列的值
    #使用xlrd的xldate_as_tuple处理为date格式,先判断表格的ctype=3时xlrd才能执行操作
    print xlrd.xldate_as_tuple(sheetData.cell_value(9,1),workbook.datemode)
    
    date_value = xlrd.xldate_as_tuple(sheetData.cell_value(9,1),workbook.datemode)
    print date(*date_value[:3])
    print date(*date_value[:3]).strftime('%Y/%m/%d')
    

    输出如图

    #如果是在脚本中需要获取并显示单元格内容为日期类型的,可以先做一个判断。
    #判断ctype是否等于3,如果等于3,则用时间格式处理:
    #if (sheetData.cell(row,col).ctype == 3):
    #date_value = xlrd.xldate_as_tuple(sheetData.cell_value(row,col),book.datemode)
    #date_tmp = date(*date_value[:3]).strftime(’%Y/%m/%d’)

    if (sheetData.cell(8,1).ctype == 3):
      date_value = xlrd.xldate_as_tuple(sheetData.cell_value(8,1),workbook.datemode)
      date_tmp = date(*date_value[:3]).strftime('%Y.%m.%d')
      print date_value
      print date_tmp
    

    3.6获取合并单元格的内容

    #获取合并单元格的内容
    print sheetData.cell(11,0).value #第12行1,2,3列是合并单元格
    print sheetData.cell(11,1).value #第12行1,2,3列是合并单元格
    print sheetData.cell(11,2).value #第12行1,2,3列是合并单元格
    print sheetData.cell(2,2).value #第3,4行的第3列是合并单元格
    print sheetData.cell(3,2).value #第3,4行的第3列是合并单元格
    print sheetData.cell(4,2).value #第5,6,7行的第3列是合并单元格
    print sheetData.cell(5,2).value #第5,6,7行的第3列是合并单元格
    print sheetData.cell(6,2).value #第5,6,7行的第3列是合并单元格
    

    print sheetData.row_values(11)#输出第12行所有数据
    


    #在这里有个问题,合并单元格例如第12行1,2,3列只能获取
    #第12行的第1列的值而第2,3列获取的内容为空,
    #而第3,4行的第3列是合并单元格则只能获取
    #第3行的第3列的值而第4列获取的内容为空,
    #那么该如何处理呢

    #可以利用merged_cells方法进行处理,处理的方法是只能获取合并单元格的
    #第一个cell的行列索引,才能读到值,读错了就是空值。即合并行单元格读取
    #行的第一个索引,合并列单元格读取列的第一个索引。
    #这里,需要在读取文件的时候添加个参数,将formatting_info参数设置为True,
    #默认是False,否则可能调用merged_cells方法获取到的是空值。

    workbook = xlrd.open_workbook(r'C:\Users\Administrator\Desktop\999.xls',formatting_info=True) 
    sheetData = workbook.sheet_by_name('test') 
    print sheetData.merged_cells
    


    #merged_cells返回的这四个参数的含义是:(row,row_range,col,col_range),
    #merged_cells 返回的是一个列表,每一个元素是合并单元格的位置信息的数组,
    #merged_cells返回的是一个数组,数组包含四个元素(起始行索引,结束行索引,起始列索引,结束列索引)
    #其中[row,row_range)包括row,不包括row_range,col也是一样,下标从0开始。
    #即(11, 12, 0, 3),的含义是:第12行,1到3列合并,
    #(2, 4, 2, 3),的含义是:第3到4行合并,
    #(4, 7, 2, 3),的含义是:第5到7行合并,
    #(7, 11, 2, 3)的含义是:第8到11行合并,
    #利用这个,可以分别获取合并的四个单元格的内容:
    #[(11, 12, 0, 3), (2, 4, 2, 3), (4, 7, 2, 3), (7, 11, 2, 3)]

    print sheetData.cell(11,0).value #(11, 12, 0, 3)第12行1,2,3列是合并单元格
    print sheetData.cell(11,1).value #第12行1,2,3列是合并单元格
    print sheetData.cell(11,2).value #第12行1,2,3列是合并单元格
    print sheetData.cell(2,2).value #(2, 4, 2, 3)第3,4行的第3列是合并单元格
    print sheetData.cell(3,2).value #第3,4行的第3列是合并单元格
    print sheetData.cell(4,2).value #(4, 7, 2, 3)第5,6,7行的第3列是合并单元格
    print sheetData.cell(5,2).value #第5,6,7行的第3列是合并单元格
    print sheetData.cell(6,2).value #第5,6,7行的第3列是合并单元格
    

    #发现规律了吗!是的,获取merge_cells返回的row和col低位的索引! 于是可以:
    #merge = []
    #for (rlow,rhigh,clow,chigh) in sheetData.merged_cells:
    #merge.append([rlow,clow])
    (merge函数,后续补充)

    #[(11, 12, 0, 3), (2, 4, 2, 3), (4, 7, 2, 3), (7, 11, 2, 3)]
    
    merge = []
    for (rlow,rhigh,clow,chigh) in sheetData.merged_cells:
      merge.append([rlow,clow])
      print "000000000"
    print "111111111"
    merge
    [[11, 0], [2,2], [4,2], [7,2]]
    print "22222222222"
    for index in merge:
      print "33333333333"
      print sheetData.cell_value(index[2],index[3])
    

    3.7函数

    #使用def函数注意缩进格式相同,否则会报错
    我创建了一个test.py文件,并写入代码,保存。下面就先介绍main吧。
    1.首先main 函数的意义
    通俗的理解__name__ == ‘main’: test.py,相当于(name == ‘test’);
    name__是内置变量,可用于反映一个包的结构层次。
    name__是内置变量,可用于表示当前模块的名字。
    当一个.py文件(模块)被直接运行时,若没有包结构,则__name__值为__main
    ,即模块名为__main

    if name == ‘main’:的意思是:
    当test.py文件被直接运行时,if name == ‘main’:之下的代码块将被运行;
    当test.py文件以模块形式被导入时,if name == ‘main’:之下的代码块不被运行。
    2.程序入口
    一般来说,对编程语言而言,程序都必须要有一个入口,比如C,C++,以及完全面向对象的编程语言Java,C#等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C,C++都有一个main函数作为程序入口,也就是程序的运行会从main函数开始。同样,Java,C#则有一个包含Main方法的主类,作为程序入口。
    而Python不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。
    一个Python源码文件(.py)除了可以被直接运行外,还可以作为模块(也就是库),被其他.py文件导入。不管是直接运行还是被导入,.py文件的最顶层代码都会被运行(Python用缩进来区分代码层次),而当一个.py文件作为模块被导入时,我们可能不希望一部分代码被运行。
    所以,实际上if name == 'main’相当于Python模拟的程序入口,Python本身并没有这么规定,这只是一种编码习惯。由于模块之间相互引用,不同模块可能有这样的定义,而程序入口只有一个。到底哪个程序入口被选中,这取决于__name__的值。

    3.引用其他.py文件
    from 【.py文件名称】 import 【变量】

    from test import excel_name
    

    if name == ‘main’:
    try:
    main()
    except KeyboardInterrupt:
    sys.stderr.write(“User interrupt me! 😉 Bye!\n”)
    sys.exit(0)
    4.Python程序的运行方式
    Python的-m参数用于将一个模块或者包作为一个脚本运行,而__main__.py文件相当于是一个包的“入口程序“。
    运行Python程序的两种方式
    python xxx.py,直接运行xxx.py文件
    python -m xxx.py,把xxx.py当做模块运行
    假设我们有一个文件run.py,内容如下:

    import sys
    print(sys.path)
    

    直接运行方式是把run.py文件所在的目录放到了sys.path属性中
    模块方式运行是把你输入命令的目录(也就是当前工作路径),放到了 sys.path 属性中。
    所以以模块方式运行会多出一行No module named run.py的错误。因为以模块方式运行时,Python先对run.py执行一遍 import,所以print(sys.path)被成功执行,然后Python才尝试运行run.py模块,但是在path变量中并没有run.py这个模块,所以报错。正确的运行方式,应该是python -m run。

    5 main.py的作用
    举个例子,假设我们有如下一个包package:
    package
    ├── init.py
    └── main.py
    其中,文件__init__.py的内容
    import sys
    print(“init”)
    print(sys.path)

    其中,文件__main__.py的内容
    import sys
    print(“main”)
    print(sys.path)

    接下来,我们运行这个package,使用python -m package运行,输出结果:
    init
    [’’, …]
    main
    [’’, …]

    使用python package运行,输出结果:
    main
    [‘package’, …]

    总结:
    1、 加上 -m 参数时,Python会把当前工作目录添加到 sys.path 中,而不加-m 时,Python会把脚本所在目录添加到 sys.path 中。
    2、 加上 -m 参数时, Python 会先将模块或者包导入,然后再执行
    3、 main.py 文件是一个包或者目录的入口程序。不管是用 python package 还是用 python -m package 运行时,main.py 文件总是被执行。
    参考文章
    https://blog.konghy.cn/2017/04/24/python-entry-program/.

    3.8 定义数组
    temp_sort = [(‘a’, 1, 1.5),
    (‘b’, 2, 5.1),
    (‘c’, 9, 4.3)]

    
    

    4、Excel文件基础操作(写入excel数据)

    4.1创建Excel文件和sheeet工作簿

    对excel进行写入操作时,需关闭excel文件,否则会报错IO

    import xlwt;#对excel数据进行写入的库
    writebook = xlwt.Workbook(encoding='utf-8')#生成excel文件并设置编码为utf8
    sheet1 = writebook.add_sheet('Sheet1',cell_overwrite_ok=True)#创建第一个sheet 表单
    

    4.2对指定excel写入数据

    #file.write(str)将字符串写入文件,返回的是写入的字符长度。
    sheet1.write(0,0,"0.0")#第一行第一列
    sheet1.write(0,1,"0.1")#第一行第二列
    sheet1.write(1,0,"1.0")#第2行第一列
    sheet1.write(1,1,"1.1")#第2行第二列
    

    4.3保存文件

    data = xlrd.open_workbook(filename)#文件名以及路径,如果路径或者文件名有中文给前面加一个r拜师原生字符,防止了\n转义。

    #保存ExcelBook.save('path/文件名称.xls')
    writebook.save(r'C:\Users\Administrator\Desktop\999.xls')
    #关闭保存文件
    writebook.close()
    

    4.4自定义字体样式设置

    style = xlwt.XFStyle()  #初始化样式
    font = xlwt.Font()  #初始化字体
    font.name = 'Times New Roman'  #使用字体的名称
    font.bold = True  #字体加粗
    font.underline = True  #字体加下划线
    font.italic = True  #斜体字
    
    style.font = font  #设定样式使用的字体
    
    sheet = writebook.add_sheet('Sheet1',cell_overwrite_ok=True)
    sheet.write(1,0,"1.0")
    sheet.write(1,1,"1.1")
    sheet.write(0,0, '默认字体不带样式')#不带样式的表单内容
    sheet.write(0,1, '黑体字下划线', style)#带样式的表单内容
    

    4.5设置单元格的宽度

    4.6

    4.7

    4.8

    三、

    来源:起床困难hu

    物联沃分享整理
    物联沃-IOTWORD物联网 » python对excel进行读写操作

    发表评论