openpyxl库操作excel表格

在这里插入图片描述

1.打开excel表格

import openpyxl                                      # 导入模块

wb = openpyxl.load_workbook('ce.xlsx')                             # 打开对应ce.xlsx文档
wb = openpyxl.load_workbook('ce.xlsx', data_only=True)             # data_only=True可以读取excel公式的值

sheet = wb['Sheet1']            # 指定名称
sheet = wb.worksheets[0]        # 读取第一张表单


A=sheet["B7"].value              # 读取单元格值
sheet['A1'] = 'Hello world!'     # 写入单元格值

wb.save('ce.xlsx')             # 对需要保存写入内容的workbook
wb.close()                    # 对程序中只读的workbook

2.新建excel表

from openpyxl import Workbook

wb = Workbook()
TT = wb.active
TT.title = 'Sheet1'
# TT2 = wb.create_sheet("Sheet2", 1)   # 位置顺序,0代表最前,1,2,3代表位置

TT['A1'] = '111'
# TT2['A1'] = '222'

wb.save('张志萍-线下客户-冯博文-X.X云途.xlsx')  # 将新建的表格,命名后保存

读取表单

1.读取制定表单

sheet = wb['Sheet1']            # 指定表单名称

2.(推荐)以按顺序读取表单

sheet = wb.worksheets[0]        # 读取第一张表单
sheet = wb.worksheets[1]        # 读取第二张表单

3.获得excel下所有的表单

all_sheet = wb.sheetnames
print(all_sheet)

>> ['Sheet12', '士大夫']

判断表单最大行数,结束位置:

sheet.max_row将为您提供工作表中最大的行数.sheet.max_column最大列数
从openpyxl 2.4版本开始,您还可以访问各个行和列,并使用它们的长度来回答问题.
len(ws[‘A’])

aa = sheet.max_row
print(aa)
>> 23
bb = sheet.max_column
print(bb)
>> 40
print(len(sheet['A']))
>> 23

推荐多方法断点最大长度和10次空值

jx_10 = 0
jz_10 = 0
ji = 4
while True:
    num = sheet["A{}".format(ji)].value
    sku = sheet["D{}".format(ji)].value
    print(f"{one_file}:{sku}:{num}")

    hebing = (one_file, sku, num)
    self.max_list.append(hebing)

    # 判断1:出现10次无内容空格,将打断读取
    if num == None and sku == None:
        jx_10 += 1
        if jx_10 == 10:
            break

    # 判断2:出现10次_-,将打断读取
    if sku == "_-":
        jz_10 += 1
        if jz_10 == 10:
            break

    # 判断3:openpyxl给出的最大行数
    if ji == max_ji:
        print('---打断该循环:{}'.format(ji))
        break

    ji += 1

读取excel表格图片和把图片保存到excel表中

读取excel表格图片保存到本地

存在的问题1:图片【左上角】必须在单元格里,不要压到边框,右下角超出边框不受影响。(技巧将左上角移入框内即可),若出现:多张图左上角都在一个相同单元格内,则只读取最上层的一张图片

存在的问题2

由于原始数据中存在照片未采集的记录,但是提取到的数据中这些记录都有对应的照片,原来image_loader = SheetImageLoader(ws)每次读完不会清空字典,所以就会把上一个文件中对应行的照片读取到当前文件的这一行,经过搜索查找发现是openpyxl-image-loader的问题,相关issues地址:images should not be static variable of SheetImageLoader 。所以在每次循环结束将image_loader 清空即可,添加这行代码:

image_loader._images.clear() # 循环读取多个excel记得加清空字典

from openpyxl import load_workbook
from openpyxl_image_loader import SheetImageLoader

path = r'D:\python_code\订单分拣系统'   # Excel文件路径
saveDir = "D:\python_code\订单分拣系统\\tu"  # 图片存储路径

wb = load_workbook(path + '\蒋春-线下-3.11 - 副本.xlsx')  # Excel文件名

ws = wb.worksheets[0]                                # 读取第一张表单

image_loader = SheetImageLoader(ws)
num = ws.max_row                                        # 总行数,我也不知道为什么是row
print(num)


for i in range(4, num+1):   # 从第2行开始,总行数要+1
    try:

        image = image_loader.get('B'+str(i))     # C列的图片
        image.show()
        # ws['Z{}'.format(i)] = image
        # ws.add_image(image, 'Z{}'.format(i))
        image.save(saveDir + str(i) + ".jpg")    # 以Ai为名,存图片Ci
    # 排除没有图片,或图片超出单元格的情况
    except ValueError:
        print("caonm这一行没有图片:", i)


wb.save(path + '\蒋春-线下-3.11 - 副本.xlsx')                         # 将新建的表格,命名后保存

'''
测试
image=image_loader.get('C2')  # 提取C2中的图片
image.show()
'''

把图保存到excel表中

from openpyxl import Workbook, load_workbook
from openpyxl.drawing.image import Image

# wb = Workbook()
wb = load_workbook('蒋春-线下-3.11 - 副本.xlsx')  # Excel文件名
sheet = wb.active

# 设置文字图片单元格的行高列宽
column_width = 12.25
row_height = 80.10

sheet.column_dimensions['Z'].width = column_width  # 修改列D的列宽
sheet.row_dimensions[6].height = row_height  # 修改行3的行高

img = Image('tu7.jpg')
newsize = (90, 90)
img.width, img.height = newsize  # 这两个属性分别是对应添加图片的宽高

sheet.add_image(img, 'Z4')

wb.save('蒋春-线下-3.11 - 副本.xlsx')                         # 将新建的表格,命名后保存

常规技巧写法:

1.以数值选择表单
sheet = wb.worksheets[0]  # 读取第一张表单

2.多处打断点,执行完成运行
max_ji = sheet.max_row  # 最大行数

jx_10 = 0
jz_10 = 0
ji = 4
while True:
    num = sheet["A{}".format(ji)].value
    sku = sheet["D{}".format(ji)].value

    # 判断1:出现10次无内容空格,将打断读取
    if num == None and sku == None:
        jx_10 += 1
        if jx_10 == 10:
            break

    # 判断2:出现10次_-,将打断读取
    if sku == "_-":
        jz_10 += 1
        if jz_10 == 10:
            break

    # 判断3:openpyxl给出的最大行数
    if ji == max_ji:
        print('---打断该循环:{}'.format(ji))
        break
    ji += 1

解决无法读取xls

import win32com.client as win32

fname = "D:\python_code\订单分拣系统\合并ts\龙-3.10刘-散单.xls"
# fname = "合并ts\龙-3.10刘-散单.xls"
excel = win32.gencache.EnsureDispatch('Excel.Application')
wb = excel.Workbooks.Open(fname)


wb.SaveAs(fname+"x", FileFormat=51)                  # FileFormat = 51 is for .xlsx extension
wb.Close()                                           # FileFormat = 56 is for .xls extension
excel.Application.Quit()                             # 后缀名的大小写不通配,需按实际修改:xls,或XLS

openpyxl生成的带有公式的表格,再次读取公式为None解决方案:

在生成的代码下写解决代码,在源头解决该问题

from win32com.client import Dispatch

def just_open(filename):
  xlApp = Dispatch("Excel.Application")
  xlApp.Visible = False
  xlBook = xlApp.Workbooks.Open(filename)
  xlBook.Save()
  xlBook.Close()


'--- filename路径要求绝对路径,不然会报错 ---'
filename = "D:\python_code\裁片图归类\Test\张志萍-线下客户-冯博文-4.14云途.xlsx"
just_open(filename)
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值