XLSXWriter FILTER(): 参考其他工作表?
XLSXWriter FILTER(): Reference to Other Worksheet?
我有一个名为 Sheet1 的选项卡。它从名为 Data_Summary
.
的选项卡中过滤数据
如果我在 Sheet1 的单元格 A2 中输入此 FILTER() 函数,然后点击 return:
=FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91="Assigned")
...一切正常:
但是如果我通过 XLSXWriter 输入这个:
worksheet.write_array_formula("A2:B73", "=_xlfn._xlws.FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91=\"Assigned\")")
...过滤器仍然有效,但在被过滤的行之后的行中,我得到很多包含 #N/A
.
的行
我该如何纠正?
您得到了很多 N/A 值,因为您定义的数组比返回的结果大。如果您手动输入 FILTER() 函数,它会根据结果数量 returns 自动完成。但是对于 xlsxwriter,除了使用 write_array_formula 方法和定义特定范围外,我找不到编写公式的方法。这并不方便,因为我想大多数时候你不知道你会得到多少结果。
我找到了一个解决方案,方法是计算字符串 'Assigned' 在您的范围内出现的次数,然后将此数字用作公式数组的结束行。但这需要您通过 pandas 导入数据框。据我所知,无法使用 xlsxwriter 读取单元格的值并稍后在公式中使用它,也许 John 可以对此进行更多阐述。
这是一个基于您提供给我们的信息的工作示例:
import pandas as pd
import numpy as np
# Cretae a test df
df = pd.DataFrame({'Track Number': ['Track #1','Track #2','Track #3','Track #4','Track #5',
'Track #6','Track #7','Track #8','Track #9','Track #10'],
'Status': ['Assigned',np.nan,'Assigned',np.nan,np.nan,
'Assigned','Assigned',np.nan,np.nan,np.nan]})
# Start the xlsxwriter
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
workbook = writer.book
worksheet = workbook.add_worksheet()
# You could count them using excel's native formula but you will not be able to store it
# into a variable as the formulas are calculated when the file opens
#worksheet.write_formula('D1', '=COUNTIF(Data_Summary!B:B,"Assigned")')
# Using pandas is possible though
# Use loc or iloc for specific range, otherwise pass in the whole column df['Status']
count = df.loc[0:10,'Status'].str.count('Assigned').sum()
worksheet.write_array_formula(f'A1:B{count}', '=_xlfn._xlws.FILTER(Data_Summary!A1:B11,Data_Summary!B1:B11="Assigned")')
# Pass the main df to a second sheet named Data_Summary
df.to_excel(writer, sheet_name='Data_Summary', index=False)
writer.save()
输出:
主 df:
结果:
如果我定义了比返回结果更大的范围,例如:
worksheet.write_array_formula('A1:B8', '=_xlfn._xlws.FILTER(Data_Summary!A1:B11,Data_Summary!B1:B11="Assigned")')
我回来#N/As:
我有一个名为 Sheet1 的选项卡。它从名为 Data_Summary
.
如果我在 Sheet1 的单元格 A2 中输入此 FILTER() 函数,然后点击 return:
=FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91="Assigned")
...一切正常:
但是如果我通过 XLSXWriter 输入这个:
worksheet.write_array_formula("A2:B73", "=_xlfn._xlws.FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91=\"Assigned\")")
...过滤器仍然有效,但在被过滤的行之后的行中,我得到很多包含 #N/A
.
我该如何纠正?
您得到了很多 N/A 值,因为您定义的数组比返回的结果大。如果您手动输入 FILTER() 函数,它会根据结果数量 returns 自动完成。但是对于 xlsxwriter,除了使用 write_array_formula 方法和定义特定范围外,我找不到编写公式的方法。这并不方便,因为我想大多数时候你不知道你会得到多少结果。
我找到了一个解决方案,方法是计算字符串 'Assigned' 在您的范围内出现的次数,然后将此数字用作公式数组的结束行。但这需要您通过 pandas 导入数据框。据我所知,无法使用 xlsxwriter 读取单元格的值并稍后在公式中使用它,也许 John 可以对此进行更多阐述。
这是一个基于您提供给我们的信息的工作示例:
import pandas as pd
import numpy as np
# Cretae a test df
df = pd.DataFrame({'Track Number': ['Track #1','Track #2','Track #3','Track #4','Track #5',
'Track #6','Track #7','Track #8','Track #9','Track #10'],
'Status': ['Assigned',np.nan,'Assigned',np.nan,np.nan,
'Assigned','Assigned',np.nan,np.nan,np.nan]})
# Start the xlsxwriter
writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
workbook = writer.book
worksheet = workbook.add_worksheet()
# You could count them using excel's native formula but you will not be able to store it
# into a variable as the formulas are calculated when the file opens
#worksheet.write_formula('D1', '=COUNTIF(Data_Summary!B:B,"Assigned")')
# Using pandas is possible though
# Use loc or iloc for specific range, otherwise pass in the whole column df['Status']
count = df.loc[0:10,'Status'].str.count('Assigned').sum()
worksheet.write_array_formula(f'A1:B{count}', '=_xlfn._xlws.FILTER(Data_Summary!A1:B11,Data_Summary!B1:B11="Assigned")')
# Pass the main df to a second sheet named Data_Summary
df.to_excel(writer, sheet_name='Data_Summary', index=False)
writer.save()
输出:
主 df:
结果:
如果我定义了比返回结果更大的范围,例如:
worksheet.write_array_formula('A1:B8', '=_xlfn._xlws.FILTER(Data_Summary!A1:B11,Data_Summary!B1:B11="Assigned")')
我回来#N/As: