是我,是你
环境:
python3.8.12
PyCharm
安装包:
pip install openpyxl==3.1.2
继上篇
python对Word文档内容的增、删、改、查操作,独立封装版
九月de云,公众号:九月de云python对Word文档内容的增、删、改、查操作,独立封装版
记录分享之后,Excel的操作也随之产生。
继续往下看……
01 创建空的工作簿
创建一个空的工作簿def create_excel(self):
# 创建一个新的工作簿
wb = Workbook()
# 保存工作簿
wb.save(self.excel_file)
return wb
02 单数据写入
根据指定的单元格,单数据写入def write_one(self, sheet_name, cells, value):
# 打开Excel
wb = self.open_excel
# 指定Sheet
ws = self.sheet(wb, sheet_name)
# 写入
ws[cells] = value
# 保存
self.save_excel(wb)
return f"成功在[{sheet_name}]工作表,{cells}单元格插入1条数据"
03 多数据写入
根据指定的单元格,多数据写入def write_many(self, sheet_name, data: dict):
wb = self.open_excel
ws = self.sheet(wb, sheet_name)
for k, v in data.items():
ws[k] = v
self.save_excel(wb)
count = data.__len__()
return f"成功在[{sheet_name}]工作表插入{count}条数据"
注意:参数data,必须是字典格式,如:{'B1': '星期二', 'C1': '星期三', 'D1': '星期四'}
04 数据批量写入
多数据批量写入工作表中,此方式不需要指定单元格,默认从A1开始写入def write_batch(self, sheet_name, data: list):
wb = self.open_excel
ws = self.sheet(wb, sheet_name)
for row in data:
for i in range(len(row)):
ws.cell(row=data.index(row) + 1, column=i + 1, value=row[i])
self.save_excel(wb)
count = len(data)
return f"成功在[{sheet_name}]工作表插入{count}条数据"
注意:参数data,必须是列表格式,如:[["日期", "最高温度", "最低温度"],["2023-5-8", 28, 17],["2023-5-9", 32, 19],["2023-5-10", 35, 22],["2023-5-11", 28, 16],["2023-5-12", 25, 13],["2023-5-13", 22, 7],["2023-5-14", 29, 17],["2023-5-15", 35, 21]]
05 删除单数据
删除指定单元格的数据,单数据删除def delete_one(self, sheet_name, cells):
wb = self.open_excel
ws = wb[sheet_name]
del ws[cells]
self.save_excel(wb)
return f"成功在[{sheet_name}]工作表,删除{cells}单元格的数据"
06 删除多数据
删除指定单元格的数据,多数据删除def delete_many(self, sheet_name, cells: list):
wb = self.open_excel
ws = wb[sheet_name]
for cell in cells:
del ws[cell]
count = len(cells)
self.save_excel(wb)
return f"成功在[{sheet_name}]工作表删除{count}条数据"
注意:参数cells,必须是列表格式,如:['B1', 'C1', 'D1']
07 删除指定工作表
删除指定工作表def delete_sheet(self, sheet_name):
wb = self.open_excel
ws = wb[sheet_name]
wb.remove(ws)
self.save_excel(wb)
return f"成功删除工作表[{sheet_name}]"
08 读取单元格的内容
读取工作表中,指定单元格的内容def read_one(self, sheet_name, cells):
wb = self.open_excel
ws = wb[sheet_name]
value = ws[cells].value
return value
09 读取多个单元格的内容
读取工作表中,指定多个单元格的内容def read_many(self, sheet_name, cells: list):
wb = self.open_excel
ws = wb[sheet_name]
values = []
for cell in cells:
value = ws[cell].value
values.append(value)
return values
注意:参数cells,必须是列表格式,如:['B1', 'C1', 'D1']
10 读取工作表所有内容
读取指定工作表的所有内容def read_all(self, sheet_name):
wb = self.open_excel
ws = wb[sheet_name]
all_values = []
for row in ws.iter_rows():
row_values = []
for cell in row:
row_values.append(cell.value)
all_values.append(row_values)
return all_values
注意:返回结果都存放在了一个list中,如果数据量非常大的情况下,谨慎读取全部内容
11 读取所有工作表名称
读取Excel文档中所有工作表的名称def read_sheets(self):
wb = self.open_excel
sheet_names = wb.sheetnames
return sheet_names
12 工作表中生成折线图
根据工作表中的数据,生成折线图def line_chart(self, sheet_name, position, title):
wb = self.open_excel
ws = self.sheet(wb, sheet_name)
# 创建一个折线图
chart = LineChart()
# 获取数据源范围
calculate_dimension_source = ws.calculate_dimension()
min_row, min_col, max_row, max_col = range_boundaries(calculate_dimension_source)
min_col += 1
range_data_ = "{}{}:{}{}".format(ws.cell(min_row, min_col).column_letter, min_row,
ws.cell(max_col, max_row).column_letter, max_col)
range_data = "{}!{}".format(ws.title, range_data_)
data_ = Reference(ws, range_string=range_data)
# 将数据源添加到折线图上
chart.add_data(data_, titles_from_data=True)
chart.title = title
# 设置 x 轴的数据源
min_row += 1
min_col -= 1
range_string1_ = "{}{}:{}{}".format(ws.cell(min_row, min_col).column_letter, min_row,
ws.cell(min_row, min_col).column_letter, max_col)
range_string1 = "{}!{}".format(ws.title, range_string1_)
x_axis_data = Reference(ws, range_string=range_string1)
chart.set_categories(x_axis_data)
# 将折线图插入到工作表中
ws.add_chart(chart, position)
self.save_excel(wb)
return f"成功在工作表[{sheet_name}]中生成折线图!"
注意:工作表中的数据是已经统计好,并且是可生成有效图的数据,一般情况下生成图的数据,都是最终呈现的结果。
结合以上write_batch方法写入的数据,生成折线图效果如下:
13 工作表中插入图片
在工作表中指定的单元格位置插入宽为400,高为200的图片def insert_image(self, sheet_name, position, image, width=400, height=200):
wb = self.open_excel
ws = self.sheet(wb, sheet_name)
# 创建Image对象
img = Image(image)
# 设置图片大小
img.width = width
img.height = height
# 将Image对象插入到工作表中指定位置的单元格中
ws.add_image(img, position)
self.save_excel(wb)
return f"成功在[{sheet_name}]工作表插入图片{image}"
注意:以防插入到工作表中,排版会乱,建议设置图片大小。
插入图片效果:
14 提取工作表中的图片
提取工作表中的图片,并保存到get_images文件夹中def get_images(self, sheet_name):
wb = self.open_excel
ws = wb[sheet_name]
images = ws._images
for index, img in enumerate(images):
data = img._data()
with open(f"get_images/image{str(index)}.png", "wb") as img:
img.write(data)
return f"成功提取出工作表[{sheet_name}]中的图片!"
提取图片保存到文件夹中:
End 总结
结构及内容:
--excel_tools.py:主体方法
--image1.jpg和image2.jpg:插入的图片
--document_test.xlsx:生成的Excel文档
--get_images:文件夹内是从Excel中提取的图片
以上实现中,发现没有修改,其实在用到openpyxl包过程中,修改就相当于重新写入。
本次生成统计图类型,只涉及到了折线图。
各个方法的调用方式在原码中,请根据实际情况使用!
有需求的朋友可自取哟
获取:后台回复“excel”即可
文章就分享到这儿,喜欢就点个赞吧!
Scan to Follow