向 Excel 提供来自 win32com 的数据时出现命名冲突 (_FilterDatabase)

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

我想创建一个快速脚本,从标准化表单(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。

python excel win32com
2个回答
0
投票

我看不到您应用过滤器的位置,但在应用过滤器之前,您是否尝试过将 AutoFilterMode 设置为 False,然后添加过滤器?例如

    sh_data.Rows(1).AutoFilter(Field=1, Criteria1='B')


0
投票

多年来,我一直很难使用 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 教授。

  1. 制作 Excel 工作簿的备份副本(重要!!!)。
  2. 从文件名中,删除 .xlsx 并将其替换为 .zip。
  3. 打开 .zip 文件并导航到“xl”文件夹,然后将“workbook.xml”移动到工作目录中。
  4. 打开“workbook.xml”(右键单击“打开方式”->“记事本”)并更改 和 之间定义的名称“_FilterDatabase”到“_FilterDatabase2”。
  5. 保存workbook.xml并将其返回到xl文件夹
  6. 将 .zip 文件重命名回 .xlsx。
  7. 打开 .xlsx 文件并允许 excel 恢复该文件。
  8. 交叉手指并希望它能起作用。
© www.soinside.com 2019 - 2024. All rights reserved.