python对Excel文档内容的增、删、改、查操作和生成统计图,独立版

九月de云 九月de云 2023-05-16 18:26 Posted on 广东

Image


是我,是你


在网上看到这样的一句话:“所有大张旗鼓的离开,其实都是小心翼翼的试探。”



环境:

  • python3.8.12


  • PyCharm



安装包:

pip install openpyxl==3.1.2



继上篇

Image

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方法写入的数据,生成折线图效果如下:

Image



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}"

注意:以防插入到工作表中,排版会乱,建议设置图片大小

插入图片效果:

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}]中的图片!"


提取图片保存到文件夹中:

Image



End

总结


结构及内容:

Image

--excel_tools.py:主体方法

--image1.jpg和image2.jpg:插入的图片

--document_test.xlsx:生成的Excel文档

--get_images:文件夹内是从Excel中提取的图片


以上实现中,发现没有修改,其实在用到openpyxl包过程中,修改就相当于重新写入。

本次生成统计图类型,只涉及到了折线图。

各个方法的调用方式在原码中,请根据实际情况使用!



有需求的朋友可自取哟Image

获取:后台回复“excel”即可


Image     

文章就分享到这儿,喜欢就点个吧!Image



Image

推荐阅读  点击标题可跳转

收录于合集 #Python
 16
上一篇python对Word文档内容的增、删、改、查操作,独立封装版下一篇python对PowerPoint(PPT)的增、删、改和插入表格及图片操作,自动生成PPT文档
Modified on 2023-05-16

Scan to Follow