我从数据库中以
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)
但是,ExcelWriter 处理后的 Excel 将动态公式更改为 I4:I400 范围内的数组公式,因为原始模板只有 396 个唯一值。即使更新的数据源有超过 396 个唯一值,它也只能显示 396 个项目。
如果有人能告知此问题的原因并提供阻止动态公式更改的解决方案,那就太好了。
备注:我尽量不使用Python进行数据处理,所以请不要对此发表评论。
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 文件,而不是在其之上进行编辑,因此它会破坏一些方程式和插入的项目。如果我说错了请多多指教。
我尝试使用以下代码重现您的问题:
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个数据点。