根据上述需要重构这个工具类
时间: 2023-08-17 21:04:08 浏览: 49
好的,针对同时包含 XLSX 格式和 XLS 格式的 Excel 文件进行处理,可以考虑重构一个工具类,具体如下:
```python
import os
import xlrd
import xlwt
from openpyxl import load_workbook
class ExcelUtil:
@staticmethod
def read_excel(file_path):
_, ext = os.path.splitext(file_path)
if ext == '.xlsx':
return ExcelUtil._read_xlsx(file_path)
elif ext == '.xls':
return ExcelUtil._read_xls(file_path)
else:
raise ValueError('Unsupported file format')
@staticmethod
def write_excel(data, file_path):
_, ext = os.path.splitext(file_path)
if ext == '.xlsx':
ExcelUtil._write_xlsx(data, file_path)
elif ext == '.xls':
ExcelUtil._write_xls(data, file_path)
else:
raise ValueError('Unsupported file format')
@staticmethod
def _read_xlsx(file_path):
workbook = load_workbook(file_path)
sheet = workbook.active
headers = []
rows = []
for row in sheet.iter_rows(min_row=1, max_row=1):
headers = [cell.value for cell in row]
for row in sheet.iter_rows(min_row=2):
rows.append([cell.value for cell in row])
return headers, rows
@staticmethod
def _read_xls(file_path):
workbook = xlrd.open_workbook(file_path)
sheet = workbook.sheet_by_index(0)
headers = sheet.row_values(0)
rows = [sheet.row_values(i) for i in range(1, sheet.nrows)]
return headers, rows
@staticmethod
def _write_xlsx(data, file_path):
workbook = Workbook()
sheet = workbook.active
sheet.append(data[0])
for row in data[1]:
sheet.append(row)
workbook.save(file_path)
@staticmethod
def _write_xls(data, file_path):
workbook = xlwt.Workbook()
sheet = workbook.add_sheet('Sheet1')
row_num = 0
for row in data:
for col_num, col in enumerate(row):
sheet.write(row_num, col_num, col)
row_num += 1
workbook.save(file_path)
```
这个工具类包含两个静态方法 `read_excel` 和 `write_excel`,分别用于读取 Excel 文件和写入 Excel 文件。在读取文件时,根据文件后缀名的不同,分别调用 `_read_xlsx` 和 `_read_xls` 方法来处理 XLSX 格式和 XLS 格式的文件。在写入文件时,也根据文件后缀名的不同,分别调用 `_write_xlsx` 和 `_write_xls` 方法来处理。
其中,`_read_xlsx` 方法使用 `openpyxl` 库来读取 XLSX 格式的文件,`_read_xls` 方法使用 `xlrd` 库来读取 XLS 格式的文件。`_write_xlsx` 方法使用 `openpyxl` 库来写入 XLSX 格式的文件,`_write_xls` 方法使用 `xlwt` 库来写入 XLS 格式的文件。
在这个工具类中,我们还使用了 `os` 模块来获取文件后缀名,以便根据不同的文件格式来选择合适的读写方法。同时,在读取文件时,我们也将文件中的表头和数据分别保存在了 `headers` 和 `rows` 中,并在方法的返回值中将它们一起返回,方便后续的处理。