前文:
Python-openpyxl教程6 - 图表之面积图和条形图
Python-openpyxl教程7 - 图表之散点图,饼图和环形图
Python-openpyxl教程8 - 图表之雷达图,股价图和曲面图图
Python-openpyxl教程9 - 轴使用之轴限制和比例
Python-openpyxl教程10 - 图表布局,填充图案以及进阶图表
Python-openpyxl教程11 - 注释和样式
工作表 - Tables
table
是对单元格组的引用。这使得某些操作(例如,对表格中的单元格进行样式设置)更加容易
建立表格
from openpyxl import Workbook
from openpyxl.worksheet.table import Table, TableStyleInfo
wb = Workbook()
ws = wb.active
data = [
['Apples', 10000, 5000, 8000, 6000],
['Pears', 2000, 3000, 4000, 5000],
['Bananas', 6000, 6000, 6500, 6000],
['Oranges', 500, 300, 200, 700]
]
# add column headings. NB. these must be strings
ws.append(['Fruit', '2011', '2012', '2013', '2014'])
for row in data:
ws.append(row)
tab = Table(displayName='Table1', ref='A1:E5')
# Add a default style with striped rows and banded columns
style = TableStyleInfo(name='TableStyleMedium9', showFirstColumn=False,
showLastColumn=False, showRowStripes=True, showColumnStripes=True)
tab.tableStyleInfo = style
'''
Table must be added using ws.add_table() method to avoid duplicate names.
必须使用ws.add_table()方法添加Table,以避免名称重复。
Using this method ensures table name is unque through out defined names all all other table name
使用此方法可以确保Table名称在所有定义的表名中都是唯一的。
'''
ws.add_table(tab)
wb.save('SampleTable.xlsx')
Table 名称在工作薄中必须是唯一的。默认情况下,Table是从第一行标题创建的,并且所有列的过滤器以及表标题和列标题必须始终包含字符串。
在只写模式下,您必须手动将列标题添加列表中,并且值必须始终与相应单元格的值相同,否则Excel可能会认为该文件无效并删除Table |
使用TableStyleInfo对象管理样式。这使您可以对行或列进行条纹并应用不同的配色方案。
处理表格
ws.tables
是特定工作表中所有表的类似于字典的对象:
print(ws.tables)
# {"Table1", <openpyxl.worksheet.table.Table object>}
按名称或范围获取表
print(ws.table["Table1"])
print(ws.table["A1:D10"])
遍历工作表中的所有Table
返回表名及其范围的列表
print(ws.tables.items())
# [("table1", "A1:D10")]
删除表格
del ws.tables["Table1"]
工作表中的表数
print(len(ws.tables))
# 1
手动添加列标题
在只写模式下,您可以只添加没有标题的Table:
table.headerRowCount = False
或手动初始化列标题
headings = ['Fruit', '2011', '2012', '2013', '2014'] # 所有的值必须是字符串
table._initialise_columns()
for column, value in zip(table.tableColumns, headings):
column.name = value
日期和时间
日期和时间可以以两种不同的方式存储在XLSX文件中:作为ISO 8601格式的字符串或者单个数字。
openpyxl支持这两种表示形式,并在读取和写入文件时在他们与Python的datetime模块表示形式之间进行转换。在任何一种表示形式中,XLSX文件中的最大日期和时间精度为毫秒精度。
XLSX文件不适合存储历史日期(1990年之前), 这是因为Excel中的错误无法修复,而不会引起向后兼容性问题。为了组织用户尝试,Excel故意拒绝识别和显示此类日期。因此,也不建议将openpyxl用于此类目的,尤其是在与他人交换文件时。
Excel中的日期和时间表示不支持时区。因此,当日期时间存储在XLSX文件中时,附件到Python日期时间的时区信息将会丢失。
使用ISO 8601格式
要使openpyxl在写入文件时以ISO 8601格式存储日期和时间,请将工作薄的iso_dates
标志设置为True
:
import openpyxl
wb = openpyxl.Workbook()
wb.iso_dates = True
使用这种格式的好处是,所存储信息的含义不受单一数字格式的影响
Office Open XML标准未指定ISO 8601持续时间格式的受支持子集来表示时间间隔持续时间。
openpyxl它们写入文件时,因此始终使用timedelta值得单一数字格式。
1900年和1904年的日期系统
XLSX文件的"日期系统"确定如何解释单个数字表示形式中的日期和时间。XLSX文件始终使用两种可能的日期系统之一:
- 在1900年日期系统(默认)中,参考日期(编号为1)为1900-01-01。
- 在1904年日期系统中,参考日期(编号为0)为1904-01-01。
复杂性不仅来自于参考日期的起始编号不同,还来自于1900年日期系统具有内置(但错误)的假设(即1900年是a年)这一事实。Excel故意拒绝正确识别和显示参考日期之前的日期,以阻止人们存储历史数据。
在使用1900日期系统的工作薄中,当在工作表的日期/时间数字和1900年1月和2月的Python日期时间之间进行转换时,openpyxl的行为与Excel相同。唯一的例外是1900年2月29日,它不能表示为Python日期时间对象因为它不是一个有效的日期。
您可以像这样或者工作薄的日期系统:
import openpyxl
wb = openpyxl.Workbook()
if wb.epoch == openpyxl.utils.datetime.CALENDAR_WINDOWS_1900:
print("This workbook is using the 1900")
# This workbook is using the 1900
并设置如下:
wb.epoch = openpyxl.utils.datetime.CALENDAR_WINDOWS_1904
处理timedelta值
Excel用户可以使用类似于[h]:mm:ss
或 [mm]:ss
显示时间间隔持续时间的数字格式,openpyxl认为这等效于Python中的时间增量。在读取XLSX文件时,openpyxl会识别这些数字格式,并返回相应单元格的detetime.timedelta值。
将工作表中的timedelta值写入文件时,openpyxl使用[h]:mm:ss
这些单元格的数字格式。
openpyxl常用功能基本已经完成。如果有感兴趣的友友可以反馈看下其他的~~
来源:
https://openpyxl.readthedocs.io/en/stable/worksheet_tables.html
https://openpyxl.readthedocs.io/en/stable/datetime.html
网友评论