美文网首页Python数据分析
Python-openpyxl教程12 - 表和日期

Python-openpyxl教程12 - 表和日期

作者: 庄周幻梦 | 来源:发表于2021-04-14 17:03 被阅读0次

前文:
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是从第一行标题创建的,并且所有列的过滤器以及表标题和列标题必须始终包含字符串。

\color {red} {!警告}
在只写模式下,您必须手动将列标题添加列表中,并且值必须始终与相应单元格的值相同,否则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

相关文章

网友评论

    本文标题:Python-openpyxl教程12 - 表和日期

    本文链接:https://www.haomeiwen.com/subject/hghllltx.html