使用python查找Excel中的列中是否存在值

使用python查找Excel中的列中是否存在值,python,excel,arcpy,Python,Excel,Arcpy,我有一个Excel文件,其中一个工作表包含沉积物收集数据。我正在运行一个很长的Python脚本 在工作表中有一个标题为“CollectionYear”的专栏,说我想要2010年。如果“CollectionYear”列中存在2010年,我希望脚本的其余部分运行,如果不存在,则希望脚本停止 这似乎是一项足够简单的任务,但就我的一生而言,我无法理解它,也找不到任何例子 任何帮助都将不胜感激。我一直在使用xlrd,它对我来说非常有用。像这样的东西可能会有帮助 from xlrd import open_

我有一个Excel文件,其中一个工作表包含沉积物收集数据。我正在运行一个很长的Python脚本

在工作表中有一个标题为“CollectionYear”的专栏,说我想要2010年。如果“CollectionYear”列中存在2010年,我希望脚本的其余部分运行,如果不存在,则希望脚本停止

这似乎是一项足够简单的任务,但就我的一生而言,我无法理解它,也找不到任何例子


任何帮助都将不胜感激。

我一直在使用xlrd,它对我来说非常有用。像这样的东西可能会有帮助

from xlrd import open_workbook

def main():
    book = open_workbook('example.xlsx')
    sheet = book.sheet_by_index(0)
    collection_year_col = 2 #Just an example
    test_year = 2010
    for row in range(sheet.nrows):
        if sheet.cell(row,collection_year_col).value == test_year:
            runCode()

def runCode():
    #your code
我希望这为你指明了正确的方向。如果您知道问题的详细信息,可以提供更多帮助。

尝试使用库从python与Excel交互

他们文档中的示例:

from xlwings import Workbook, Sheet, Range, Chart
wb = Workbook()  # Creates a connection with a new workbook
Range('A1').value = 'Foo 1'
Range('A1').value
>>> 'Foo 1'
Range('A1').value = [['Foo 1', 'Foo 2', 'Foo 3'], [10.0, 20.0, 30.0]]

下面是我从处理一大堆
.xls
文件的大海捞针问题中学到的。有些事情是朋友们做不到的,比如获取单元格的公式。为此,您需要使用Microsoft 1

我建议您在Win32上找到MarkHammond的Python编程副本。20年后它仍然有用。Win32上的Python编程涵盖了COM的基础知识以及如何使用库访问COM(也来自Mark Hammond)

简而言之,您可以将COM看作服务器(比如Excel)和客户端(比如Python脚本)之间的API 2

导入win32com.client
#连接到Excel服务器
xl=win32com.client.Dispatch(“Excel.Application”)
COM API是。一旦你习惯了这个术语,事情就会变得简单明了,尽管很乏味。例如,Excel文件在技术上是“工作簿”。“Workbooks”COM对象提供了一个句柄,用于Python与“工作簿”交互。(你有没有注意到这些词的结尾不同?)

导入win32com.client
#连接到Excel服务器
xl=win32com.client.Dispatch(“Excel.Application”)
myfile=r'C:\temp\myworkbook.xls'
wb=xl.Workbooks.Open(文件名=myfile)
“工作簿”包含一个“工作表”,可通过“工作表”COM对象在此处访问:

导入win32com.client
#连接到Excel服务器
xl=win32com.client.Dispatch(“Excel.Application”)
myfile=r'C:\temp\myworkbook.xls'
wb=xl.Workbooks.Open(文件名=myfile)
sht1=wb.Sheets.项目(1)
最后,工作表的“”属性“返回表示工作表上所有单元格的范围对象”。然后,范围对象有一个在范围内搜索的方法。LookIn参数允许搜索单元格值、公式和注释

导入win32com.client
#连接到Excel服务器
xl=win32com.client.Dispatch(“Excel.Application”)
myfile=r'C:\temp\myworkbook.xls'
wb=xl.Workbooks.Open(文件名=myfile)
sht1=wb.Sheets.项目(1)
match=sht1.Cells.Find('搜索字符串')
Find的结果是一个Range对象,它有许多有用的内容,比如Formula、GetAddress、Value和Text。你也会发现,与微软的任何产品一样,它对政府工作来说已经足够好了

最后,不要忘记关闭工作簿并退出Excel

导入win32com.client
#连接到Excel服务器
xl=win32com.client.Dispatch(“Excel.Application”)
myfile=r'C:\temp\myworkbook.xls'
wb=xl.Workbooks.Open(文件名=myfile)
sht1=wb.Sheets.项目(1)
match=sht1.Cells.Find('搜索字符串')
打印(匹配公式)
wb.Close(SaveChanges=False)
xl.Quit()
您可以使用和扩展这些想法,并在工作簿(或目录中的所有工作簿)中的所有工作表上进行迭代。你可以玩得很开心

您可能会遇到的难题包括VBA宏和嵌入对象,以及它们各自可能产生的各种不同警报。性能也是一个问题。以下静默通知可以显著提高性能:

应用程序

  • (错)
  • (msoAutomationSecurityForceDisable)
  • (错)
  • (错)
  • (错)
  • (错)
工作簿

  • (对)
  • (错)
  • (错)
另一个潜在问题是。基本上,Python有关于COM对象的信息吗?这会影响内省和COM对象的引用方式。默认情况下,
win32com.client
包使用后期绑定自动化

对于后期绑定自动化,Python对COM对象了解不多:

>导入win32com.client
>>xl=win32com.client.Dispatch(“Excel.Application”)
>>xl
>>len(dir(xl))
55
通过早期绑定自动化,Python完全了解对象:

>导入win32com.client
>>xl=win32com.client.Dispatch(“Excel.Application”)
>>xl
>>len(dir(xl))
125
要启用早期绑定,必须运行
pywin32
附带的
makepy.py
。运行
makepy.py
将提示使用该库进行绑定

(venv)c:\temp\venv\Lib\site packages\win32com\client>python makepy.py
pythonmakepy.py

该过程创建一个Python文件(在
Temp\
中),该文件映射COM对象的方法和属性

(venv)c:\temp\venv\Lib\site packages\win32com\client>python makepy.py
pythonmakepy.py
生成到C:\Users\Lorem\AppData\Local\Temp\gen\u py\3.6\00020813-0000-0000-C000-000000000046x0x1x9.py
正在从类型库生成定义。。。
生成。。。
导入模块
早期绑定还提供对COM常量的访问,如and和是区分大小写的(而后期绑定则不是)

这应该足以实现Python到Excel库(如),尽管有些过分


1实际上,
xlwings
通过
pywin32
利用COM工作。这是一个少依赖

2本例使用