Python第三方库之openpyxl

Posted 吴依杰

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python第三方库之openpyxl相关的知识,希望对你有一定的参考价值。

Python第三方库之openpyxl(2)

简单的使用

写一个工作簿

技术分享图片
>>> from openpyxl import Workbook
>>> from openpyxl.compat import range
>>> from openpyxl.utils import get_column_letter
>>>
>>> wb = Workbook()
>>>
>>> dest_filename = empty_book.xlsx
>>>
>>> ws1 = wb.active
>>> ws1.title = "range names"
>>>
>>> for row in range(1, 40):
...     ws1.append(range(600))
>>>
>>> ws2 = wb.create_sheet(title="Pi")
>>>
>>> ws2[F5] = 3.14
>>>
>>> ws3 = wb.create_sheet(title="Data")
>>> for row in range(10, 20):
...     for col in range(27, 54):
...         _ = ws3.cell(column=col, row=row, value="{0}".format(get_column_letter(col)))
>>> print(ws3[AA10].value)
AA
>>> wb.save(filename = dest_filename)
View Code

读一个现有的工作簿

>>> from openpyxl import load_workbook
>>> wb = load_workbook(filename = empty_book.xlsx)
>>> sheet_ranges = wb[range names]
>>> print(sheet_ranges[D18].value)
3

注意:在loadworkbook中有几个可以使用的标志

1.guess_types 在读取单元时启用或禁用(默认)类型推断

2.data_only 控制带有公式的单元格是否有公式(默认)或上次Excel读取表的值

3.keep_vba 控制任何可视的基本元素是否被保留(默认)。如果它们被保存了它们仍然是不可编辑的

注意:openpyxl目前没有在Excel文件中读取所有可能的项目,因此如果打开并保存相同的名称,那么图像和图表将从现有文件中丢失

使用数字格式

>>> import datetime
>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> # 使用Python datetime设置日期
>>> ws[A1] = datetime.datetime(2010, 7, 21)
>>>
>>> ws[A1].number_format
yyyy-mm-dd h:mm:ss
>>> # 您可以在具体情况下启用类型推断
>>> wb.guess_types = True
>>> # 使用字符串和%符号设置百分比
>>> ws[B1] = 3.14%
>>> wb.guess_types = False
>>> ws[B1].value
0.031400000000000004
>>>
>>> ws[B1].number_format
0%

使用公式

>>> from openpyxl import Workbook
>>> wb = Workbook()
>>> ws = wb.active
>>> # 添加一个简单的公式
>>> ws["A1"] = "=SUM(1, 1)"
>>> wb.save("formula.xlsx")

注意:你必须使用英文名作为一个函数,函数参数必须用逗号隔开,而不是其他的标点符号,比如分号

openpyxl从来没有计算过公式但是可以检查公式的名称

>>> from openpyxl.utils import FORMULAE
>>> "HEX2DEC" in FORMULAE
True

合并/ 分割单元格

>>> from openpyxl.workbook import Workbook
>>>
>>> wb = Workbook()
>>> ws = wb.active
>>>
>>> ws.merge_cells(A2:D2)
>>> ws.unmerge_cells(A2:D2)
>>>
>>> # 相当于
>>> ws.merge_cells(start_row=2, start_column=1, end_row=4, end_column=4)
>>> ws.unmerge_cells(start_row=2, start_column=1, end_row=4, end_column=4)

插入图像

>>> from openpyxl import Workbook
>>> from openpyxl.drawing.image import Image
>>>
>>> wb = Workbook()
>>> ws = wb.active
>>> ws[A1] = You should see three logos below
>>> # 制作一个图片
>>> img = Image(logo.png)
>>> # 在单元格旁边添加工作表和锚
>>> ws.add_image(img, A1)
>>> wb.save(logo.xlsx)

折叠列

>>> import openpyxl
>>> wb = openpyxl.Workbook()
>>> ws = wb.create_sheet()
>>> ws.column_dimensions.group(A,D, hidden=True)
>>> wb.save(group.xlsx)

与pandas和NumPy一起工作

NumPy支持

openpyxl已经为NumPy类型的浮点数、整数和布尔型提供了支持。使用pandas的时间戳类型支持DateTimes

Working with Pandas Dataframes

openpyxl.utils.dataframe.dataframe_to_rows()函数提供了一个简单的方式来处理Pandas Dataframes

from openpyxl.utils.dataframe import dataframe_to_rows
wb = Workbook()
ws = wb.active

for r in dataframe_to_rows(df, index=True, header=True):
    ws.append(r)

虽然pandas本身支持转换为Excel,但这为客户端代码提供了额外的灵活性,包括将dataframes直接传输到文件的能力。

将一个dataframe转换为高亮显示标题和索引的工作表

wb = Workbook()
ws = wb.active

for r in dataframe_to_rows(df, index=True, header=True):
    ws.append(r)

for cell in ws[A] + ws[1]:
    cell.style = Pandas

wb.save("pandas_openpyxl.xlsx")

或者,如果你只想转换数据你可以使用write-only模式

技术分享图片
from openpyxl.cell.cell import WriteOnlyCell
wb = Workbook(write_only=True)
ws = wb.create_sheet()

cell = WriteOnlyCell(ws)
cell.style = Pandas

 def format_first_row(row, cell):

    for c in row:
        cell.value = c
        yield cell

rows = dataframe_to_rows(df)
first_row = format_first_row(next(rows), cell)
ws.append(first_row)

for row in rows:
    row = list(row)
    cell.value = row[0]
    row[0] = cell
    ws.append(row)

wb.save("openpyxl_stream.xlsx")
View Code

这段代码和标准的工作簿同样适用

将工作表转换为Dataframe

要将工作表转换为Dataframe,您可以使用values属性。如果工作表没有标题或索引,这很容易

df = DataFrame(ws.values)

如果工作表确实有标题或索引,比如由pandas创建的,那么就需要做更多的工作

data = ws.values
cols = next(data)[1:]
data = list(data)
idx = [r[0] for r in data]
data = (islice(r, 1, None) for r in data)
df = DataFrame(data, index=idx, columns=cols)

 

以上是关于Python第三方库之openpyxl的主要内容,如果未能解决你的问题,请参考以下文章

Python第三方库之openpyxl

Python第三方库之openpyxl

Python第三方库之openpyxl(12)

Python第三方库之openpyxl(11)

[Python3]读写Excel - openpyxl库

Python第三方库之MedPy