XLSXWriter FILTER():引用其他工作表?

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

我有一个名为Sheet1的标签。它从名为Data_Summary的标签中过滤数据。

如果我在Sheet1的单元格A2中输入此FILTER()函数,然后按回车键:

=FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91="Assigned")

...一切正常:

enter image description here

但是如果我通过XLSXWriter输入:

worksheet.write_array_formula("A2:B73", "=_xlfn._xlws.FILTER(Data_Summary!A20:B91,Data_Summary!B20:B91=\"Assigned\")")

...过滤器仍然有效,但是在被过滤的行之后的行中,我得到很多包含#N/A的行。

enter image description here

我该如何纠正?

excel excel-formula xlsxwriter
1个回答
1
投票

您将获得大量N / A值,因为您定义的数组要大于返回的结果。如果您要手动输入FILTER()函数,它将根据返回的结果自动完成。但是使用xlsxwriter,除了使用write_array_formula方法并定义特定范围外,我找不到其他方法来编写公式。这不方便,因为我想大多数时候您都不知道会得到多少结果。

我找到了一个解决方案,方法是计算您在范围内出现的字符串'Assigned'的出现次数,然后将此数字用作公式数组的结尾行。但这需要您通过熊猫导入数据框。据我所知,无法使用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()

[OUTPUT

主df:

enter image description here

结果:enter image description here

如果我定义的范围大于返回的结果,例如:

worksheet.write_array_formula('A1:B8', '=_xlfn._xlws.FILTER(Data_Summary!A1:B11,Data_Summary!B1:B11="Assigned")')

我回来了#N / As:

enter image description here

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