【问题标题】:Get column names of Excel worksheet with OpenPyXL in readonly mode在只读模式下使用 OpenPyXL 获取 Excel 工作表的列名
【发布时间】:2019-01-29 05:59:19
【问题描述】:

我怎样才能找回来

  1. openpyxl Read-only 工作表中的列名(第一行单元格的值)?
    • 以下示例工作表中的CityPopulationCountry
  2. openpyxl 只读工作簿中的所有列名?
    • CityPopulationCountry、工作表 1 中的框架和所有其他工作表中的其他列名称

Excel 工作表示例:

| City       | Population  |    Country   |
| -----------|------------ | ------------ |
| Madison    |   252,551   |     USA      |
| Bengaluru  | 10,178,000  |    India     |
| ...        |       ...   |     ...      |

示例代码:

from openpyxl import load_workbook

wb = load_workbook(filename=large_file.xlsx, read_only=True)
sheet = wb.worksheets[0]

... (not sure where to go from here)

注意事项:

  • 我必须使用只读,因为 Excel 文件有超过 100 万行(不要问)
  • 我想要列名,以便最终推断列类型并将 Excel 数据导入 PostgreSQL 数据库

【问题讨论】:

  • 您对“标题”一词的使用含糊不清。
  • 好点,编辑了问题。
  • 你还在谈论 print_titles 是不同的东西。页眉和页脚也是如此。
  • 再次编辑问题。
  • 那么,现在的问题是什么? [c.value for c in ws.iter_rows(min_row=1, max_row=1)] 不够?

标签: python excel openpyxl


【解决方案1】:

只读模式提供对工作表中任何行或行集的快速访问。使用方法iter_rows() 来限制选择。所以要获取工作表的第一行:

rows = ws.iter_rows(min_row=1, max_row=1) # returns a generator of rows
first_row = next(rows) # get the first row
headings = [c.value for c in first_row] # extract the values from the cells

【讨论】:

  • 请查看已编辑的问题。我有兴趣从 Excel 文档中获取列名列表(可能是第一行),而不是标题。很抱歉造成混乱。
  • 按列名是指要获取列的字母?
  • 我的意思是在 Excel 工作表中标记列的单词。 (CityPopulationCountry 在问题中更新的示例工作表中)。
  • 这些只是第一行单元格的值。
  • 好的,感谢@Charlie Clark 的澄清。我将其添加到问题中,希望能把事情弄清楚。
【解决方案2】:

这将打印第 1 行的所有内容;

list_with_values=[]
for cell in ws[1]:
    list_with_values.append(cell.value)

如果您出于某种原因想要获取已填写的列字母列表,您可以:

column_list = [cell.column for cell in ws[1]]

对于您的第二个问题; 假设您已将标题值存储在名为:“list_with_values”的列表中

from openpyxl import Workbook
wb = Workbook()
ws = wb['Sheet']
#Sheet is the default sheet name, you can rename it or create additional ones with wb.create_sheet()
ws.append(list_with_values)
wb.save('OutPut.xlsx')

【讨论】:

  • 谢谢,for 循环确实解决了我的第一个问题。我最终创建了一个列表并将这些单元格值附加到列表中。
  • 很高兴听到这个消息,如果我的回答满足了您的问题,请选择它作为答案。
  • 这解决了我的问题的第一部分,但是你有第二部分的解决方案吗(返回 openpyxl 只读工作簿中的所有列名)?
【解决方案3】:

Charlie Clarks 的答案被压缩成一个带有列表理解的单行

    headers = [c.value for c in next(wb['sheet_name'].iter_rows(min_row=1, max_row=1))]

【讨论】:

    【解决方案4】:

    我就是这样处理的

    from openpyxl.utils import get_column_letter
    
    def get_columns_from_worksheet(ws):
      return {
          cell.value: {
              'letter': get_column_letter(cell.column),
              'number': cell.column - 1
          } for cell in ws[1] if cell.value
      }
    

    使用的一个例子是

    from openpyxl import load_workbook
    
    wb = load_workbook(filename='my_file.xlsx')
    ws = wb['MySheet']
    
    COLUMNS = get_columns_from_worksheet(ws)
    
    for cell in ws[COLUMNS['MY Named Column']['letter']]:
        print(cell.value)
    

    同时捕获字母和数字代码的主要原因是因为 openpyxl 中的不同功能和模式使用数字或字母,因此参考两者是无价的

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-20
      • 2022-06-30
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 1970-01-01
      • 2017-11-03
      相关资源
      最近更新 更多