from openpyxl import load_workbook from openpyxl.utils import column_index_from_string from openpyxl.utils.cell import get_column_letter from openpyxl import load_workbook# 打开表格文件 wb = load_workbook('出厂检分析表.xlsx')# 选择工作表 ws = wb['汇总筛选表']# 获取需要排序的列:B列、Q列、F列 columns = ['B', 'Q', 'F']# 选择排序的方式:升序或降序 order = 'asc' # 升序 #order= 'desc' # 降序# 对列进行排序 for column in columns: # 获取列数据 column_index = column_index_from_string(column) data = [cell.value for cell in ws[column]] # 进行排序 if order == 'asc': sorted_data = sorted(data) elif order == 'desc': \ sorted_data = sorted(data, reverse=True) # 将排序结果写回表格 for i, value in enumerate(sorted_data): cell = ws['{}{}'.format(column, i+1)] cell.value = value# 新建分析1表格并保存 wb.create_sheet('分析1') wb.save('出厂检分析表.xlsx'),上述代码有啥不对
时间: 2023-06-06 21:06:32 浏览: 128
这段代码导入了openpyxl模块,并且从中导入load_workbook函数、column_index_from_string函数、get_column_letter函数。另外还导入了load_workbook函数。
相关问题
优化这段代码import openpyxlfrom openpyxl.utils import column_index_from_string, get_column_letter# 打开Excel文件wb = openpyxl.load_workbook('example.xlsx')# 选择特定的工作簿ws = wb['Sheet1']# 要处理的数据列col = 'B'# 结果写入的单元格result_cell = 'C1'# 初始化最大值、最小值和总和max_value = float('-inf')min_value = float('inf')total = 0count = 0# 循环遍历数据列中的所有单元格for cell in ws[col]: # 获取单元格的值 value = cell.value # 如果单元格的值是数字 if isinstance(value, (int, float)): # 更新最大值和最小值 if value > max_value: max_value = value if value < min_value: min_value = value # 累加总和和计数 total += value count += 1# 计算平均值if count > 0: avg_value = total / countelse: avg_value = None# 将结果写入到指定的单元格ws_result = wb['Sheet2']ws_result[result_cell] = avg_value# 保存Excel文件wb.save('example.xlsx')
这段代码已经很简洁了,但是我们还是可以做一些优化。以下是优化后的代码:
```python
import openpyxl
from openpyxl.utils import column_index_from_string, get_column_letter
# 打开Excel文件并选择特定的工作簿
wb = openpyxl.load_workbook('example.xlsx')['Sheet1']
# 要处理的数据列和结果写入的单元格
col = wb['B']
result_cell = openpyxl.load_workbook('example.xlsx')['Sheet2']['C1']
# 初始化最大值、最小值和总和
max_value, min_value, total, count = float('-inf'), float('inf'), 0, 0
# 循环遍历数据列中的所有单元格
for cell in col:
value = cell.value
if isinstance(value, (int, float)):
max_value = max(max_value, value)
min_value = min(min_value, value)
total += value
count += 1
# 计算平均值并将结果写入到指定的单元格
avg_value = total / count if count else None
result_cell.value = avg_value
# 保存Excel文件
wb.parent.save('example.xlsx')
```
优化后的代码主要做了以下几个方面的改进:
1.一次性打开Excel文件并选择特定的工作簿,避免了重复打开文件和选择工作簿的操作。
2.使用openpyxl的内置函数max和min来更新最大值和最小值,避免了手写的判断逻辑。
3.将初始化最大值、最小值、总和和计数的操作合并在一行代码中,使代码更简洁。
4.使用三目运算符来计算平均值,避免了使用if语句的重复代码。
5.将结果写入到指定的单元格时,直接使用单元格对象的value属性,避免了手写的赋值操作。
6.保存Excel文件时,使用wb.parent.save方法,避免了重复打开文件和保存文件的操作。
以上优化都是在保持代码可读性的前提下进行的,可以提高代码的执行效率和可维护性。
openpyxl行列转换
openpyxl库可以实现Excel的行列转换功能。在使用openpyxl库时,可以通过行列索引或字母来操作单元格。对于行列转换,可以使用以下方法:
1. 通过索引转换:可以使用`ws.cell(row=row_index, column=column_index)`来访问单元格。其中,row_index和column_index分别表示行和列的索引。将行和列的索引互换即可实现行列转换。
2. 通过字母转换:可以使用`get_column_letter(column_index)`函数将列索引转换为字母表示。而将字母转换为列索引可以使用`column_index_from_string(column_letter)`函数。
下面是一个示例代码,展示了如何使用openpyxl进行行列转换:
```python
import openpyxl
from openpyxl.utils import get_column_letter
# 打开Excel文件
wb = openpyxl.load_workbook('style_excelTest.xlsx')
ws = wb.active
# 通过索引转换行列
cell = ws.cell(row=1, column=2)
print(f"通过索引转换行列:{cell.value}")
# 通过字母转换行列
column_letter = get_column_letter(2)
cell = ws[column_letter + '1']
print(f"通过字母转换行列:{cell.value}")
```
在上面的示例中,我们通过索引和字母分别访问了第1行第2列的单元格,并输出了其值。这样就实现了行列的转换功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span>
#### 引用[.reference_title]
- *1* *2* *3* [【干货】建议收藏! ! !全网最全的Python.openpyxl操作Excel数据](https://blog.csdn.net/qq_46092061/article/details/118294147)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"]
[ .reference_list ]
阅读全文