Python库,用于快速将pandas表格导出为美观、合理的Excel工作簿。
项目描述
Excel-Tables
终于有一个Python库可以将Pandas数据框架
转换为漂亮的Excel文件,
供商业人士使用。
为什么选择Excel-Tables?
Pandas在商业环境中的问题
公司依靠数据库存储数据,但只有一小部分员工知道如何查询。
如今,他们的主要工作工具是电子表格: Microsoft Excel。
Pandas非常适合快速查询关系型数据库或导入各种格式的表。它还非常出色地将数据框架导出到Excel。它是商业使用的完美工具。
:warning: 警告 然而,生成的Excel文件很平淡:没有颜色,没有数字格式等。在商业环境中,不能向同事展示未经格式化的Excel文件;这被认为是不好的工作。Excel表格有最低标准。
因此,每次进行任何数据提取时,都需要手动花费五分钟或最多一刻钟来重新格式化文件,以便将其展示给他人。
如果需要新的提取,即使五分钟之后,所有内容也必须重做!
这是一项巨大的繁琐、重复性工作。
解决方案
如果能够将一个或多个表格导出到Excel文件中,并保证
-
第一次尝试就能看起来很好或几乎很好,数字或日期正确显示,列头格式良好呢?
-
可以在不跳进兔子洞的情况下调整某些列的格式吗?
解决方案是** Excel-Tables**。它允许您创建包含一个或多个表格的Excel报告。
它比Pandas的普通Excel导出有更高的标准。
Excel-Tables不是什么
-
它不是一个允许在表格展示方面具有最大灵活性的工具。
-
它不是一个图表工具。
-
它没有考虑到科学应用的开发。对于大型数据集,它可能会变慢。
注意事项
**我们所说的表格很简单:一个表头行,以及行,就像从一个关系数据库表中的提取一样。**
Excel-Tables在其展示上非常标准(有意见),以保持事情尽可能简单。它看起来不错,但不要期望有太多花哨的功能。
为了舒适地使用它,您首先应该遵守其基本哲学和选择。
作为最后的手段,您仍然可以使用openpyxl库来重新制作报告。
如何安装
pip install excel_tables
使用方法
简单示例
from excel_tables import ExcelReport
report = ExcelReport('Myfile.xlsx', df=df)
如果您在此阶段指定了一个dataframe,则报告将立即保存到Excel文件中。
更详细的报告
指定字体(Helvetica)并强调(加粗)第二列(1)中高于1000的行。
(强调以黄色背景显示)。
from excel_tables import ExcelReport
my_file = 'Myfile.xlsx'
report = ExcelReport(my_file,
font_name='Helvetica',
df=df,
num_formats={'Rate': "#'##0.0000"},
emphasize=lambda x: x[1] > 1000)
report.rich_print()
report.open()
num_formats
用于指定列的额外格式,如果默认格式不合适。它是一个包含列和Excel格式的字典。rich_print()
在控制台打印报告的简化视图。open()
在标准Excel应用程序中打开文件。
高级使用
包含多个工作表的报告
from excel_tables import ExcelReport
report = ExcelReport(second_out_file,
font_name='Times New Roman',
format_int="[>=1000]#'##0;[<1000]0",
format_float="[>=1000]#'##0.00;[<1000]0.00")
report.add_sheet('Income', df1, emphasize=lambda x: x[1] > 20000,
num_formats={'Feet': "#'##0"})
# add other attributes
wks = report.add_sheet('Expenses', df2, num_formats={'Rates': "#'##0.0000"})
wks.header_color = "light_blue"
report.save(open_file=True)
由于在创建报告对象时没有提供dataframe,因此不会自动保存;您必须在添加工作表后显式地执行此操作。
format_int
:对所有整数列的规范,适用于整个报告。format_float
:对所有浮点列的规范,适用于整个报告。
对于工作表
num_formats
用于指定列的额外格式,如果默认格式不合适。它是一个包含列名和Excel数字格式的字典。num_formats
是一个包含列名和Excel数字格式的字典。
重新定义报告或工作表
您也可以以这种方式指定参数
from excel_tables import ExcelReport
report = ExcelReport(second_out_file)
report.font_name='Times New Roman',
report.format_int="[>=1000]#'##0;[<1000]0",
report.format_float="[>=1000]#'##0.00;[<1000]0.00"
定义工作表的另一种方法是显式创建工作表对象
from excel_tables import ExcelReport, Worksheet
report = ExcelReport(second_out_file)
wks = Worksheet('Income', df1, emphasize=lambda x: x[1] > 20000,
num_formats={'Feet': "#'##0"})
report.append(wks)
:memo: 注意 使用工作表对象的优势是,所有可用的工作表属性都立即可用,无需重新定义它们。
在openpyxl中重工作文件
在不太可能的情况下,您希望使用openpyxl库重新制作报告。
ExcelReport对象有一个属性workbook
。
wb = report.workbook
# Get the 'Main' worksheet (as in the tab)
first_sheet = wb.worksheets['Main']
...
wb.save(myfile)
:warning: 警告 请记住,ExcelReport的
Worksheet
类与openpyxl中的不同。
基本规则
一般格式决策
- 工作表没有背景和单元格网格(完全白色)。
- 将对每个表格的单元格应用简单网格。
- 数据字体颜色为黑色。
- 所有表格都有自动筛选。
一般数字格式
对于Excel,浮点数、整数或日期时间都是数字。
excel_tables根据其自身的逻辑格式化数字
内部格式 | Python类型 | 系统默认 | 您的默认值 |
---|---|---|---|
整数 | int | 无小数,千位分隔符 | format_int |
浮点数 | 浮点数 | 2位小数,千位分隔符 | format_float |
百分比 | 浮点数(介于0和1之间) | 百分号,1位小数 | format_perc |
日期 | 日期时间(不含小时和分钟) | ISO(YYY-MM-DD) | format_date |
日期时间 | 日期时间 | ISO(YYYY-MM-DD HH:MM:SS) | 不适用 |
控制台打印机采用英文数字惯例,日期采用ISO格式。
工作表特定列的格式
您可以为工作表对象的每一列指定上述默认值的例外。
这是通过 numformats
属性完成的,它是一个列的字典。
wks = Worksheet('Mountains', df,
num_formats={'Rates': "#,##0.0000", "Quality": "0.00%"})
或者,一旦工作表已经创建
myworkbook.num_formats = {'Rates': "#,##0.0000", "Quality": "0.00%"}
此字段也存在于ExcelReport中;当指定数据框(df)时使用。
工作表标题
- 所有标题都以相同的方式处理,具有默认背景颜色。
- 您可以指定整个报告的默认标题背景颜色,或为每个工作簿指定特定的标题颜色。
- 根据背景颜色的亮度,每个标题的文本将为黑色或白色。
- 可以使用颜色名称(HTML 4,CSS > 2)或颜色十六进制表示(字符串)。
wks = Worksheet('Mountains', df, header_color='ligthblue')
或者,一旦工作表已经创建
wks.header_color = 'ligthblue'
将现有Excel文件作为数据库读取
介绍
有时将现有的Excel文件视为可以查询的数据库是有用的,通常用于在表上执行筛选或连接,然后将结果集成到ExcelReport中。
初始化
这将从Excel文件中加载所有标签(工作表)到内存中
from excel_tables import ExcelDB
xldb = ExcelDB('my_file.xlsx')
如果您想将数据库文件保留在磁盘上,请使用可选参数 db_filename
xldb = ExcelDB('my_file.xlsx', db_filename='my_file.db')
使用单个表格初始化
要加载单个标签(工作表)作为表,请使用 load_wks()
方法;如果您愿意,可以使用工作表编号。 tablename
参数是可选的(如果不存在,该方法将确定名称)。
from excel_tables import ExcelDB
xldb = ExcelDB()
xldb.import_wks('my_file.xlsx', sheetname=1, tablename='mytable')
默认情况下,它将替换具有相同名称的所有表。如果您想阻止这种情况,请添加参数 replace=False
。
添加数据框架(来自其他来源)
您可以轻松地将来自任何来源的Pandas数据框添加
xldb.load('mytable', df)
默认情况下,它将替换与该文件中相同名称的先前表。如果您想阻止这种情况,请添加参数 replace=False
。
进行查询
MAX = 80
MYQUERY = """
SELECT *
FROM Foo
LEFT JOIN [Bar baz]
ON Foo.x = [Bar baz].[First Column]
WHERE Foo.x > :MAX
"""
df = xldb.query(MY_QUERY)
您可以使用Python SQLite3占位符(但不能是表或列名称;对于这些,您可能需要f-字符串)。
在这种情况下,:MAX
是一个参数,它引用本地环境中的现有变量名称。
如果您愿意,可以传递参数列表或字典,例如。
df = xldb.query(MY_QUERY, params={'foo'=5, 'bar'=8})
然后您可以轻松地将该数据框用于 ExcelReport
对象。
report = ExcelReport('my_file.xlsx', ...)
...
report.add_sheet('tabname', df)
...
report.save()
从另一个Excel文件添加表格
xldb.import_file('second_file.xlsx')
默认情况下,它将替换与该文件中相同名称的先前表。如果您想阻止这种情况,请添加参数 replace=False
。
删除表格
如果您想从数据库中删除表
xldb.drop('mytable')
关于日期的说明
SQLite将日期存储为ISO字符串;然而,从查询生成的数据框会自动检测它们并将它们重新转换为日期时间对象,这将被 ExcelReport
类正确处理。
许可证
本项目采用MIT许可证。
Excel 是微软公司的注册商标。
本项目与微软公司无关联、未获得认可或以任何方式与微软公司相关联。
`.xlsx` 格式 是一个标准,是Office Open XML(OOXML)格式的一部分,由ECMA(ECMA-376)和ISO/IEC(ISO/IEC 29500)标准化。它根据微软的 开放规范承诺 许可。
项目详情
下载文件
下载适用于您的平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。