zoukankan      html  css  js  c++  java
  • Python 操作 MS Excel 文件

    利用 Python 对 Excel 文件进行操作需要使用第三方库: openpyxl,可执行 pip install openpyxl 进行安装

    1. 导入 openpyxl 模块

    导入 openpyxl 模块后,利用它的 load_workbook() 方法可以打开一个 Excel 文件,该方法使用一个文件名称作为参数,示例如下:

    >>> import openpyxl

    >>> wb = openpyxl.load_workbook('example.xlsx')

    >>> type(wb)

    <class 'openpyxl.workbook.workbook.Workbook'>

    2. openpyxl 常用方法

    可以使用 openpyxl 对象的 get_sheet_names() 方法得到打开的工作薄中存在的所有工作表名称、用 get_sheet_by_name() 方法获取工作表对象、用 active 属性可获取当前活跃工作表的名称:

    >>> wb.get_sheet_names()

    ['Sheet1', 'Sheet2', 'Sheet3']

    >>> sheet = wb.get_sheet_by_name('Sheet3')

    >>> sheet

    <Worksheet "Sheet3">

    >>> type(sheet)

    <class 'openpyxl.worksheet.worksheet.Worksheet'>

    >>> sheet.title

    'Sheet3'

    >>> anotherSheet = wb.active

    >>> anotherSheet

    <Worksheet "Sheet1">

    3. 获取单元格属性

    可以直接使用单元格名称获取指定单元格,同时单元格具有值、行、列、坐标属性,举例如下:

    >>> sheet = wb.get_sheet_by_name('Sheet1')

    >>> sheet['A1']

    <Cell Sheet1.A1>

    >>> sheet['A1'].value

    datetime.datetime(2015, 4, 5, 13, 34, 2)

    >>> c = sheet['B1']

    >>> c.value

    'Apples'

    >>> 'Row ' + str(c.row) + ', Column ' + c.column + ' is ' + c.value

    'Row 1, Column B is Apples'

    >>> 'Cell ' + c.coordinate + ' is ' + c.value

    'Cell B1 is Apples'

    >>> sheet['C1'].value

    73

    4. 使用 cell()

    同时也可以使用工作表对象的 cell() 方法来直接指定单元格,使用该方法时要注意,工作表中的行、列都是从1而不是0开始的:

    >>> sheet.cell(row=1, column=2)

    <Cell Sheet1.B1>

    >>> sheet.cell(row=1, column=2).value

    'Apples'

    >>> for i in range(1, 8, 2):

                 print(i, sheet.cell(row=i, column=2).value)

    1 Apples

    3 Pears

    5 Apples

    7 Strawberries

    5. 获取当前工作表中有效数据区域的行数和列数

    >>> sheet.max_row

    7

    >>> sheet.max_column

    3

    6. 行、列之间的转换

    需要使用 get_column_letter、column_index_from_string 这两个方法

    >>> from openpyxl.utils import get_column_letter, column_index_from_string

    >>> get_column_letter(1)

    'A'

    >>> get_column_letter(2)

    'B'

    >>> get_column_letter(27)

    'AA'

    >>> get_column_letter(900)

    'AHP'

    >>> get_column_letter(sheet.max_column)

    'C'

    >>> column_index_from_string('A')

    1

    >>> column_index_from_string('AA')

    27

    7. 获取区域数据

    >>> tuple(sheet['A1':'C3'])

    ((<Cell Sheet1.A1>, <Cell Sheet1.B1>, <Cell Sheet1.C1>), (<Cell Sheet1.A2>, <Cell Sheet1.B2>, <Cell Sheet1.C2>), (<Cell Sheet1.A3>, <Cell Sheet1.B3>, <Cell Sheet1.C3>))

    8. 获取指定一行或一列数据

    >>> sheet.columns[1]

    (<Cell Sheet1.B1>, <Cell Sheet1.B2>, <Cell Sheet1.B3>, <Cell Sheet1.B4>, <Cell Sheet1.B5>, <Cell Sheet1.B6>, <Cell Sheet1.B7>)

     9. Excel 读操作总结

    利用 openpyxl 对 excel 文件进行读操作,主要步骤有以下几点:

    • 导入 openpyxl 模块
    • 调用 openpyxl.load_workbook() 函数
    • 获得 Workbook 对象
    • 读取活跃工作表变量或者调用 get_sheet_by_name() 方法
    • 获得 Worksheet 对象
    • 使用索引或使用行、列关键词调用工作表的 cell() 方法
    • 获得 Cell 对象
    • 读取 Cell 对象的属性值

    10. 创建与保存 Excel 文件

    创建 Excel 文件需要使用 openpyxl 模块的 Workbook() 方法,对文件进行操作后,需要调用工作薄对象的 save() 方法进行保存方可使操作生效。

    >>> import openpyxl

    >>> wb = openpyxl.Wrokbook()

    >>> wb.get_sheet_names()

    ['Sheet']

    >>> sheet = wb.active

    >>> sheet.title

    'Sheet'

    >>> sheet.title = 'Spam Bacon Eggs Sheet'

    >>> wb.get_sheet_names()

    ['Spam Bacon Eggs Sheet']

    >>> wb.save('example_copy.xlsx')

    11. 新增或删除工作表

    增加工作表,需要使用工作薄对象的 create_sheet() 方法。对应的,删除工作表,需要使用 remove_sheet() 方法。

    >>> wb.create_sheet()

    <Worksheet "Sheet1">

    >>> wb.get_sheet_names()

    ['Sheet', 'Sheet1']

    >>> wb.create_sheet(index=0, title='First Sheet')

    <Worksheet "First Sheet">

    >>> wb.create_sheet(index=2, title='Middle Sheet')

    <Worksheet "Middle Sheet">

    >>> wb.get_sheet_names()

    ['First Sheet', 'Sheet', 'Middle Sheet', 'Sheet1']

    如上,创建新工作表时,默认按序号顺序创建,并在当前已有工作表末尾附加。如果指定索引和标题,则会以给定的标题在指定索引处进行创建,索引从0开始。

    删除工作表则略复杂,不能直接给 remove_sheet() 方法传递工作表名或索引进行删除,而必须传递一个工作表对象方可进行删除。

    >>> wb.remove_sheet(wb.get_sheet_by_name('Middle Sheet'))

    >>> wb.remove_sheet(wb.get_sheet_by_name('Sheet1'))

    >>> wb.get_sheet_names()

    ['First Sheet', 'Sheet']

    最后,记得要进行 save() 操作,方可使增加或删除操作生效。

    12. 向单元格写入数据

    向单元格写入数据,只需要在工作表对象中,指定单元格坐标,再进行类似于变量赋值的操作即可

    >>> sheet['A1'] = 'Hello world!'

    >>> sheet['A1'].value

    'Hello world!'

    13. 使用 cell() 方法

    除了使用单元格坐标的方式获取单元格对象外,还可以使用工作表对象的 cell() 方法,向其传入整型的行数、列数来进行指定

    >>> sheet.cell(row=2, column=2).value = 'Hello'

    >>> sheet['B2'].value

    'Hello'

    14. 设置字体样式

    对 Excel 中的单元格内的字体样式进行设置,需要使用 Font() 方法,向其传入指定参数并将其赋值给指定单元格的 font 属性即可进行相应设置。该方法需要从 openpyxl.styles 中导入

    >>> italic24Font = Font(size=24, italic=True)

    >>> sheet['A1'].font = italic24Font

    >>> sheet['A1'] = 'Hello world!'

    >>> wb.save('styled.xlsx')

    一些常用的 Font() 对象属性

    name: 字符串类型。字体名称,如 Calibri、Times New Roman

    size: 整型。字号

    bold: 布尔型。是否为粗体

    italic: 布尔型。是否为斜体

    使用示例:

    >>> fontObj1 = Font(name='Times New Roman', bold=True)

    >>> sheet['A1'].font = fontObj1

    >>> sheet['A1'] = 'Bold Times New Roman'

    >>> fontObj2 = Font(size=24, italic=True)

    >>> sheet['B3'].font = fontObj2

    >>> sheet['B3'] = '24 pt Italic'

    >>> wb.save('styles.xlsx')

    15. 使用公式

    使用公式相对简单,和向单元格写入数据相同,把公式作为待写数据写入到单元格中即可

    >>> sheet['B9'] = '=SUM(B1:B8)'

    应注意的是,公式总是以等号(=)开头的

    16. 调整行高与列宽

    openpyxl 模块中有专门的工作表对象变量对行高与列宽进行调整。设置行高,可使用 row_dimensions 属性,设置列宽,可使用 column_dimensions 属性

    >>> sheet['A1'] = 'Tall row'

    >>> sheet['B2'] = 'Wide column'

    >>> sheet.row_dimensions[1].height = 70

    >>> sheet.column_dimensions['B'].width = 20

    >>> wb.save('dimensions.xlsx')

    应当注意的是,如果把行高或列宽设置为0,则会将该行、列隐藏

    17. 合并单元格与拆分单元格

    合并单元格使用 merge_cells() 方法,拆分单元格使用 unmerge_cells() 方法,这两个方法接受一个字符串格式的参数,该参数从左上角至右下角指定一整块区域用于合并或拆分。举例如下

    >>> sheet.merge_cells('A1:D3')

    >>> sheet['A1'] = 'Twelve cells merged together.'

    >>> sheet.merge_cells('C5:D5')

    >>> sheet['C5'] = 'Two merged cells.'

    >>> wb.save('merged.xlsx')

    >>> sheet.unmerge_cells('A1:D3')

    >>> sheet.unmerge_cells('C5:D5')

    >>> wb.save('merged.xlsx')

    18. 冻结窗格

    要实行冻结窗格操作,需要使用工作表对象的 freeze_panes 属性,向该属性指定一个单元格位置,则在该单元格左侧与上侧的区域将被冻结。但该单元格本身并不在冻结范围内

    >>> sheet.freeze_panes = 'A2'

    以上代码将把工作表中第一行给冻结

    19. 创建图表

    创建图表相对较为复杂,主要有以下5个步骤

    • 从一块矩形区域中创建一个 Reference 对象
    • 使用该 Reference 对象创建一个 Series 对象
    • 创建 Chart 对象
    • 把 Series 对象附加到 Chart 对象中
    • 把 Chart 对象添加到工作表对象中。可以选择指定图表左上角位置

    Reference 对象使用 openpyxl.chart.Reference() 创建,其接收3个参数:

    • 包含用于创建图表的数据的工作表对象
    • 由2个整型数据组成的组合。分别代表数据区域的左上角单元格的行数、列数
    • 由2个整型数据组成的组合。分别代表数据区域的右下角单元格的行数、列数

    (作者此处描述似乎有误,准确的说应该是5个参数了,第1个是工作表对象,第2个是数据区域左上角单元格所在的行数,第3个是数据区域左上角单元格所在的列数,第4个是数据区域右下角单元格所在的行数,第5个是数据区域右下角单元格所在的列数)

    创建图表示例如下:

    >>> refObj = openpyxl.chart.Reference(sheet, min_col=1, min_row=1, max_col=1, max_row=10)

    >>> seriesObj = openpyxl.chart.Series(refObj, title='First series')

    >>> chartObj = openpyxl.chart.BarChart()

    >>> chartObj.title = 'My Chart'

    >>> chartObj.append(seriesObj)

    >>> sheet.add_chart(chartObj, 'C5')

    >>> wb.save('sampleChart.xlsx')

    本示例中,数据区域为 A1:A10

    结果如下(图中各个 pixels 参数可忽略):

    作者在 sheet.add_chart() 函数中指定了图表左上角位置为 C5,但在结果中显示的却并不是这样。在下亦不解

  • 相关阅读:
    BZOJ2303:[APIO2011]方格染色(并查集)
    BZOJ1116:[POI2008]CLO(并查集)
    BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
    洛谷1387 最大正方形
    洛谷 P1858 多人背包
    vijos 1085 Sunnypig闯三角关
    vijos 1030 重叠的方框
    codevs 1001 舒适的路线 WK
    1266. [NOIP2012] 借教室
    codevs 2370 小机房的树
  • 原文地址:https://www.cnblogs.com/wuzhiblog/p/pythonexcel.html
Copyright © 2011-2022 走看看