用Python 2.6的openpyxl挣扎一下

道歉,如果这已被问到别处已经。

我为Python导入了openpyxl(v.1.6.1)(在这种情况下是2.6)。 到目前为止,它的工作很好,但我想做的事我不能完全弄清楚。

我将列出我需要首先阅读的xlsx文件的结构。 这基本上是一个备用名单,看起来像这样:

A1 B1 C1 D1
YYYY/MM/DD System1 System2 System3
A2 B2 C2 D2
2013/02/11 User A User B User C
A3 B3 C3 D3
2013/02/12 User D User E User F
A4 B4 C4 D4
2013/02/13 User G User H User I

我需要做的是首先扫描A中的所有单元格(除了第1行,所以A2到A-infinity),然后根据是否可以在单元格A2到A-infinity中find今天的date,打印与今天date以及用户所关联的系统(因此在这种情况下为B3,C3和D3以及B1,C1和D1)。

我可以粘贴到目前为止,但它不是很多:

 import openpyxl from openpyxl import load_workbook wb = load_workbook(filename = 'standby.xlsx', use_iterators = True) ws = wb.get_sheet_by_name(name = 'Sheet1') # ws is now an IterableWorksheet for row in ws.iter_rows(): # it brings a new method: iter_rows() for cell in row: print cell.internal_value 

有了标准的文本文件,我通常会做这样的事情:

 textfile = os.open('textfile', 'r') textfiler = textfile.readlines() for line in textfile: if "today's date" in line: print line 

我只是不知道如何使用openpyxl来处理带有xlsx文件的文本文件。 任何人都可以请给我一个提示如何去做这个?

我想我需要做的是扫描A下的所有东西(不知道该怎么做),为今天的date(我想我能弄明白的date)做一个匹配,然后打印整行(Bxxx,Cxxx, Dxxx等)如果今天的date已经被发现(不知道如何做到这一点)。

希望我解释了我的问题确定,但如果没有,请让我知道,我会再试一次。

编辑:感谢格伦,我觉得我比我更进一步,还有点还没有。 代码我到目前为止:

 import openpyxl from openpyxl import load_workbook def find_row(today, ws): for a in ws.iter_rows(): if today == a.internal_value: return (a) def main(): wb = load_workbook(filename = 'standby.xlsx', use_iterators = True) ws = wb.get_sheet_by_name(name = 'Sheet1') # ws is now an IterableWorksheet today = '2013-02-12 00:00:00' #whatever date format you're using row = find_row(today, ws) print row def test(): wb = load_workbook(filename = r'standby.xlsx') sheet_ranges = wb.get_sheet_by_name(name = 'Sheet1') print sheet_ranges.cell('A2607').value # D18 if __name__ == '__main__': main() 

我现在被卡住的错误是“AttributeError:'元组'对象没有属性'internal_value'”(仍然使用这个)。

def find_row部分看起来像这样:

 def find_row(today, ws): for a in ws.rows(): if today == a.internal_value: return (a) 

这提供了以下内容:NotImplementedError:使用“iter_rows()”

编辑#2:感谢格伦·斯温菲尔德的帮助和耐心,我想我终于明白了。 下面是代码现在的样子(请原谅,如果看起来有点乱,结果表明在电子表格中有很多列):
从openpyxl导入load_workbook导入date时间导入openpyxl

 def find_row(today, ws): for a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a14,a15,a16,a17,a18,a19,a20,a21,a22,a23,a24,a25,a26,a27,a28,a29,a30,a31,a32,a33,a34,a35,a36,a37,a38,a39,a40,a41,a42,a43,a44,a45,a46,a47,a48,a49,a50,a51,a52,a53,a54,a55,a56,a57,a58,a59,a60,a61,a62,a63,a64,a65,a66,a67,a68,a69,a70,a71,a72,a73,a74,a75,a76,a77,a78,a79,a80,a81,a82,a83,a84,a85,a86,a87,a88,a89,a90,a91,a92,a93 in ws.iter_rows(): if today == a1.internal_value: print(a1.internal_value,a2.internal_value,a3.internal_value,a4.internal_value,a5.internal_value,a6.internal_value,a7.internal_value,a8.internal_value,a9.internal_value,a10.internal_value,a11.internal_value,a12.internal_value,a13.internal_value,a14.internal_value,a15.internal_value,a16.internal_value,a17.internal_value,a18.internal_value,a19.internal_value,a20.internal_value,a21.internal_value,a22.internal_value,a23.internal_value,a24.internal_value,a25.internal_value,a26.internal_value,a27.internal_value,a28.internal_value,a29.internal_value,a30.internal_value,a31.internal_value,a32.internal_value,a33.internal_value,a34.internal_value,a35.internal_value,a36.internal_value,a37.internal_value,a38.internal_value,a39.internal_value,a40.internal_value,a41.internal_value,a42.internal_value,a43.internal_value,a44.internal_value,a45.internal_value,a46.internal_value,a47.internal_value,a48.internal_value,a49.internal_value,a50.internal_value,a51.internal_value,a52.internal_value,a53.internal_value,a54.internal_value,a55.internal_value,a56.internal_value,a57.internal_value,a58.internal_value,a59.internal_value,a60.internal_value,a61.internal_value,a62.internal_value,a63.internal_value,a64.internal_value,a65.internal_value,a66.internal_value,a67.internal_value,a68.internal_value,a69.internal_value,a70.internal_value,a71.internal_value,a72.internal_value,a73.internal_value,a74.internal_value,a75.internal_value,a76.internal_value,a77.internal_value,a78.internal_value,a79.internal_value,a80.internal_value,a81.internal_value,a82.internal_value,a83.internal_value,a84.internal_value,a85.internal_value,a86.internal_value,a87.internal_value,a88.internal_value,a89.internal_value,a90.internal_value,a91.internal_value,a92.internal_value,a93.internal_value) def main(): wb = load_workbook(filename = 'standby.xlsx', use_iterators = True) ws = wb.get_sheet_by_name(name = 'Sheet1') # ws is now an IterableWorksheet today = datetime.datetime(2013, 02, 12, 0, 0) #whatever date format you're using row = find_row(today, ws) def test(): wb = load_workbook(filename = r'standby.xlsx') sheet_ranges = wb.get_sheet_by_name(name = 'Sheet1') print sheet_ranges.cell('A2607').value # D18 if __name__ == '__main__': main() 

我现在不能testing这个,但是原则上你需要遍历每一行,随时解开单元格,然后检查单元格A是否有今天的date,如果是,返回这行。

 import openpyxl from openpyxl import load_workbook def find_row(today, ws): for a,b,c,d in ws.rows(): if today == a.internal_value: return (a, b, c, d) raise someException('row not found') wb = load_workbook(filename = 'standby.xlsx', use_iterators = True) ws = wb.get_sheet_by_name(name = 'Sheet1') # ws is now an IterableWorksheet today = '' #whatever date format you're using try: row = find_row(today, ws) except someException: # handle exception 

在Python中有几种方式来做这件事,例如while / else循环,但这是它的本质。

更新回应评论:

 def find_row(today, ws): for a,b,c,d in ws.iter_rows(): if today == a.internal_value: return (a, b, c, d) raise someException('row not found') 

use_iterators = True标志意味着你得到一个迭代器,所以你必须使用iter_rows()而不是.rows