是我,是你
环境:
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