0

我在 Python 中有一个脚本,它使用 xlwings 打开一个 Excel 文件,并逐行读取和处理某个列的值。这是for语句:

for row in range(2, rownum):

我想在工作表中实际包含某些内容的每一行上重复此功能。它从 2 开始,到 'rownum' 结束。我的问题是如何自动计算行数并将该值传递给'rownum'。我确定 xlwings 有办法做到这一点,但我想不通——也许是 Autofit 工具?

谢谢您的帮助!

4

7 回答 7

6

这是所有的API 文档

如果您只查找行数,则可以通过使用范围的current_region属性获取数组/表中的总行数,然后获取该范围的最后一个单元格的地址:(仅在以下情况下才有效您的范围是连续的 - 其中没有空行/列)

rownum = Range('A1').current_region.last_cell.row

或者,您可以使用table而不是current_region,范围会有所不同。

一旦你有了它,你就可以遍历行:

for i in range(1, rownum + 1): # The indexing starts at 1
    Range((i, 1)) = ...    # Will select cell 'Ai'

但正如其他答案中提到的那样,这会增加应用程序之间的调用,这将相当慢。更好地导入范围,对其进行修改并将其导出回 Excel。

于 2015-08-13T21:29:54.533 回答
2

除非我在阅读他们的API 文档时遗漏了一些东西,否则这似乎是不可能的。您可能需要使用其他库,例如pandas

import pandas as pd

df = pd.read_excel(excel_file_path, sheetname="Sheet1")
print len(df)

如果您不想为此使用另一个库,则可以采用艰难而丑陋的方式:

last_row = 0
while True:
    if cell_value is not None:  # replace cell_value with however 
                                # xlwings accesses a cell's value
       last_row += 1
    else:
        break

print last_row
于 2015-07-27T17:16:44.017 回答
1

使用 xlwings,您将首先读取 Range,然后对其进行迭代:

rng = Range((startrow, startcol), (rownum, colnum)).value
for row in rng:
    ...

然后在最后,写回结果:

Range((startrow, startcol)).value = result_rng

通过这种方式,您可以最大限度地减少缓慢的跨应用程序调用。

您可能还想使用Range.table.

于 2015-07-27T22:21:48.167 回答
1

我不得不做一个计数器,因为我正在自动化一堆从 excel 中提取并填充到不同网站的东西。这只是我想出的“原型”,只是为了确保我能做到。

wb = xw.Book(r'C:\Users\dd\Desktop\Testbook.xlsm') 
Dudsht = wb.sheets['Dud']

lastcell = Dudsht.range(1,1).end('down').row #this just does ctrl+shift+down
print(lastcell) #just so you know how many rows you have. Mine was 30.

x = 2
for i in range(x, lastcell+1):               #range of 2 to 30
        Dudsht.cells(i,2).value = 'y'        #enters 'y' triggering formulas
        if Dudsht.cells(i,1).value == 'ERROR':  
            Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 2
            continue          #if there is an error it will hightlight and skip an item
        time.sleep(.5)            #this was just so I could see visually
        Dudsht.cells(i,2).value = 'x'  
        print('Item' + str(i) + ' Complete')  #Item1 Complete
        time.sleep(.5)
        Dudsht.cells(i,1).api.EntireRow.Interior.ColorIndex = 3  #highlights completed item
于 2018-03-09T19:30:21.533 回答
0

如果没有空行,你可以使用这个:

len(Range('A1').vertical)
于 2016-02-23T07:21:06.170 回答
0

您不需要知道工作表中有多少行。

import xlwings as xw

wb = xw.Book('20180301.xlsm')
sh = wb.sheets['RowData']

rownum = 2
while (sh.range('A'+str(rownum)).value != None):
    value = sh.range('A'+str(rownum)).value
    print(str(value))
    rownum += 1

这将打印出 A 列中的所有数据。

于 2018-04-27T04:20:16.867 回答
0

来自https://gist.github.com/Elijas/2430813d3ad71aebcc0c83dd1f130e33?permalink_comment_id=2088976#gistcomment-2088976的清洁解决方案:

used_range_rows = (active_sheet.api.UsedRange.Row, active_sheet.api.UsedRange.Row + active_sheet.api.UsedRange.Rows.Count)

used_range_cols = (active_sheet.api.UsedRange.Column, active_sheet.api.UsedRange.Column + active_sheet.api.UsedRange.Columns.Count)

used_range = xw.Range(*zip(used_range_rows, used_range_cols))
于 2022-02-28T16:36:41.687 回答