【问题标题】:Quickly count non empty cells in large excel sheet快速计算大型 Excel 工作表中的非空单元格
【发布时间】:2017-09-20 18:41:42
【问题描述】:

我正在尝试确定大型 Excel 工作表中缺少多少数据。以下代码需要大量时间才能完成。我见过类似的问题,但我不确定如何翻译这个案例的答案。任何帮助将不胜感激!

import openpyxl

wb = openpyxl.load_workbook('C://Users/Alec/Documents/Vertnet master list.xlsx', read_only = True)
sheet = wb.active

lat = 0
loc = 0
ele = 0

a = openpyxl.utils.cell.column_index_from_string('CF')
b = openpyxl.utils.cell.column_index_from_string('BU')
c = openpyxl.utils.cell.column_index_from_string('BX')

print('Workbook loaded')

for x in range(2, sheet.max_row):
    if sheet.cell(row = x, column = a).value:
        lat += 1
    if sheet.cell(row = x, column = b).value:
        loc += 1
    if sheet.cell(row = x, column = c).value:
        ele += 1
    print((x/sheet.max_row) * 100, '%')
print('Latitude: ', lat/sheet.max_row)
print('Location', loc/sheet.max_row)
print('Elevation', ele/sheet.max_row)

【问题讨论】:

  • 您是要查找留在整个工作表上的单元格(太多)还是只查找留在工作表上的表格中的单元格(明显更少)?

标签: python openpyxl


【解决方案1】:

如果您只是想对工作表上的表格而不是整个工作表进行计算,您可以进行一次调整以使其更快。

row = 1
Do Until IsEmpty(range("A1").offset(row,1).value)
     if range("B"&row).value: lat += 1 
     if range("C"&row).value: loc += 1 
     if range("D"&row).value: ele += 1 
     row = row + 1
     Loop

这会将您带到您定义的表格的末尾,而不是整个工作表的末尾,这是您花费这么长时间的 90% 的原因。

希望对你有帮助

【讨论】:

  • 我正在尝试计算跨越整个工作表的 3 列感兴趣的非空单元格,大约 250k 行。
  • 您能否详细说明您的数据,是否存在差距?是否至少有一列对每个单元格都有一个值?有了这个,我可以提出另一个解决方案。
  • 是的,每一行都至少有价值。事实上,有一列完全没有间隙。其他的,尤其是我感兴趣的那三个,有很多空白,我只是想弄清楚这三列中的每一列有多少空白。
  • 好的,你可以使用我在没有任何间隙的列上的范围代码,这样它将选择总范围,或者你可以做一个直到循环,并且一直到列中的单元格为空
  • 哦,好的,酷!我仍然不确定那条线是如何工作的。你能把它添加到我上面发布的代码中吗?如果您能向我解释一下它在做什么,我将不胜感激!
【解决方案2】:

您的问题是,尽管文档中提出了相反的建议,但您正在使用自己的计数器来访问单元格。在只读模式下,每次使用 ws.cell() 都会强制工作表重新解析工作表的 XML 源。只需使用ws.iter_rows(min_col=a, max_col=c) 即可获取您感兴趣的列中的单元格。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-10
    • 1970-01-01
    • 2017-02-12
    • 1970-01-01
    • 1970-01-01
    • 2011-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多