目录

前言

Python处理Excel表格有多种方法,其中对于.xlsx后缀的Excel版本而言openpyxl绝对是一个非常棒的选择。在openpyxl中,一个Excel文件就是一个Workbook,一张Excel文件中的表就是一个Worksheet。当我们需要对一个Excel文件进行处理的时候,需要先获取到一个Workbook对象,再获取到一个Worksheet对象,对Worksheet对象中rows、columns进行数据处理,最后通过Workbook.save()方法将Workbook对象的内容写入到磁盘中。或者可以使用Openpyxl内置的ExcelWriter()方法来关联Workbook对象,最终实现写入。

软件系统

  • 系统

    • Windows 8.1
  • 软件
    • Python 3.4.3

Install openpyxl module

使用Python3.4.3自带的软件包管理工具easy_install.exe来安装openpyxl模块

Run(Ctrl+r) cmd

  1. cd %pythonRoot%\Scripts
  2. easy_install.exe openpyxl

Check:安装后导入openpyxl模块不会触发ImportError

  1. import openpyxl

Sample code

  1. from openpyxl import Workbook
  2. wb = Workbook()
  3. # grab the active worksheet
  4. ws = wb.active
  5. # Data can be assigned directly to cells
  6. ws['A1'] = 42
  7. # Rows can also be appended
  8. ws.append([1, 2, 3])
  9. # Python types will automatically be converted
  10. import datetime
  11. ws['A2'] = datetime.datetime.now()
  12. # Save the file
  13. wb.save("sample.xlsx")

Documentationhttp://openpyxl.readthedocs.org

load_workbook()加载Excel文件

我们将一个Excel文件称之为一个workbook,workbook中又包含了许多的worksheet(工作表)。我们可以通过workbook[‘sheetName’]来定位一个worksheet。

将文件导入到内存

  1. load_workbook(filename, read_only=False, use_iterators=False, keep_vba=False, guess_types=False, data_only=False)
  1. In [7]: help(load_workbook)
  2. Help on function load_workbook in module openpyxl.reader.excel:
  3. load_workbook(filename, read_only=False, use_iterators=False, keep_vba=False, guess_types=False, data_only=False)
  4. Open the given filename and return the workbook
  5. :param filename: the path to open or a file-like object
  6. :type filename: string or a file-like object open in binary mode c.f., :class:`zipfile.ZipFile`
  7. :param read_only: optimised for reading, content cannot be edited
  8. :type read_only: bool
  9. :param use_iterators: use lazy load for cells
  10. :type use_iterators: bool
  11. :param keep_vba: preseve vba content (this does NOT mean you can use it)
  12. :type keep_vba: bool
  13. :param guess_types: guess cell content type and do not read it from the file
  14. :type guess_types: bool
  15. :param data_only: controls whether cells with formulae have either the formula (default) or the value stored the last time Excel read the sheet
  16. :type data_only: bool
  17. :rtype: :class:`openpyxl.workbook.Workbook`

filename(str or file-like object):是一个Excel文件的路径或者是一个类文件对象。

read_only(bool):只读模式,不可编辑文件。缺省为False

use_iterators(bool):是否调用延迟加载。缺省为False

keep_vba(bool):是否保持VBA的内容。缺省为False

guess_type(bool):获取单元格内容的类型而且不能从文件中读取他。缺省为False

date_only(bool):控制包含有公式的单元格是否有任何公式,或者存储着最后读取Excel表的读取时间

Note

When using lazy load, all worksheets will be class: {openpyxl.worksheet.iter_worksheet.IterableWorksheet} and the returned workbook will be read-only.

  1. In [29]: from openpyxl import load_workbook
  2. In [5]: getwb = load_workbook(filename=r"Handoff.xlsx") #返回一个Workbook对象
  3. In [6]: getwb
  4. Out[6]: <openpyxl.workbook.workbook.Workbook at 0x4b7c030>

getwb是一个Workbook对象,Workbook()是最基本的一个类,能够在内存中创建文件最后将文件内容写进磁盘。

wbObject.get_sheet_names() 获取Excel表格名

  1. In [70]: getwb.get_sheet_names() #返回一个Excel表名组成的列表
  2. Out[70]: ['NodeCount']
  3. In [75]: getwb.get_sheet_names()[0]
  4. Out[75]: 'NodeCount'

Workbook[tableName] 定位Excel表

Openpyxl模块支持类似字典键值对映射的方式,来获取表格的内容

  1. In [80]: sheetContent = getwb[getwb.get_sheet_names()[0]]
  2. In [84]: type(sheetContent)
  3. Out[84]: openpyxl.worksheet.worksheet.Worksheet #返回一个Worksheet对象,用于存储表格内容

WbObject.get_sheet_by_name(sheetName) 定位Excel表

  1. In [57]: sheet1 = getwb.get_sheet_by_name('NodeCount')

Worksheet.rows和Worksheet.columns获取表格的行列值

  1. In [89]: sheetContent.rows
  2. Out[89]:
  3. ((<Cell NodeCount.A1>,
  4. <Cell NodeCount.B1>,
  5. <Cell NodeCount.C1>,
  6. <Cell NodeCount.D1>),
  7. (<Cell NodeCount.A2>,
  8. <Cell NodeCount.B2>,
  9. .
  10. .
  11. .
  12. In [90]: len(sheetContent.rows)
  13. Out[90]: 25
  14. In [93]: len(sheetContent.columns)
  15. Out[93]: 4

获取Worksheet的行列数目

  1. In [115]: sheetContent.get_highest_row()
  2. In [117]: sheetContent.get_highest_column()

通过切片运算符划分表格区域

因为Worksheet.rows和Worksheet.columns都是Tuple数据类型,支持使用切片运算符。

  1. In [100]: type(sheetContent.rows),type(sheetContent.columns)
  2. Out[100]: (tuple, tuple)

1.获取sheetContent的前两列内容

  1. In [103]: colA,colB = sheetContent.columns[:2]

2.划分出一个二维区域

  1. In [112]: cells = sheetContent['A1':'C3'] #返回一个生成器对象
  2. In [113]: type(cells)
  3. Out[113]: generator

get_column_letter将一个列的索引转化为列的字母

get_column_letter(idx)

Convert a column index into a column letter

(3 -> ‘C’)

  1. In [122]: from openpyxl.cell import get_column_letter
  2. In [124]: for x in list(range(1,11)):
  3. .....: ch = get_column_letter(x)
  4. .....: print(ch)
  5. .....:
  6. A
  7. B
  8. C
  9. D
  10. E
  11. F
  12. G
  13. H
  14. I
  15. J

Worksheet.cell().value 定位单元格的数据值

基于给定的坐标(A1)返回一个单元格对象。

cell(coordinate=None, row=None, column=None, value=None) method of openpyxl.worksheet.worksheet.Worksh

Returns a cell object based on the given coordinates.

  1. Usage: cell(coodinate='A15') **or** cell(row=15, column=1)
  2. If `coordinates` are not given, then row *and* column must be given.
  3. Cells are kept in a dictionary which is empty at the worksheet
  4. creation. Calling `cell` creates the cell in memory when they
  5. are first accessed, to reduce memory usage.
  6. :param coordinate: coordinates of the cell (e.g. 'B12')
  7. :type coordinate: string
  8. :param row: row index of the cell (e.g. 4)
  9. :type row: int
  10. :param column: column index of the cell (e.g. 3)
  11. :type column: int
  12. :raise: InsufficientCoordinatesException when coordinate or (row and column) are not given
  13. :rtype: :class:openpyxl.cell.Cell
  1. In [117]: sheetContent.cell("A1")
  2. Out[117]: <Cell NodeCount.A1>
  3. In [118]: sheetContent.cell("A1").value
  4. Out[118]: 'Cluster'
  5. In [120]: sheetContent.cell(row=1,column=2).value
  6. Out[120]: 'HI'

注意:Excel表格的数据常常在其两边都伴有空格符,需要使用Str.strip()来去除多余的空格符。

直接给单元格赋值

将A列全部置为None

  1. In [127]: colALen = len(sheetContent.columns[0])
  2. In [128]: for i in list(range(1,colALen+1)):
  3. .....: sheetContent.cell('A%s' % i).value = None
  4. .....:

注意:当你为单元格赋值时,Excel的数据类型由赋值的数据类型决定

Woeksheet.get_cell_collection() 获取全部的单元格数据值

获取全部的cell的数值,但是没有顺序。

get_cell_collection() method of openpyxl.worksheet.worksheet.Worksheet instance

Return an unordered list of the cells in this worksheet.

返回一个无序的包含了所有单元格的列表

  1. In [59]: sheetContent.get_cell_collection()

enumerate(iterators)获取迭代器的索引和元素

enumerate(iterable[, start]) -> iterator for index, value of iterable

Return an enumerate object. iterable must be another object that supports

iteration. The enumerate object yields pairs containing a count (from

start, which defaults to zero) and a value yielded by the iterable argument.

enumerate is useful for obtaining an indexed list:

(0, seq[0]), (1, seq[1]), (2, seq[2]), …

接收迭代器类型的实参,返回一个可以遍历的迭代器,包含了(索引,元素)的元组。

  1. In [46]: row1,row2 = sheetContent.rows[:2]
  2. In [49]: for index,cell in enumerate(row1):
  3. ....: print(index,cell)
  4. ....:
  5. 0 <Cell NodeCount.A1>
  6. 1 <Cell NodeCount.B1>
  7. 2 <Cell NodeCount.C1>
  8. 3 <Cell NodeCount.D1>

Workbook.save()保存所有操作,并生成新的Excel文件

已指定的文件名保存这个Excel文件。

save(filename) method of openpyxl.workbook.workbook.Workbook instance

Save the current workbook under the given filename.

Use this function instead of using an ExcelWriter.

  1. .. warning::
  2. When creating your workbook using `write_only` set to True,
  3. you will only be able to call this function once. Subsequents attempts to
  4. modify or save the file will raise an :class:`openpyxl.shared.exc.WorkbookAlreadySaved` exception.
  1. In [134]: getwb.save('test.xlsx')

Workbook()创建一个新的Excel文件

创建一个新的Workbook对象

class Workbook(builtins.object)

Workbook is the container for all other parts of the document.

  1. In [40]: from openpyxl import Workbook
  2. In [48]: outwb = Workbook() #返回一个openpyxl.workbook.workbook.Workbook的对象
  3. In [49]: outwb
  4. Out[49]: <openpyxl.workbook.workbook.Workbook at 0x13665d0>

wbObject.create_sheet() 创建一个Excel表格

create_sheet(title=None, index=None) method of openpyxl.workbook.workbook.Workbook instance

Create a worksheet (at an optional index).

:param title: optional title of the sheet

:type tile: unicode

:param index: optional position at which the sheet will be inserted

:type index: int

title(unicode):创建新Excel表的标题

index(int):新Excel表在Excel文件中插入的位置

  1. In [62]: newSheet = outwb.create_sheet('NewSheet',0) #返回一个openpyxl.worksheet.worksheet.Worksheet对象
  2. In [63]: type(newSheet)
  3. Out[63]: openpyxl.worksheet.worksheet.Worksheet

Worksheet.append() 逐行追加数值到单元格

当前表格的最后一行追加一行数据。必须传递迭代器实参。

append(iterable) method of openpyxl.worksheet.worksheet.Worksheet instance

Appends a group of values at the bottom of the current sheet.

  1. * If it's a list: all values are added in order, starting from the first column
  2. * If it's a dict: values are assigned to the columns indicated by the keys (numbers or letters)
  3. :param iterable: list, range or generator, or dict containing values to append
  4. :type iterable: list/tuple/range/generator or dict
  5. Usage:
  6. * append(['This is A1', 'This is B1', 'This is C1']) #添加一行三列
  7. *#or append({'A' : 'This is A1', 'C' : 'This is C1'}) #在指定的'A'和'C'列中添加一行
  8. *#or append({1 : 'This is A1', 3 : 'This is C1'}) #在指定的1、3行中添加一列
  9. :raise: TypeError when iterable is neither a list/tuple nor a dict
  1. In [131]: newSheet.append(['Test',1,2,3])

在指定的列内添加一行添加行

  1. In [80]: newSheet.append({'A':'Add one row'})

在指定的行中添加一列

  1. In [84]: newSheet.append({1:'Is A1',3:'Is C1'})

ExcelWriter() 将Workbook对象写入Excel文件

一般而言,通过Workbok.save()方法就可以将Workbook对象的内容写入到Excel中,openpyxl提供了ExcelWriter这一个更加强大的Excel写实现。

  1. In [88]: from openpyxl.writer.excel import ExcelWriter

class ExcelWriter(builtins.object)

Write a workbook object to an Excel file.返回一个ExcelWriter对象。

  1. In [92]: ewb = ExcelWriter(workbook=outwb) #将Workbook关联到一个ExcelWriter,最后将Workbook的内容写入到磁盘中
  2. In [95]: newSheet.title='testSheet'
  3. In [96]: outwb.get_sheet_names()
  4. Out[96]: ['testSheet', 'Sheet']
  5. In [97]: for i in list(range(1,11)):
  6. ....: newSheet.cell('A%s' % (i)).value = i
  7. ....: newSheet.append({'B':i})
  8. ....:
  9. In [98]: ewb.save(filename='test.xlsx') #一定要Call ExcelWriterObject.save()方法将Workbook写入到磁盘中。

最后

除了使用上述的方法来处理Excel文件的数据之外,openpyxl还提供了能修改Excel表格的样式的实现openpyxl.styles,这个我们下一篇再继续搞起。 :-)

Python Module_openpyxl_处理Excel表格的更多相关文章

  1. 详解python操作生成excel表格,并且填充数据

    最近在研究python操作excel表格的问题,首先读取excel表格觉得平时用的多,不怎么有难度,就是pyhon生成excel表格的时候,平时不怎么用,所以重点研究了一下,现总结如下: 1.首先用到 ...

  2. 用python批量处理Excel表格,处理结果又快又好,做办公室最靓的那个仔

    使用python批量处理Excel数据     让你根据Excel上所有人的身份证号码,提取出公司员工的生日 让你每个月都将公司所有人的考勤数据整理一下 类似这样的格式化的重复操作,你还在每次都使用的 ...

  3. python数据写入Excel表格

    from openpyxl import Workbook def main(): sheet_name = "表名1" row_count = 6 # 行数 info_resul ...

  4. python之处理excel表格

    xlrd ​ xlrd是python中一个第三方的用于读取excle表格的模块,很多企业在没有使用计算机管理前大多使用表格来管理数据,所以导入表格还是非常常用的! 安装xlrd pip install ...

  5. 用Python xlwt建立excel表格

    1.下载xlwt的Python库 (This is a library for developers to use to generate spreadsheet files compatible w ...

  6. Python快速设置Excel表格边框

    import xlwings as xw #打开存好的excel app = xw.App() #设置应用 wb = xw.Book("E:/Data/小蜜蜂超市销售报表.xlsx" ...

  7. Python 处理 CSV/EXCEL 表格文件

    只想说,数据挖掘工作,80%时间都花在处理数据上了,这句话真不假! 最近和小伙伴组了个队参加数据分析比赛,记录下我处理 csv 文件的一些步骤吧: 修改csv文件 可以用csv模块1,官方文档2 im ...

  8. python 直接存入Excel表格

    def write_excels(self, document): outwb = openpyxl.Workbook() outws = outwb.create_sheet(index=0) fo ...

  9. python XlsxWriter创建Excel 表格

    文档(英文) https://xlsxwriter.readthedocs.io/index.html 常用模块说明(中文) https://blog.csdn.net/sinat_35930259/ ...

随机推荐

  1. UIWebView与JS的交互

    IOS-的UIWebView UIWebVew是ios开发中较为常用的一个控件.其可以打开网页,加载html,打开文档等.当我们在开发中需要用到一些显示页面时,UIWebView是一个很好的选择. 创 ...

  2. 集合类Hash Set,LinkedHashSet,TreeSet

    集合(set)是一个用于存储和处理无重复元素的高效数据结构.映射表(map)类似于目录,提供了使用键值快速查询和获取值的功能. HashSet类是一个实现了Set接口的具体类,可以使用它的无参构造方法 ...

  3. ubuntu apache 一个ip绑定多个域名,发布目录

    1.将www.aaa.com 与 www.bbb.com 的DNS解析到你的服务器上 2.添加两个发布目录 /var/www/html/aaa  /var/www/html/bbb 3.修改配置文件. ...

  4. [DllImport("kernel32.dll")]使用

    C#中读取ini配置文件 [DllImport("kernel32.dll")] using System;using System.Collections.Generic;usi ...

  5. u-boot log_init函数分析

    log_init, int log_init(void){    struct log_driver *drv = ll_entry_start(struct log_driver, log_driv ...

  6. 用小程序做一个类似于苹果AssistiveTouch功能

    一.首先我先介绍一下,我们要做一个什么样的项目功能 项目功能就是一个音频点击播放,当点击为播放的状态时,一个音频的动图出现,而且是可以跟随着手指的滑动而滑动,而且,在滑动动图的时候,当前下的页面是不可 ...

  7. ZROI 19.08.04模拟赛

    传送门 写在前面:为了保护正睿题目版权,这里不放题面,只写题解. "这应该是正睿OI历史上第一次差评破百的比赛." "这说明来正睿集训的人越来越多了." &qu ...

  8. 那些年我写过的mysql命令

    建表语句 #mysql5.7适用create table testfy ( id int primary key AUTO_INCREMENT, clipid int comment '影片编号', ...

  9. linux常用基本命令不全

    pwd 显示当前目录 ls -lh 显示文件列表,h表示会显示文件的大小 mkdir zhu  创建文件夹zhu rmdir zhu 移除文件夹zhu如果abc中含有其他文件,则不能删除 rm -r ...

  10. vue 路由拦截器和请求拦截器

    路由拦截器 已路由为导向 router.beforeEach((to,from,next)=>{ if(to.path=='/login' || localStorage.getItem('to ...