python panda ExcelWriter 将动态公式切换为数组公式

问题描述 投票:0回答:1

背景

我从数据库中以

pd.dataframe
形式查询了一些数据,并使用 xlsx.writer 引擎中的
pd.ExcelWriter
将其保存到格式化的 xlsx 模板中。 然后通过动态公式和其他公式在另一张工作表中引用保存的数据。

问题

在Excel中,有两个表:“原始数据”和“格式化数据”:
“原始数据”存储获取的数据,“格式数据”包含“原始数据”中的公式和引用单元格

ExcelWriter处理Excel文件后,“已处理数据”中的动态公式变为数组公式,导致公式无法扩展。例如有一个公式:

=FILTER(UNIQUE('Raw Data'!$I$4:$I$2000),UNIQUE('Raw Data'!$I$4:$I$2000)<>0)

它应该返回 I4:I2000 中的所有唯一数据。

但是,ExcelWriter 处理后的 Excel 将动态公式更改为 I4:I400 范围内的数组公式,因为原始模板只有 396 个唯一值。即使更新的数据源有超过 396 个唯一值,它也只能显示 396 个项目。

如果有人能告知此问题的原因并提供阻止动态公式更改的解决方案,那就太好了。

备注:我尽量不使用Python进行数据处理,所以请不要对此发表评论。

FYR 代码片段

writer = pd.ExcelWriter(excel_path, engine='openpyxl', mode='a', if_sheet_exists="overlay",)
    for config in excelUpdateConfigs:
        result = fetchSQL(db_conn, config["sql"])
        result = result.astype(config["dtype"])
        result.to_excel(writer, sheet_name="Raw Data", float_format="%.5f", startrow=2, startcol=config["startcol"], header=True, index=False, engine="io.excel.xlsx.writer")
writer.close()

我尝试过的

我尝试在网上做一些研究,但现在找不到任何有关动态公式的相关文章。
我怀疑 ExcelWriter 的低级逻辑是根据给定路径创建一个新的 Excel 文件,而不是在其之上进行编辑,因此它会破坏一些方程式和插入的项目。如果我说错了请多多指教。

python pandas excel pandas.excelwriter
1个回答
0
投票

我尝试使用以下代码重现您的问题:

import pandas as pd
import numpy as np

excel_path = 'test.xlsx'

data = np.random.uniform(low=-10, high=10, size=400)

result = pd.DataFrame(data, columns=['close'])

writer = pd.ExcelWriter(excel_path, engine='openpyxl', mode='a', if_sheet_exists="overlay",)
result.to_excel(writer, sheet_name="Raw Data", float_format="%.5f", startrow=2, startcol=8, header=True, index=False, engine="io.excel.xlsx.writer")
writer.close()

test.xlsx 有两个选项卡:“原始数据”、“格式化数据”。 在格式数据单元格 A1 中,我在下面输入

=FILTER(UNIQUE('Raw Data'!$I$4:$I$2000),UNIQUE('Raw Data'!$I$4:$I$2000)<>0)

运行代码后,我看到过滤功能变成了这样:

所以我决定首先改变

FILTER
在“格式化数据”表中的应用方式,即在“格式化数据”中选择
A1:A2000
,在公式栏中输入
=FILTER(UNIQUE('Raw Data'!$I$4:$I$2000),UNIQUE('Raw Data'!$I$4:$I$2000)<>0)
,按Ctrl + Shift +输入。

这样openpyxl就不会改变它,并且它将始终容纳2000个数据点。

© www.soinside.com 2019 - 2024. All rights reserved.