当前位置:   article > 正文

Python酷库之旅-比翼双飞情侣库(12)

Python酷库之旅-比翼双飞情侣库(12)

目录

一、xlrd库的由来

二、xlrd库优缺点

1、优点

1-1、支持多种Excel文件格式

1-2、高效性

1-3、开源性

1-4、简单易用

1-5、良好的兼容性

2、缺点

2-1、对.xlsx格式支持有限

2-2、功能相对单一

2-3、更新和维护频率低

2-4、依赖外部资源

三、xlrd库的版本说明

1、xlrd 1.2.0版本

2、xlrd 2.0.1版本

3、xlrd3(非官方名称)

四、如何学好xlrd库?

1、获取xlrd库的属性和方法

2、获取xlrd库的帮助信息

3、实战案例

3-73、通过定义名称引用单元格区域

3-74、引用单元格的快捷方式

3-75、引用某个单元格

3-76、引用工作表的全部单元格

3-77、引用连续的单元格区域

3-78、通过输入框(tkinter)引用所选择的单元格

3-79、引用活动单元格

3-80、引用已选定的单元格

3-81、引用已使用的单元格区域

3-82、引用被空白行和列包围的单元格区域

3-83、利用类似Offset属性动态引用某个单元格

3-84、利用类似Offset属性动态引用单元格区域

3-85、利用类似Resize属性引用变更为指定大小的单元格区域

3-86、引用不包括标题行的单元格区域

3-87、引用不包括标题列的单元格区域

3-88、引用任意单元格区域的右下角单元格

3-89、引用输入了计算公式的所有单元格

3-90、引用输入了常量的所有单元格

3-91、引用输入了数字的所有单元格

3-92、引用输入了文本的所有单元格

3-93、引用输入了逻辑值的所有单元格

3-94、引用输入了批注的所有单元格

3-95、引用没有输入任何数据和公式的空单元格

3-96、引用所有可见单元格

五、推荐阅读

1、Python筑基之旅

2、Python函数之旅

3、Python算法之旅

4、Python魔法之旅

5、博客个人主页

        在Excel中,通常所说的“情侣键”并非官方术语,而是对某些常用且经常成对出现的快捷键的一种形象化的称呼。其中,最为人熟知和广泛使用的“情侣键”是“Ctrl+C”和“Ctrl+V”。

1、Ctrl+C:这个快捷键的作用是“拷贝”或“复制”。当你在Excel中选中某个单元格、一行、一列或整个工作表的内容后,按下Ctrl+C键,这些内容就会被复制到计算机的剪贴板中,等待下一步的粘贴操作。
2、Ctrl+V:这个快捷键的作用是“粘贴”。在你按下Ctrl+C键将内容复制到剪贴板后,可以通过按下Ctrl+V键将这些内容粘贴到Excel中的另一个位置,这两个操作经常是连续进行的,因此Ctrl+C和Ctrl+V就像一对“情侣”,总是成对出现。

        除了这对常见的“情侣键”外,Excel中还有许多其他的快捷键可以帮助用户更高效地完成各种操作。然而,这些快捷键通常并没有像Ctrl+C和Ctrl+V那样形成特定的“情侣”关系。

        然而,今天我不再展开介绍“情侣键”,而是要重点推介Python中的“情侣库”,即xlrd和xlwt两个第三方库。

一、xlrd库的由来

        xlrd库是一种用于在Python中读取Excel文件的库,它的名称中的"xl"代表Excel,"rd"代表读取,其开发者是John Machin(注:库名字符拆分诠释,只是一种猜测)。

        xlrd最初是在2005年开始开发的,是基于Python的开源项目(下载:xlrd库官网下载)。

        由于Excel文件在数据处理和分析中的重要性,xlrd库填补了Python在处理Excel文件方面的空白,使得用户可以方便地在Python环境中读取Excel文件的内容,并进行进一步的数据操作和分析。

二、xlrd库

1、优点
1-1、支持多种Excel文件格式

        xlrd库支持多种Excel文件格式,包括`.xls`和`.xlsx`(在旧版本中),这使得无论数据存储在哪种格式的Excel文件中,用户都可以使用xlrd库来读取。


1-2、高效性

        xlrd库使用C语言编写,因此其性能非常高,即使面对非常大的Excel文件,xlrd也可以快速地读取其中的数据。


1-3、开源性

        xlrd是完全开源的,可以在GitHub等平台上找到其源代码,这使得任何人都可以根据自己的需求对其进行修改和扩展。


1-4、简单易用

        xlrd提供了简单直接的API来获取单元格数据、行列数等,使得从Excel文件中读取数据变得简单而高效。


1-5、良好的兼容性

        xlrd库适配多种Python版本,包括Python 2.7(不包括3.0-3.3)或Python 3.4及以上版本,这为用户提供了广泛的兼容性选择。

2、缺点
2-1、对.xlsx格式支持有限

        在xlrd 1.2.0之后的版本中(大约从2020年开始),xlrd库不再支持`.xlsx`文件格式,这限制了xlrd在新版Excel文件(主要是`.xlsx`格式)上的应用。


2-2、功能相对单一

        xlrd库主要专注于从Excel文件中读取数据,而不提供写入或修改Excel文件的功能,这使得在处理需要写入或修改Excel文件的任务时,用户需要结合其他库(如`openpyxl`或`xlwt`)使用。


2-3、更新和维护频率低

        由于xlrd库主要关注于读取Excel文件的功能,并且随着`.xlsx`格式的普及,其使用范围逐渐缩小,因此,xlrd库的更新和维护频率可能相对较低。


2-4、依赖外部资源

        在某些情况下,xlrd库可能需要依赖外部资源或库来完全发挥其功能,这可能会增加用户在使用xlrd库时的复杂性和不确定性。

        总之,xlrd库在读取Excel文件方面具有高效、开源和简单易用等优点,但在对`.xlsx`格式的支持、功能单一以及更新和维护频率等方面存在一些缺点,用户在选择使用xlrd库时需要根据自己的需求进行权衡和选择。

三、xlrd库的版本说明

        xlrd库适配的Python版本根据库的不同版本而有所不同。以下是针对几个主要版本的说明:

1、xlrd 1.2.0版本

1-1、适配Python>=2.7(不包括3.0-3.3)或Python>=3.4
1-2、该版本支持xlsx文件格式,并且是一个广泛使用的版本,因为它能够处理小到中等大小的Excel文件,并且具有较好的性能表现。

2、xlrd 2.0.1版本

2-1、适配Python>=2.7(不包括3.0-3.5)或Python>=3.6
2-2、该版本不再支持xlsx文件格式仅支持旧版的xls文件格式,因为在xlrd 2.0版本之后,xlrd移除了对xlsx格式的支持。

3、xlrd3(非官方名称)

        xlrd3是xlrd的开源扩展库,提供了对xlsx文件格式的支持,然而,请注意,xlrd3并不是xlrd的官方名称(下载:GitHub - Dragon2fly/xlrd3)。

四、如何学好xlrd库?

1、获取xlrd库的属性和方法

        用print()和dir()两个函数获取xlrd库所有属性和方法的列表

  1. # ['Book', 'FILE_FORMAT_DESCRIPTIONS', 'FMLA_TYPE_ARRAY', 'FMLA_TYPE_CELL', 'FMLA_TYPE_COND_FMT', 'FMLA_TYPE_DATA_VAL',
  2. # 'FMLA_TYPE_NAME', 'FMLA_TYPE_SHARED', 'Operand', 'PEEK_SIZE', 'Ref3D', 'XLDateError', 'XLRDError', 'XLS_SIGNATURE',
  3. # 'XL_CELL_BLANK', 'XL_CELL_BOOLEAN', 'XL_CELL_DATE', 'XL_CELL_EMPTY', 'XL_CELL_ERROR', 'XL_CELL_NUMBER', 'XL_CELL_TEXT', 'ZIP_SIGNATURE',
  4. # '__VERSION__', '__builtins__', '__cached__', '__doc__', '__file__', '__loader__', '__name__', '__package__', '__path__',
  5. # '__spec__', '__version__',
  6. # 'biff_text_from_num', 'biffh', 'book', 'cellname', 'cellnameabs', 'colname', 'compdoc', 'count_records', 'decompile_formula',
  7. # 'dump', 'dump_formula', 'empty_cell', 'error_text_from_code', 'evaluate_name_formula', 'formatting', 'formula', 'info',
  8. # 'inspect_format', 'oBOOL', 'oERR', 'oNUM', 'oREF', 'oREL', 'oSTRG', 'oUNK', 'okind_dict', 'open_workbook', 'open_workbook_xls',
  9. # 'os', 'pprint', 'rangename3d', 'rangename3drel', 'sheet', 'sys', 'timemachine', 'xldate', 'xldate_as_datetime', 'xldate_as_tuple', 'zipfile']
2、获取xlrd库的帮助信息

        用help()函数获取xlrd库的帮助信息

  1. Help on package xlrd:
  2. NAME
  3. xlrd
  4. DESCRIPTION
  5. # Copyright (c) 2005-2012 Stephen John Machin, Lingfo Pty Ltd
  6. # This module is part of the xlrd package, which is released under a
  7. # BSD-style licence.
  8. PACKAGE CONTENTS
  9. biffh
  10. book
  11. compdoc
  12. formatting
  13. formula
  14. info
  15. sheet
  16. timemachine
  17. xldate
  18. FUNCTIONS
  19. count_records(filename, outfile=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>)
  20. For debugging and analysis: summarise the file's BIFF records.
  21. ie: produce a sorted file of ``(record_name, count)``.
  22. :param filename: The path to the file to be summarised.
  23. :param outfile: An open file, to which the summary is written.
  24. dump(filename, outfile=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>, unnumbered=False)
  25. For debugging: dump an XLS file's BIFF records in char & hex.
  26. :param filename: The path to the file to be dumped.
  27. :param outfile: An open file, to which the dump is written.
  28. :param unnumbered: If true, omit offsets (for meaningful diffs).
  29. inspect_format(path=None, content=None)
  30. Inspect the content at the supplied path or the :class:`bytes` content provided
  31. and return the file's type as a :class:`str`, or ``None`` if it cannot
  32. be determined.
  33. :param path:
  34. A :class:`string <str>` path containing the content to inspect.
  35. ``~`` will be expanded.
  36. :param content:
  37. The :class:`bytes` content to inspect.
  38. :returns:
  39. A :class:`str`, or ``None`` if the format cannot be determined.
  40. The return value can always be looked up in :data:`FILE_FORMAT_DESCRIPTIONS`
  41. to return a human-readable description of the format found.
  42. open_workbook(filename=None, logfile=<_io.TextIOWrapper name='<stdout>' mode='w' encoding='utf-8'>, verbosity=0, use_mmap=True, file_contents=None, encoding_override=None, formatting_info=False, on_demand=False, ragged_rows=False, ignore_workbook_corruption=False)
  43. Open a spreadsheet file for data extraction.
  44. :param filename: The path to the spreadsheet file to be opened.
  45. :param logfile: An open file to which messages and diagnostics are written.
  46. :param verbosity: Increases the volume of trace material written to the
  47. logfile.
  48. :param use_mmap:
  49. Whether to use the mmap module is determined heuristically.
  50. Use this arg to override the result.
  51. Current heuristic: mmap is used if it exists.
  52. :param file_contents:
  53. A string or an :class:`mmap.mmap` object or some other behave-alike
  54. object. If ``file_contents`` is supplied, ``filename`` will not be used,
  55. except (possibly) in messages.
  56. :param encoding_override:
  57. Used to overcome missing or bad codepage information
  58. in older-version files. See :doc:`unicode`.
  59. :param formatting_info:
  60. The default is ``False``, which saves memory.
  61. In this case, "Blank" cells, which are those with their own formatting
  62. information but no data, are treated as empty by ignoring the file's
  63. ``BLANK`` and ``MULBLANK`` records.
  64. This cuts off any bottom or right "margin" of rows of empty or blank
  65. cells.
  66. Only :meth:`~xlrd.sheet.Sheet.cell_value` and
  67. :meth:`~xlrd.sheet.Sheet.cell_type` are available.
  68. When ``True``, formatting information will be read from the spreadsheet
  69. file. This provides all cells, including empty and blank cells.
  70. Formatting information is available for each cell.
  71. Note that this will raise a NotImplementedError when used with an
  72. xlsx file.
  73. :param on_demand:
  74. Governs whether sheets are all loaded initially or when demanded
  75. by the caller. See :doc:`on_demand`.
  76. :param ragged_rows:
  77. The default of ``False`` means all rows are padded out with empty cells so
  78. that all rows have the same size as found in
  79. :attr:`~xlrd.sheet.Sheet.ncols`.
  80. ``True`` means that there are no empty cells at the ends of rows.
  81. This can result in substantial memory savings if rows are of widely
  82. varying sizes. See also the :meth:`~xlrd.sheet.Sheet.row_len` method.
  83. :param ignore_workbook_corruption:
  84. This option allows to read corrupted workbooks.
  85. When ``False`` you may face CompDocError: Workbook corruption.
  86. When ``True`` that exception will be ignored.
  87. :returns: An instance of the :class:`~xlrd.book.Book` class.
  88. DATA
  89. FILE_FORMAT_DESCRIPTIONS = {'xls': 'Excel xls', 'xlsb': 'Excel 2007 xl...
  90. FMLA_TYPE_ARRAY = 4
  91. FMLA_TYPE_CELL = 1
  92. FMLA_TYPE_COND_FMT = 8
  93. FMLA_TYPE_DATA_VAL = 16
  94. FMLA_TYPE_NAME = 32
  95. FMLA_TYPE_SHARED = 2
  96. PEEK_SIZE = 8
  97. XLS_SIGNATURE = b'\xd0\xcf\x11\xe0\xa1\xb1\x1a\xe1'
  98. XL_CELL_BLANK = 6
  99. XL_CELL_BOOLEAN = 4
  100. XL_CELL_DATE = 3
  101. XL_CELL_EMPTY = 0
  102. XL_CELL_ERROR = 5
  103. XL_CELL_NUMBER = 2
  104. XL_CELL_TEXT = 1
  105. ZIP_SIGNATURE = b'PK\x03\x04'
  106. __VERSION__ = '2.0.1'
  107. biff_text_from_num = {0: '(not BIFF)', 20: '2.0', 21: '2.1', 30: '3', ...
  108. empty_cell = empty:''
  109. error_text_from_code = {0: '#NULL!', 7: '#DIV/0!', 15: '#VALUE!', 23: ...
  110. oBOOL = 3
  111. oERR = 4
  112. oNUM = 2
  113. oREF = -1
  114. oREL = -2
  115. oSTRG = 1
  116. oUNK = 0
  117. okind_dict = {-2: 'oREL', -1: 'oREF', 0: 'oUNK', 1: 'oSTRG', 2: 'oNUM'...
  118. VERSION
  119. 2.0.1
  120. FILE
  121. e:\python_workspace\pythonproject\lib\site-packages\xlrd\__init__.py
3、实战案例
3-73、通过定义名称引用单元格区域
略,xlrd库不支持此功能,需要借助其他库实现
3-74、引用单元格的快捷方式
  1. # 74、引用单元格的快捷方式
  2. import xlrd
  3. def excel_to_rowcol(excel_ref):
  4. """
  5. 将 Excel 单元格引用(如 "A1")转换为行号和列索引(从 0 开始)
  6. """
  7. col = ''.join(filter(str.isalpha, excel_ref))
  8. row_str = ''.join(filter(str.isdigit, excel_ref))
  9. row = int(row_str) - 1 # Excel 中的行号从 1 开始,Python 从 0 开始
  10. col_idx = 0
  11. for c in col:
  12. col_idx = col_idx * 26 + (ord(c.upper()) - ord('A') + 1)
  13. return row, col_idx - 1 # 列索引也从 0 开始
  14. if __name__ == '__main__':
  15. workbook = xlrd.open_workbook('example.xls')
  16. sheet = workbook.sheet_by_index(0)
  17. # 假设要引用的单元格是 "B2"
  18. cell_ref = "B2"
  19. row, col = excel_to_rowcol(cell_ref)
  20. # 使用 xlrd 读取单元格数据
  21. cell_value = sheet.cell_value(row, col)
  22. print(cell_value)
3-75、引用某个单元格
  1. # 75、引用某个单元格
  2. import xlrd
  3. # 打开工作簿
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 选择工作表(例如,选择第一个工作表)
  6. sheet = workbook.sheet_by_index(0)
  7. # 指定要读取的单元格的行号和列号
  8. # 假设我们要读取第3行第2列(即Excel中的C3单元格)
  9. row_index = 2 # 行号从0开始,所以第3行是索引2
  10. col_index = 1 # 列号从0开始,所以第2列是索引1
  11. # 读取指定单元格的数据
  12. cell_value = sheet.cell_value(row_index, col_index)
  13. # 打印单元格的值
  14. print("单元格C3的值是:", cell_value) # 输出:单元格C3的值是: 45458.0
3-76、引用工作表的全部单元格
  1. # 76、引用工作表的全部单元格
  2. import xlrd
  3. # 打开工作簿
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 选择工作表(例如,选择第一个工作表)
  6. sheet = workbook.sheet_by_index(0)
  7. # 遍历工作表的每一行
  8. for row_idx in range(sheet.nrows):
  9. # 初始化一个列表来存储当前行的所有单元格数据
  10. row_data = []
  11. # 遍历当前行的每一列
  12. for col_idx in range(sheet.ncols):
  13. # 读取单元格的值并添加到当前行的列表中
  14. cell_value = sheet.cell_value(row_idx, col_idx)
  15. row_data.append(cell_value)
  16. # 这里可以处理整行的数据,例如打印它
  17. print(row_data)
  18. # 如果你只想获取所有单元格的值,而不需要处理每一行,可以将它们存储在一个二维列表中
  19. all_cell_values = []
  20. for row_idx in range(sheet.nrows):
  21. row_data = []
  22. for col_idx in range(sheet.ncols):
  23. cell_value = sheet.cell_value(row_idx, col_idx)
  24. row_data.append(cell_value)
  25. all_cell_values.append(row_data)
  26. # 现在all_cell_values包含了工作表中所有单元格的值
  27. # 你可以根据需要进一步处理这个二维列表
3-77、引用连续的单元格区域
  1. # 77、引用连续的单元格区域
  2. import xlrd
  3. # 打开工作簿
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 选择工作表(例如,选择第一个工作表)
  6. sheet = workbook.sheet_by_index(0)
  7. # 定义连续单元格区域的起始行、起始列、结束行和结束列
  8. start_row = 1 # Excel中的第2行
  9. start_col = 0 # Excel中的第1列(A列)
  10. end_row = 5 # Excel中的第6行
  11. end_col = 2 # Excel中的第3列(C列)
  12. # 遍历连续单元格区域
  13. for row_idx in range(start_row - 1, end_row): # Python的索引从0开始,所以需要减1
  14. row_data = []
  15. for col_idx in range(start_col, end_col + 1): # 加上1以确保包含结束列
  16. cell_value = sheet.cell_value(row_idx, col_idx)
  17. row_data.append(cell_value)
  18. # 这里可以处理每一行的数据,例如打印它
  19. print(row_data)
3-78、通过输入框(tkinter)引用所选择的单元格
  1. # 78、通过输入框(tkinter)引用所选择的单元格
  2. import tkinter as tk
  3. from tkinter import simpledialog
  4. import xlrd
  5. def read_cell_from_excel(file_path, cell_ref):
  6. try:
  7. workbook = xlrd.open_workbook(file_path)
  8. sheet = workbook.sheet_by_index(0) # 假设读取第一个工作表
  9. row_idx, col_idx = excel_to_rowcol(cell_ref)
  10. cell_value = sheet.cell_value(row_idx, col_idx)
  11. return cell_value
  12. except Exception as e:
  13. return str(e)
  14. def excel_to_rowcol(excel_ref):
  15. """
  16. 将 Excel 单元格引用(如 "A1")转换为行号和列索引(从 0 开始)。
  17. """
  18. col, row_str = excel_ref.upper().split()
  19. row = int(row_str) - 1
  20. col_idx = 0
  21. for c in col:
  22. col_idx = col_idx * 26 + (ord(c) - ord('A') + 1)
  23. return row, col_idx - 1
  24. def on_select_file():
  25. file_path = simpledialog.askopenfilename(filetypes=[("Excel files", "*.xls;*.xlsx")])
  26. if file_path:
  27. cell_ref = input_box.get() # 获取输入框中的单元格引用
  28. cell_value = read_cell_from_excel(file_path, cell_ref)
  29. result_label.config(text=cell_value)
  30. root = tk.Tk()
  31. root.title("Excel Cell Reader")
  32. # 创建输入框用于输入单元格引用
  33. input_box = tk.Entry(root)
  34. input_box.pack(pady=10)
  35. # 创建按钮用于选择文件并读取单元格
  36. select_button = tk.Button(root, text="Select File and Read Cell", command=on_select_file)
  37. select_button.pack(pady=10)
  38. # 创建标签用于显示结果
  39. result_label = tk.Label(root, text="")
  40. result_label.pack(pady=10)
  41. root.mainloop()
3-79、引用活动单元格
  1. # 79、引用活动单元格
  2. import xlrd
  3. def excel_to_rowcol(excel_ref):
  4. """
  5. 将 Excel 单元格引用(如 "A1")转换为行号和列索引(从 0 开始)
  6. """
  7. col = ''.join(filter(str.isalpha, excel_ref))
  8. row_str = ''.join(filter(str.isdigit, excel_ref))
  9. row = int(row_str) - 1 # Excel 中的行号从 1 开始,Python 从 0 开始
  10. col_idx = 0
  11. for c in col:
  12. col_idx = col_idx * 26 + (ord(c.upper()) - ord('A') + 1)
  13. return row, col_idx - 1 # 列索引也从 0 开始
  14. # 示例用法
  15. # 打开工作簿
  16. workbook = xlrd.open_workbook('example.xls')
  17. # 假设活动工作表是第一个工作表
  18. sheet = workbook.sheet_by_index(0)
  19. # 获取活动单元格引用 (例如 "B2")
  20. # 你需要自己定义如何获取这个活动单元格的引用,这里假设它是已知的
  21. cell_ref = "B2"
  22. # 将单元格引用转换为行号和列索引
  23. row, col = excel_to_rowcol(cell_ref)
  24. # 使用 xlrd 读取单元格数据
  25. cell_value = sheet.cell_value(row, col)
  26. print(f'活动单元格 {cell_ref} 的值是: {cell_value}') # 输出:活动单元格 B2 的值是: 45458.0
3-80、引用已选定的单元格
  1. # 80、引用已选定的单元格
  2. import xlrd
  3. # 打开Excel文件
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 选择第一个工作表
  6. sheet = workbook.sheet_by_index(0)
  7. # 读取特定单元格的值
  8. # 假设我们要读取第一行第一列的单元格(即A1单元格)
  9. cell_value = sheet.cell(0, 0).value
  10. print(f"The value of the selected cell is: {cell_value}") # 输出:The value of the selected cell is: 45458.0
3-81、引用已使用的单元格区域
  1. # 81、引用已使用的单元格区域
  2. import xlrd
  3. # 打开Excel文件
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 选取特定的工作表,例如第一个工作表
  6. worksheet = workbook.sheet_by_index(0)
  7. # 获取工作表的有效行数和列数
  8. rows = worksheet.nrows
  9. cols = worksheet.ncols
  10. # 遍历并打印每个已使用单元的数据
  11. for row_index in range(rows):
  12. for col_index in range(cols):
  13. # 获取单元格的值
  14. cell_value = worksheet.cell(row_index, col_index).value
  15. print(f'Row {row_index}, Column {col_index}: {cell_value}')
3-82、引用被空白行和列包围的单元格区域
  1. # 82、引用被空白行和列包围的单元格区域
  2. import xlrd
  3. # 打开Excel文件
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 选取特定的工作表,例如第一个工作表
  6. worksheet = workbook.sheet_by_index(0)
  7. # 找到包含数据的最小和最大行、列索引
  8. min_row, max_row = None, None
  9. min_col, max_col = None, None
  10. for row_index in range(worksheet.nrows):
  11. for col_index in range(worksheet.ncols):
  12. cell_value = worksheet.cell(row_index, col_index).value
  13. if cell_value != "":
  14. if min_row is None or row_index < min_row:
  15. min_row = row_index
  16. if max_row is None or row_index > max_row:
  17. max_row = row_index
  18. if min_col is None or col_index < min_col:
  19. min_col = col_index
  20. if max_col is None or col_index > max_col:
  21. max_col = col_index
  22. # 打印包含数据的单元格区域
  23. if min_row is not None and min_col is not None:
  24. for row_index in range(min_row, max_row + 1):
  25. for col_index in range(min_col, max_col + 1):
  26. cell_value = worksheet.cell(row_index, col_index).value
  27. print(f'Row {row_index}, Column {col_index}: {cell_value}')
  28. else:
  29. print("The worksheet is empty.")
3-83、利用类似Offset属性动态引用某个单元格
  1. # 83、利用类似Offset属性动态引用某个单元格
  2. import xlrd
  3. # 打开Excel文件
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 选取特定的工作表,例如第一个工作表
  6. worksheet = workbook.sheet_by_index(0)
  7. # 定义起始单元格的位置,例如A1
  8. start_row = 0 # 对应Excel中的第1行
  9. start_col = 0 # 对应Excel中的第1列
  10. # 定义偏移量,例如偏移2行3列
  11. offset_row = 2
  12. offset_col = 3
  13. # 计算目标单元格的位置
  14. target_row = start_row + offset_row
  15. target_col = start_col + offset_col
  16. # 检查目标单元格是否在工作表范围内
  17. if target_row < worksheet.nrows and target_col < worksheet.ncols:
  18. # 获取目标单元格的值
  19. cell_value = worksheet.cell(target_row, target_col).value
  20. print(f'Target cell value at ({target_row+1}, {target_col+1}): {cell_value}') # 输出:Target cell value at (3, 4): Myelsa
  21. else:
  22. print("The target cell is out of the worksheet range.")
3-84、利用类似Offset属性动态引用单元格区域
  1. # 84、利用类似Offset属性动态引用单元格区域
  2. import xlrd
  3. # 打开工著名的 Excel 文件
  4. workbook = xlrd.open_workbook('example.xls')
  5. worksheet = workbook.sheet_by_index(0) # 选择工作表,这里选择第一张表
  6. # 定位起始单元格(例如第二行第三列,即B3)
  7. start_row = 1 # Excel 是从 1 开始计数,但在Python中列表从0开始
  8. start_col = 2
  9. # 定义要引用的区域大小,如 4 行 5 列
  10. num_rows = 4
  11. num_cols = 5
  12. # 使用循环结构读取单元格区域内的数据
  13. for r in range(start_row, start_row + num_rows):
  14. for c in range(start_col, start_col + num_cols):
  15. # 检查是否超出表格范围
  16. if r < worksheet.nrows and c < worksheet.ncols:
  17. # 获取单元格内容
  18. cell_value = worksheet.cell(r, c).value
  19. print(f'({r+1}, {c+1}): {cell_value}')
  20. else:
  21. # 跳过此单元格,防止越界
  22. print('Cell out of range.')
  23. # 请确保example.xlsx文件在脚本可以访问的路径中,并且存在对应的数据
3-85、利用类似Resize属性引用变更为指定大小的单元格区域
  1. # 85、利用类似Resize属性引用变更为指定大小的单元格区域
  2. import xlrd
  3. def get_resized_area(sheet, start_row, start_col, num_rows, num_cols):
  4. # 准备容器以存放单元格数据
  5. data = []
  6. for r in range(start_row, start_row + num_rows):
  7. row_data = []
  8. for c in range(start_col, start_col + num_cols):
  9. # 检查是否超出工作表范围
  10. if r < sheet.nrows and c < sheet.ncols:
  11. # 获取并添加单元格内容
  12. cell_value = sheet.cell_value(r, c)
  13. row_data.append(cell_value)
  14. else:
  15. # 如果超出范围则添加空值或者自定义的填充值
  16. row_data.append(None)
  17. data.append(row_data)
  18. return data
  19. # 使用例子
  20. workbook = xlrd.open_workbook('example.xls')
  21. worksheet = workbook.sheet_by_name('test1')
  22. # 设定起始单元格和区域大小
  23. start_row_index = 1 # Excel中的B3对应于row index 1
  24. start_col_index = 2 # Excel中的B3对应于col index 2
  25. num_rows_to_resize = 4
  26. num_cols_to_resize = 3
  27. # 获取调整大小后的区域
  28. resized_area = get_resized_area(worksheet, start_row_index, start_col_index, num_rows_to_resize, num_cols_to_resize)
  29. # 打印结果来验证
  30. for row in resized_area:
  31. print(row)
3-86、引用不包括标题行的单元格区域
  1. # 86、引用不包括标题行的单元格区域
  2. import xlrd
  3. def get_resized_area_excluding_headers(sheet, start_row, start_col, num_rows, num_cols):
  4. # 准备容器以存放单元格数据
  5. data = []
  6. for r in range(start_row + 1, start_row + 1 + num_rows): # 跳过标题行
  7. row_data = []
  8. for c in range(start_col, start_col + num_cols):
  9. # 检查是否超出工作表范围
  10. if r < sheet.nrows and c < sheet.ncols:
  11. # 获取并添加单元格内容
  12. cell_value = sheet.cell_value(r, c)
  13. row_data.append(cell_value)
  14. else:
  15. # 如果超出范围则添加空值或者自定义的填充值
  16. row_data.append(None)
  17. data.append(row_data)
  18. return data
  19. # 使用例子
  20. workbook = xlrd.open_workbook('example.xls')
  21. worksheet = workbook.sheet_by_name('test1')
  22. # 设定起始单元格和区域大小
  23. start_row_index = 0 # 标题行通常是第0行
  24. start_col_index = 0 # 根据需要调整列的起始位置
  25. num_rows_to_resize = 4 # 需要引用的行数
  26. num_cols_to_resize = 3 # 需要引用的列数
  27. # 获取调整大小后的区域,排除标题行
  28. resized_area = get_resized_area_excluding_headers(worksheet, start_row_index, start_col_index, num_rows_to_resize, num_cols_to_resize)
  29. # 打印结果来验证
  30. for row in resized_area:
  31. print(row)
3-87、引用不包括标题列的单元格区域
  1. # 87、引用不包括标题列的单元格区域
  2. import xlrd
  3. def get_resized_area_excluding_headers(sheet, start_row, start_col, num_rows, num_cols):
  4. # 准备容器以存放单元格数据
  5. data = []
  6. for r in range(start_row, start_row + num_rows):
  7. row_data = []
  8. for c in range(start_col + 1, start_col + 1 + num_cols): # 跳过标题列
  9. # 检查是否超出工作表范围
  10. if r < sheet.nrows and c < sheet.ncols:
  11. # 获取并添加单元格内容
  12. cell_value = sheet.cell_value(r, c)
  13. row_data.append(cell_value)
  14. else:
  15. # 如果超出范围则添加空值或者自定义的填充值
  16. row_data.append(None)
  17. data.append(row_data)
  18. return data
  19. # 使用例子
  20. workbook = xlrd.open_workbook('example.xls')
  21. worksheet = workbook.sheet_by_name('test1')
  22. # 设定起始单元格和区域大小
  23. start_row_index = 0 # 根据需要调整行的起始位置
  24. start_col_index = 0 # 标题列通常是第0列
  25. num_rows_to_resize = 4 # 需要引用的行数
  26. num_cols_to_resize = 3 # 需要引用的列数
  27. # 获取调整大小后的区域,排除标题列
  28. resized_area = get_resized_area_excluding_headers(worksheet, start_row_index, start_col_index, num_rows_to_resize, num_cols_to_resize)
  29. # 打印结果来验证
  30. for row in resized_area:
  31. print(row)
3-88、引用任意单元格区域的右下角单元格
  1. # 88、引用任意单元格区域的右下角单元格
  2. import xlrd
  3. # 打开工作簿(Workbook)
  4. workbook = xlrd.open_workbook('example.xls')
  5. # 通过索引或名称选择工作表(Sheet)
  6. worksheet = workbook.sheet_by_name('test1')
  7. # 设定单元格区域的左上角起点坐标(行索引,列索引)
  8. start_row = 1 # 比如第2行(索引从0开始)
  9. start_col = 1 # 比如第2列(索引从0开始)
  10. # 区域的高度(行数)和宽度(列数)
  11. num_rows = 5 # 区域高度为5
  12. num_cols = 3 # 区域宽度为3
  13. # 计算右下角单元格的坐标
  14. end_row = start_row + num_rows - 1 # 确保区域是正确的高度
  15. end_col = start_col + num_cols - 1 # 确保区域是正确的宽度
  16. # 确保给定的索引未超出工作表的最大行数和列数
  17. if end_row >= worksheet.nrows or end_col >= worksheet.ncols:
  18. print("The specified area goes beyond the worksheet's boundaries.")
  19. else:
  20. # 获取右下角单元格的值
  21. bottom_right_cell_value = worksheet.cell_value(end_row, end_col)
  22. # 输出右下角单元格的值
  23. print(f"The value in the bottom-right cell ({end_row + 1},{end_col + 1}) of the specified area is: {bottom_right_cell_value}")
3-89、引用输入了计算公式的所有单元格
略,xlrd库不支持此功能,需要借助其他库实现
3-90、引用输入了常量的所有单元格
  1. # 90、引用输入了常量的所有单元格
  2. import xlrd
  3. def find_cells_with_constant(file_path, constant):
  4. # 打开Excel文件
  5. workbook = xlrd.open_workbook(file_path)
  6. result = []
  7. # 遍历所有sheet
  8. for sheet_index in range(workbook.nsheets):
  9. sheet = workbook.sheet_by_index(sheet_index)
  10. # 遍历所有行和列
  11. for row_index in range(sheet.nrows):
  12. for col_index in range(sheet.ncols):
  13. cell_value = sheet.cell_value(row_index, col_index)
  14. # 检查单元格是否包含常量
  15. if cell_value == constant:
  16. cell_location = (sheet.name, row_index, col_index)
  17. result.append(cell_location)
  18. return result
  19. if __name__ == '__main__':
  20. file_path = 'example.xls'
  21. constant = 168 # 你要查找的常量值
  22. result = find_cells_with_constant(file_path, constant)
  23. if result:
  24. print(f"引用常量 {constant} 的单元格位置如下:")
  25. for loc in result:
  26. print(f"Sheet: {loc[0]}, 行: {loc[1] + 1}, 列: {loc[2] + 1}")
  27. else:
  28. print(f"没有找到引用常量 {constant} 的单元格!")
3-91、引用输入了数字的所有单元格
  1. # 91、引用输入了数字的所有单元格
  2. import xlrd
  3. def find_cells_with_numbers(file_path):
  4. # 打开Excel文件
  5. workbook = xlrd.open_workbook(file_path)
  6. result = []
  7. # 遍历所有sheet
  8. for sheet_index in range(workbook.nsheets):
  9. sheet = workbook.sheet_by_index(sheet_index)
  10. # 遍历所有行和列
  11. for row_index in range(sheet.nrows):
  12. for col_index in range(sheet.ncols):
  13. cell_value = sheet.cell_value(row_index, col_index)
  14. # 检查单元格是否包含数字
  15. if isinstance(cell_value, (int, float)):
  16. cell_location = (sheet.name, row_index, col_index, cell_value)
  17. result.append(cell_location)
  18. return result
  19. if __name__ == '__main__':
  20. file_path = 'example.xls'
  21. result = find_cells_with_numbers(file_path)
  22. if result:
  23. print(f"引用数字的单元格位置如下:")
  24. for loc in result:
  25. print(f"Sheet: {loc[0]}, 行: {loc[1] + 1}, 列: {loc[2] + 1}, 数值: {loc[3]}")
  26. else:
  27. print(f"没有找到引用数字的单元格!")
3-92、引用输入了文本的所有单元格
  1. # 92、引用输入了文本的所有单元格
  2. import xlrd
  3. def find_cells_with_text(file_path):
  4. # 打开Excel文件
  5. workbook = xlrd.open_workbook(file_path)
  6. result = []
  7. # 遍历所有sheet
  8. for sheet_index in range(workbook.nsheets):
  9. sheet = workbook.sheet_by_index(sheet_index)
  10. # 遍历所有行和列
  11. for row_index in range(sheet.nrows):
  12. for col_index in range(sheet.ncols):
  13. cell_value = sheet.cell_value(row_index, col_index)
  14. # 检查单元格是否包含文本
  15. if isinstance(cell_value, str):
  16. cell_location = (sheet.name, row_index, col_index, cell_value)
  17. result.append(cell_location)
  18. return result
  19. if __name__ == '__main__':
  20. file_path = 'example.xls' # 请确保文件路径和文件名正确
  21. result = find_cells_with_text(file_path)
  22. if result:
  23. print("引用文本的单元格位置如下:")
  24. for loc in result:
  25. print(f"Sheet: {loc[0]}, 行: {loc[1] + 1}, 列: {loc[2] + 1}, 文本: {loc[3]}")
  26. else:
  27. print("没有找到引用文本的单元格!")
3-93、引用输入了逻辑值的所有单元格
  1. # 93、引用输入了逻辑值的所有单元格
  2. import xlrd
  3. def find_cells_with_boolean(file_path):
  4. # 打开Excel文件
  5. workbook = xlrd.open_workbook(file_path)
  6. result = []
  7. # 遍历所有sheet
  8. for sheet_index in range(workbook.nsheets):
  9. sheet = workbook.sheet_by_index(sheet_index)
  10. # 遍历所有行和列
  11. for row_index in range(sheet.nrows):
  12. for col_index in range(sheet.ncols):
  13. cell_value = sheet.cell_value(row_index, col_index)
  14. cell_type = sheet.cell_type(row_index, col_index)
  15. # 检查单元格是否包含布尔值
  16. if cell_type == xlrd.XL_CELL_BOOLEAN:
  17. cell_location = (sheet.name, row_index, col_index, cell_value)
  18. result.append(cell_location)
  19. return result
  20. if __name__ == '__main__':
  21. file_path = 'example.xls' # 请确保文件路径和文件名正确
  22. result = find_cells_with_boolean(file_path)
  23. if result:
  24. print("引用逻辑值的单元格位置如下:")
  25. for loc in result:
  26. print(f"Sheet: {loc[0]}, 行: {loc[1] + 1}, 列: {loc[2] + 1}, 逻辑值: {loc[3]}")
  27. else:
  28. print("没有找到引用逻辑值的单元格!")
3-94、引用输入了批注的所有单元格
  1. # 94、引用输入了批注的所有单元格
  2. import xlrd
  3. def find_cells_with_comments(file_path):
  4. # 打开Excel文件
  5. workbook = xlrd.open_workbook(file_path, formatting_info=True)
  6. result = []
  7. # 遍历所有sheet
  8. for sheet_index in range(workbook.nsheets):
  9. sheet = workbook.sheet_by_index(sheet_index)
  10. # 获取sheet的批注
  11. comments = sheet.cell_note_map
  12. # 遍历批注并获取相应的单元格
  13. for (row_index, col_index), note in comments.items():
  14. cell_location = (sheet.name, row_index, col_index, note.text)
  15. result.append(cell_location)
  16. return result
  17. if __name__ == '__main__':
  18. file_path = 'example.xls' # 请确保文件路径和文件名正确
  19. result = find_cells_with_comments(file_path)
  20. if result:
  21. print("引用批注的单元格位置如下:")
  22. for loc in result:
  23. print(f"Sheet: {loc[0]}, 行: {loc[1] + 1}, 列: {loc[2] + 1}, 批注: {loc[3]}")
  24. else:
  25. print("没有找到引用批注的单元格!")
3-95、引用没有输入任何数据和公式的空单元格
  1. # 95、引用没有输入任何数据和公式的空单元格
  2. import xlrd
  3. def find_empty_cells(file_path):
  4. # 打开Excel文件
  5. workbook = xlrd.open_workbook(file_path, formatting_info=True)
  6. result = []
  7. # 遍历所有sheet
  8. for sheet_index in range(workbook.nsheets):
  9. sheet = workbook.sheet_by_index(sheet_index)
  10. # 遍历sheet中的所有单元格
  11. for row_index in range(sheet.nrows):
  12. for col_index in range(sheet.ncols):
  13. cell = sheet.cell(row_index, col_index)
  14. if cell.ctype == xlrd.XL_CELL_EMPTY:
  15. cell_location = (sheet.name, row_index, col_index)
  16. result.append(cell_location)
  17. return result
  18. if __name__ == '__main__':
  19. file_path = 'example.xls' # 请确保文件路径和文件名正确
  20. result = find_empty_cells(file_path)
  21. if result:
  22. print("空单元格位置如下:")
  23. for loc in result:
  24. print(f"Sheet: {loc[0]}, 行: {loc[1] + 1}, 列: {loc[2] + 1}")
  25. else:
  26. print("没有找到空单元格!")
3-96、引用所有可见单元格
  1. # 96、引用所有可见单元格
  2. import xlrd
  3. def get_visible_cells(file_path):
  4. # 打开Excel文件
  5. workbook = xlrd.open_workbook(file_path, formatting_info=True)
  6. result = []
  7. # 遍历所有sheet
  8. for sheet_index in range(workbook.nsheets):
  9. sheet = workbook.sheet_by_index(sheet_index)
  10. # 遍历sheet中的所有单元格
  11. for row_index in range(sheet.nrows):
  12. for col_index in range(sheet.ncols):
  13. cell = sheet.cell(row_index, col_index)
  14. if cell.ctype != xlrd.XL_CELL_EMPTY:
  15. cell_location = (sheet.name, row_index, col_index, cell.value)
  16. result.append(cell_location)
  17. return result
  18. if __name__ == '__main__':
  19. file_path = 'example.xls' # 请确保文件路径和文件名正确
  20. result = get_visible_cells(file_path)
  21. if result:
  22. print("可见单元格位置及内容如下:")
  23. for loc in result:
  24. print(f"Sheet: {loc[0]}, 行: {loc[1] + 1}, 列: {loc[2] + 1}, 内容: {loc[3]}")
  25. else:
  26. print("没有找到可见单元格!")

五、推荐阅读

1、Python筑基之旅
2、Python函数之旅
3、Python算法之旅
4、Python魔法之旅
5、博客个人主页
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/天景科技苑/article/detail/739963
推荐阅读
相关标签
  

闽ICP备14008679号