目的:相同格式的excel表,需要合并数据,手动输入太费事费力
缺点:读取大批量数据运行较慢(>10 min),写入多个表格更新行列较麻烦
import openpyxl
from win32com.client import Dispatch #添加此防止读出none值
路径="请输入路径\\表名.xlsx" #合并进的表
wb=openpyxl.load_workbook(路径) #打开表
ws=wb['Sheet1'] #打开sheet
路径1="请输入路径\\表名1.xlsm" #需要合并的表
路径2="请输入路径\\表名2.xlsm" #需要合并的表
def just_open(filename): #添加此防止读出none值
xlApp = Dispatch("Excel.Application")
xlApp.Visible = False
xlBook = xlApp.Workbooks.Open(filename)
xlBook.Save()
xlBook.Close()
just_open(路径1) #添加此防止读出none值
表= openpyxl.load_workbook(路径1, data_only=True) #读取数值,不读公式
sheet= 表['Sheet1'] #打开需要合并数据的那个Sheet
for i in range (447,455): #所取数值的行数
x= sheet.cell(i, 5).value # 5 代表需要数值所在的列,获取数值
ws.cell(row=i-446, column=3).value = x #在新表1-5行,3列写入数值
print('finish-1') #打印确保运行完成,可删去
just_open(路径2) #添加此防止读出none值
表= openpyxl.load_workbook(路径2, data_only=True)
sheet= 表['Sheet1'] #打开需要合并数据的那个Sheet
for i in range (447,455): #所取数值的行数
x= sheet.cell(i, 5).value # 5 代表需要数值所在的列,获取数值
ws.cell(row=i-446, column=4).value = x #在新表1-5行,4列写入数值
print('finish-2') #打印确保运行完成,可删去
wb.save('请输入路径\\表名2.xlsx') #给一个新的表名,并保存
后续通过 xlrd 和 xlwt 读取和写入数据,运行速度(<1?min):
import os
import xlwt
import xlrd
import xlrd3
import xlutils.copy
路径= xlrd.open_workbook("文件路径\\表名.xls", formatting_info = True) # 打开想保存的文件
wt = xlutils.copy.copy(路径) # 复制
sheet = wt.get_sheet(0) # 读取第一个工作表
j=0
k=0
list=[
'文件路径\\表名1.xlsm',
"文件路径\\表名2.xlsm",
] #采用list循环,但文件多时输入路径略繁琐,求指导简单方法
for A in list:
j=j+1
k=k+1
sheet1 = xlrd3.open_workbook(A).sheet_by_name('Sheet1')
for i in range(452, 455):
x = sheet1.cell(i, 26).value #读取数据
sheet.write(i-452, j, x) #写入第1-2行,第1列数据
sheet1 = xlrd3.open_workbook(A).sheet_by_name('Sheet2')
for i in range(452, 455):
x = sheet1.cell(i, 26).value
sheet.write(i-450, j, x) #写入第3-4行,第1列数据
sheet1 = xlrd3.open_workbook(A).sheet_by_name('Sheet3')
for i in range(452, 455):
x = sheet1.cell(i, 26).value
sheet.write(i-448, j, x) #写入第5-6行,第1列数据
wt.save("文件路径\\表名2.xls")
疑问:
1. 应该有更简便遍历文件名的方法代替?list=[''文件路径\\表名1.xlsm',"文件路径\\表名2.xlsm",]
2.?sheet.write(i-452, j, x) #写入固定行列的 i-452 ,不知道应该用什么参数给代替,方便编写
萌新入门,看各位大佬的帖子写出来的,请多指点!
|