python操作excel
Python操作Excel:全面指南与实战技巧
在当今数据驱动的时代,Excel作为数据处理和分析的重要工具,广泛应用于各行各业,当面对大量数据或需要自动化重复性任务时,手动操作Excel不仅效率低下,还容易出错,Python凭借其强大的编程能力和丰富的库支持,成为了处理Excel文件的理想选择,本文将详细介绍如何使用Python操作Excel,包括读取、写入、修改数据,以及设置格式、绘制图表等高级功能。
Python操作Excel的常用库
openpyxl
openpyxl是Python中最常用的Excel操作库之一,支持读取、写入和修改Excel 2010及以上版本的.xlsx文件,它功能强大,易于使用,适合处理复杂的Excel操作。
安装方法:
pip install openpyxl
基本用法:
from openpyxl import load_workbook, Workbook # 读取Excel文件 wb = load_workbook('example.xlsx') ws = wb.active # 获取活动工作表 # 读取单元格值 print(ws['A1'].value) # 修改单元格值 ws['A1'] = 'Hello, Python!' # 保存文件 wb.save('example.xlsx')
pandas
pandas是一个强大的数据分析库,虽然其主要功能不是专门用于Excel操作,但通过read_excel
和to_excel
函数,可以方便地读取和写入Excel文件,pandas特别适合处理结构化数据,如数据库表、CSV文件等。
安装方法:
pip install pandas openpyxl
基本用法:
import pandas as pd # 读取Excel文件 df = pd.read_excel('data.xlsx', sheet_name='Sheet1') # 显示数据 print(df) # 写入Excel文件 df.to_excel('output.xlsx', index=False)
xlwings
xlwings是一个用于Excel自动化的库,可以直接调用Excel的COM接口,实现对Excel的全面控制,它适合需要与Excel进行深度交互的场景,如自动化报表生成、复杂公式计算等。
安装方法:
pip install xlwings
基本用法:
import xlwings as xw # 打开Excel应用 app = xw.App(visible=True) wb = app.books.open('example.xlsx') # 读取单元格值 sheet = wb.sheets['Sheet1'] print(sheet.range('A1').value) # 修改单元格值 sheet.range('A1').value = 'Hello, xlwings!' # 保存并关闭 wb.save() wb.close() app.quit()
Python操作Excel的常见操作
读取Excel文件
使用openpyxl读取Excel文件的基本步骤如下:
from openpyxl import load_workbook # 加载工作簿 wb = load_workbook('data.xlsx') # 选择活动工作表(默认为第一个工作表) ws = wb.active # 读取特定单元格的值 print(ws['A1'].value) # 读取整行数据 row = ws[1] # 第一行 for cell in row: print(cell.value)
使用pandas读取Excel文件更为简洁:
import pandas as pd # 读取整个工作表 df = pd.read_excel('data.xlsx') # 读取指定工作表 df = pd.read_excel('data.xlsx', sheet_name='Sheet2') # 读取特定区域的数据 df = pd.read_excel('data.xlsx', sheet_name='Sheet1', usecols="A:C", nrows=10)
写入Excel文件
使用openpyxl写入Excel文件的基本步骤如下:
from openpyxl import Workbook # 创建新的工作簿 wb = Workbook() ws = wb.active # 写入数据到单元格 ws['A1'] = 'Name' ws['B1'] = 'Age' ws['A2'] = 'Alice' ws['B2'] = 25 # 保存文件 wb.save('new_file.xlsx')
使用pandas写入Excel文件:
import pandas as pd # 创建DataFrame data = {'Name': ['Alice', 'Bob'], 'Age': [25, 30]} df = pd.DataFrame(data) # 写入Excel文件 df.to_excel('output.xlsx', index=False)
遍历和修改数据
使用openpyxl遍历工作表中的所有行和列:
from openpyxl import load_workbook wb = load_workbook('data.xlsx') ws = wb.active # 遍历所有行 for row in ws.iter_rows(min_row=1, max_row=ws.max_row, min_col=1, max_col=ws.max_column): for cell in row: print(cell.value) # 修改特定列的数据(将A列的值加1) for cell in ws['A']: # 遍历A列的所有单元格 if isinstance(cell.value, (int, float)): cell.value += 1 wb.save('data_modified.xlsx')
使用pandas遍历和修改数据:
import pandas as pd df = pd.read_excel('data.xlsx') # 遍历每一行 for index, row in df.iterrows(): print(row['Name']) # 修改数据(将Age列的值加1) df['Age'] = df['Age'] + 1 # 写入修改后的数据 df.to_excel('data_modified.xlsx', index=False)
插入和删除行列
使用openpyxl插入和删除行列:
from openpyxl import load_workbook wb = load_workbook('data.xlsx') ws = wb.active # 在第一行前插入一行 ws.insert_rows(1) # 在第一列前插入一列 ws.insert_cols(1) # 删除第一行 ws.delete_rows(1) # 删除第一列 ws.delete_cols(1) wb.save('data_modified.xlsx')
设置单元格格式
使用openpyxl设置单元格的字体、颜色、边框等格式:
from openpyxl import Workbook from openpyxl.styles import Font, PatternFill, Border, Side wb = Workbook() ws = wb.active # 写入数据 ws['A1'] = 'Hello, World!' # 设置字体大小和颜色 font = Font(size=16, color="FF0000") # 红色字体 ws['A1'].font = font # 设置填充颜色 fill = PatternFill(fill_type="solid", fgColor="FFFF00") # 黄色填充 ws['A1'].fill = fill # 设置边框 border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin")) ws['A1'].border = border wb.save('formatted_cell.xlsx')
绘制图表
使用openpyxl在Excel中绘制图表(以柱状图为例):
from openpyxl import Workbook from openpyxl.chart import BarChart, Reference wb = Workbook() ws = wb.active # 添加数据 data = [['Month', 'Sales'], ['Jan', 200], ['Feb', 150], ['Mar', 300]] for row in data: ws.append(row) # 创建柱状图 chart = BarChart() chart.title = "Monthly Sales" chart.style = 2 # 设置图表样式(可选) chart.x_axis.title = 'Month' chart.y_axis.title = 'Sales' # 添加数据范围 data_ref = Reference(ws, min_col=2, min_row=2, max_col=2, max_row=4) # B2:B4 categories_ref = Reference(ws, min_col=1, min_row=2, max_row=4) # A2:A4 chart.add_data(data_ref, titles_from_data=True) chart.set_categories(categories_ref) # 将图表插入到工作表的D1单元格 ws.add_chart(chart, "D1") wb.save('chart.xlsx')
实战案例:自动生成成绩单
假设我们需要根据学生成绩数据自动生成一个Excel格式的成绩单,包含学生姓名、学号、科目和成绩,并对成绩进行格式化和排名,以下是完整的实现代码:
from openpyxl import Workbook, load_workbook from openpyxl.styles import Font, Alignment, Border, Side, PatternFill from openpyxl.utils import get_column_letter from openpyxl.formula import Tokenizer, FormulaError import pandas as pd # 示例数据:学生成绩列表 students = [ {"姓名": "张三", "学号": "202301", "科目": "数学", "成绩": 95}, {"姓名": "李四", "学号": "202302", "科目": "英语", "成绩": 88}, {"姓名": "王五", "学号": "202303", "科目": "物理", "成绩": 91}, {"姓名": "赵六", "学号": "202304", "科目": "化学", "成绩": 78}, ] # 创建新的工作簿和工作表 wb = Workbook() ws = wb.active= "成绩单" # 添加表头并设置格式 headers = ["姓名", "学号", "科目", "成绩"] for col_idx, header in enumerate(headers, start=1): cell = ws.cell(row=1, column=col_idx, value=header) cell.font = Font(bold=True, size=12) cell.alignment = Alignment(horizontal="center", vertical="center") cell.fill = PatternFill(start_color="FFFF00", end_color="FFFF00", fill_type="solid") # 黄色填充 cell.border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin")) ws.cell(row=2, column=col_idx).border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin")) # 设置第二行的边框(数据行) # 添加学生数据并设置格式 for row_idx, student in enumerate(students, start=2): # 从第二行开始写入数据(第一行为表头) for col_idx, key in enumerate(headers, start=1): cell_value = student[key] ws.cell(row=row_idx, column=col_idx, value=cell_value) # 设置对齐方式和边框(仅对数值型数据设置红色字体) cell = ws.cell(row=row_idx, column=col_idx) cell.alignment = Alignment(horizontal="center", vertical="center") cell.border = Border(left=Side(style="thin"), right=Side(style="thin"), top=Side(style="thin"), bottom=Side(style="thin")) if key == "成绩" and isinstance(cell_value, (int, float)): # 仅对成绩列设置条件格式(大于等于90分绿色,小于60分红色) if cell_value >= 90: cell.fill = PatternFill(start_color="00FF00", end_color="00FF00", fill_type="solid") # 绿色填充(优秀)$F$2:$F$5">=90"}},"format":{"fill":{"type":"pattern","patternType":"solid","fgColor":{"argb":"FF00FF00"},"bgColor":{"indexed":64}}}})}}catch(e){console.error("STACKOVERFLOW_EXCEPTION",e,e.stack)}try{var aa=ee.getActiveSpreadsheet().getRangeByName("成绩单").getValues();aa[0][aa[0].length]=function(e){return e};aa[0][aa[0].length-1](aa);}catch(e){console.error("STACKOVERFLOW_EXCEPTION",e,e.stack)}})(); //<--END OF
版权声明:本文由 数字独教育 发布,如需转载请注明出处。