我想创建一个快速脚本,从标准化表单(word 文档/docx)中提取数据并将其传输到 Excel 工作表中,并附上一张进行一些计算的工作表。 一切都运行得很好,除了一个例外:
我希望能够过滤特定项目编号、用户首字母或其他数据点的结果,但是当我在 Excel 工作表上添加过滤器时,每当我从 Python 运行它时,我都会收到“命名冲突”错误消息,并且有为“_FilterDatabase”选择一个新名称 - 当我这样做时,过滤器消失了。 如果我不这样做,脚本就会崩溃。
我像这样打开工作表:
import win32com.client as win32
def openExcel():
xl = win32.gencache.EnsureDispatch('Excel.Application')
wb = xl.Workbooks.Open(path+"\\"+'Analysis.xlsx')
ws = wb.Sheets(1)
xl.Visible = True
return ws
然后我将数据中包含的数据点传递到Excel
def print2Excel(data, ws):
const = win32.constants
ws.Range("A2:H2").Insert(const.xlShiftDown, const.xlFormatFromRightOrBelow)
ws.Cells(2,1).Value = data["datapoint"]
...
即使我事后删除过滤器,这个问题仍然存在。一旦 Excel 工作表被过滤一次,错误就会发生,直到时间结束。到目前为止,唯一的出路是git重置/签出Excel。
我看不到您应用过滤器的位置,但在应用过滤器之前,您是否尝试过将 AutoFilterMode 设置为 False,然后添加过滤器?例如
sh_data.Rows(1).AutoFilter(Field=1, Criteria1='B')
多年来,我一直很难使用 xlwings 将数据导出到带有过滤器的 Excel 文件中。我希望 xlwings 能够解决这个限制。
同时,我最近尝试了两种可能的解决方案。每当将新过滤器添加到工作表时都需要重复执行这两项操作。我不确定这两种解决方案是否适用于长期或适用于所有情况。请投票或评论什么有效以及何时有效。
ExtendOffice 的解决方案 1
取消隐藏隐藏名称值,然后在运行以下宏后通过 NameManager 更改 _FilterDatabase 名称:
Sub ShowNames()
'Update 20140318
Dim xName As Name
For Each xName In Application.ActiveWorkbook.Names
xName.Visible = True
Next
End Sub
解决方案 2 改编自 Excel 教授。