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)