Python处理Excel(7):处理清产核资表格(2)合并单元格等
openpyxl能保持Excel表原有的格式。
一、清空单元格
#coding=utf-8
#合并单元格,此文档尝试了用增加行
import xlrd, xlwt, xlwings, pyautogui, time, pyperclip, easygui, os, tkinter, io,pandas,shutil,re, os
from tkinter import filedialog,ttk
from openpyxl import load_workbook
from openpyxl.styles import Border, Side, colors
#import autopy as at
import openpyxl
#file= tkinter.filedialog.askopenfile()#选择打开什么文件,返回IO流对象
#file= tkinter.filedialog.askopenfilename()#选择打开什么文件,返回文件名
#print(file)
from io import StringIO
import sys
from contextlib import contextmanager
import sys
curn_path = os.getcwd() #current path当前路径
temp_tabl_path = os.path.join(curn_path, 'Template Table')
outp_tabl_path = os.path.join(curn_path, 'Output Table')
data_sour_path = os.path.join(curn_path, 'Data Source')
# ['封面', '货币资金清查登记表', '短期投资清查登记表', '应收款项清查登记表', '库存物资清查登记表', '牲畜 (禽) 资产清查登记表', '林木资产清查登记表', '长期投资清查登记表',
# '固定资产清查登记表-1', ' 固定资产清查登记表-2', '在建工程清查登记表-1', '在建工程清查登记表-2', '无形资产清查登记表', '租赁发包合同', '短期借款清查登记表', '应付款项清查登记表',
# '长期借款及应付款清查登记表', '应付工资清查登记表', '应付福利费清查登记表', '一事一议资金清查登记表', '专项应付款清查登记表', '所有者权益清查登记表', '待界定资产清查登记表(账外)',
# '资源性资产清查登记明细表-1', '资源性资产清查登记明细表-2', '资源性资产清查登记明细表-3', '资产负债表(合并报表)', '资源性资产清查登记总表', '收益分配统计表', '合同总表']
list_shet_name =['货币资金清查登记表', '应收款项清查登记表', ' 固定资产清查登记表-2','应付款项清查登记表','应付工资清查登记表','专项应付款清查登记表']
#indx_list_shet_name=0
shet_name =list_shet_name[0]
def get_file_list(raw_folder_path):
# 打开文件
dirs = os.listdir(raw_folder_path)
raw_file_list=[]
raw_file_path_list=[]
for home, dirs, files in os.walk(raw_folder_path):
for file_name in files:
raw_file_list.append((file_name))
raw_file_path_list.append(os.path.join(home, file_name))
#print('raw_file_list')
#print(raw_file_list)
return raw_file_list,raw_file_path_list
def modf_excl(targ_file_path, shet_name): #modify Excel
#Unmerges cells Excel 01.py:50: DeprecationWarning: Call to deprecated function get_sheet_by_name
# python的openpyxl连接Excel:舍弃get_sheet_names()
# 与get_shetet_by_name(),现在已经替换成了相应的其他两个方法。
# - wb.get_sheet_names()(舍弃) —— > wb.sheetnames(现在用的)
# - wb.get_sheet_by_names(‘sheet1’)(舍弃) —— > wb[ ‘sheet1’](现在用的)
print(targ_file_path)
wb = load_workbook(targ_file_path)
# # ws = wb[' 固定资产清查登记表-2']
# #ws = wb['封面']
# #ws = wb[' 固定资产清查登记表-2']
# ws = wb['应收款项清查登记表']
# ws = wb['资源性资产清查登记明细表-1']
ws = wb[shet_name]
#ws = wb.get_sheet_by_name('封面')
# ws.merge_cells('A1:B1')
# ws.unmerge_cells('A1:B1')
# 以下函数可以达到相同效果
#ws = wb._sheets[0]
# 获取行列数
# print(wb.sheetnames)
# ['封面', '货币资金清查登记表', '短期投资清查登记表', '应收款项清查登记表', '库存物资清查登记表', '牲畜 (禽) 资产清查登记表', '林木资产清查登记表', '长期投资清查登记表',
# '固定资产清查登记表-1', ' 固定资产清查登记表-2', '在建工程清查登记表-1', '在建工程清查登记表-2', '无形资产清查登记表', '租赁发包合同', '短期借款清查登记表', '应付款项清查登记表',
# '长期借款及应付款清查登记表', '应付工资清查登记表', '应付福利费清查登记表', '一事一议资金清查登记表', '专项应付款清查登记表', '所有者权益清查登记表', '待界定资产清查登记表(账外)',
# '资源性资产清查登记明细表-1', '资源性资产清查登记明细表-2', '资源性资产清查登记明细表-3', '资产负债表(合并报表)', '资源性资产清查登记总表', '收益分配统计表', '合同总表']
row = ws.max_row
colm = ws.max_column
#print(row)
#print(colm)
# # 单元格赋值
#ws.cell(row=9, column=1, value='金额')
# xl_cell = xl_sheet.cell(row=i, column=j, value=“金额”)
#ws.unmerge_cells(start_row=row-1, start_column=1, end_row=row-1, end_column=3) #wb[' 固定资产清查登记表-2']
#ws.unmerge_cells(start_row=row-1, start_column=1, end_row=row-1, end_column=2) #'应收款项清查登记表'
#ws.unmerge_cells(start_row=row - 1, start_column=1, end_row=row - 1, end_column=2) # '资源性资产清查登记明细表-1'
if shet_name=='货币资金清查登记表':
print('修改{}'.format(shet_name))
ws.cell(row=6, column=4).value = 0.00
ws.cell(row=6, column=8).value = 0.00
ws.cell(row=10, column=4).value = 0.00
ws.cell(row=10, column=8).value = 0.00
for r in range(10, row+1):
if ws.cell(row=r, column=1).value == '相关事项说明:':
print(1)
print('相关事项说明在第{}行.'.format(r))
row2=r
#print(r)
# print(row2)
# print('row2')
# print(row2)
if shet_name=='应收款项清查登记表':
print('修改{}'.format(shet_name))
#第9行到倒数第三行
for r in range(9,row2-1):
ws.cell(row=r, column=2).value =''
for colm2 in [6, 9, 11]:
ws.cell(row=r, column=colm2).value = 0.00
if shet_name==' 固定资产清查登记表-2':
print('修改{}'.format(shet_name))
for r in range(12,row2-1):
for colm2 in [2, 3, 11]:
ws.cell(row=r, column=colm2).value =''
for colm2 in [10, 11,12,13,14,16,18,19,20,21,22, 23,26,27 ]:
ws.cell(row=r, column=colm2).value = 0.00
if shet_name=='应付款项清查登记表':#表格有问题,有一千多列
print('修改{}'.format(shet_name))
for r in range(9,row2-1):
for colm2 in [2, 3, 4,5,6]:
ws.cell(row=r, column=colm2).value =''
for colm2 in [9,11,14,16 ]:
ws.cell(row=r, column=colm2).value = 0.00
if shet_name == '应付工资清查登记表':#表格有问题,有一千多列
print('修改{}'.format(shet_name))
for r in range(9, row2-1):
#for r in range(9, 24):
for colm2 in [2, 3]:
ws.cell(row=r, column=colm2).value = ''
for colm2 in [5,6,7,10,12]:
ws.cell(row=r, column=colm2).value = 0.00
if shet_name == '专项应付款清查登记表': #表格有问题,有一千多列
print('修改{}'.format(shet_name))
for r in range(9, row2-1):
#for r in range(9, 24):
for colm2 in [2, 3,4 ,5,6]:
ws.cell(row=r, column=colm2).value = ''
for colm2 in [7,8,9,10,11,12,13,15,16]:
ws.cell(row=r, column=colm2).value = 0.00
# ws.unmerge_cells(start_row=1, start_column=1, end_row=2, end_column=2) #A1:B2,start_row=1就是冒号前的A,start_column是冒号前的1,从1行到1行
# #如果openpyxl在取消合并单元格的时候遇见报错ValueError: list.remove(x): x not in list,那么大概率是因为取消单元格的范围写错了!需检查下到底哪些范围是需要取消的。
# #PS:单元格取消合并后,原来合并单元格的值会赋值到左上角单元格,其他单元格是空白!
# ws.merge_cells(start_row=5, start_column=5, end_row=7, end_column=7)
# #end_row、end_column分别要比start_row、start_column大,合并E5:G7单元格
wb.save(targ_file_path)
# 释放资源,不然脚本无法打开,会处于锁定状态。
wb.close()
def func():
#raw_file_list,raw_file_path_list =get_file_list(data_sour_path)
#print(raw_file_list)
temp_file_list, temp_file_path_list = get_file_list(temp_tabl_path)
#模板文件夹template table的文件复制到output table文件夹下
outp_tabl_list = []
for i in range(len(temp_file_list)):
outp_file_path =os.path.join(outp_tabl_path, temp_file_list[i])
shutil.copy(temp_file_path_list[i], outp_file_path)
outp_file_list, outp_file_path_list = get_file_list(outp_tabl_path)
print(outp_file_path_list)
print('gather data to excel')
for i in range(0,len(outp_file_path_list)):
outp_fil_nam = outp_file_list[i]
orgz = outp_fil_nam.strip('.xlsx').strip('台山市冲蒌镇') #organization组织单位
print(orgz)
modf_excl(targ_file_path=outp_file_path_list[i], shet_name=list_shet_name[0])
# for k in range(len(list_shet_name)):
# modf_excl(targ_file_path=outp_file_path_list[i],shet_name=list_shet_name[k])
print('第{}个文件'.format(i+1))
if __name__ == "__main__":
func()
二、取消合并单元格
#coding=utf-8
#合并单元格,此文档尝试了用增加行
import xlrd, xlwt, xlwings, pyautogui, time, pyperclip, easygui, os, tkinter, io,pandas,shutil,re, os
from tkinter import filedialog,ttk
from openpyxl import load_workbook
from openpyxl.styles import Border, Side, colors
#import autopy as at
import openpyxl
#file= tkinter.filedialog.askopenfile()#选择打开什么文件,返回IO流对象
#file= tkinter.filedialog.askopenfilename()#选择打开什么文件,返回文件名
#print(file)
from io import StringIO
import sys
from contextlib import contextmanager
import sys
curn_path = os.getcwd() #current path当前路径
temp_tabl_path = os.path.join(curn_path, 'Template Table')
outp_tabl_path = os.path.join(curn_path, 'Output Table')
data_sour_path = os.path.join(curn_path, 'Data Source')
list_shet_name =['应收款项清查登记表', ' 固定资产清查登记表-2', '资源性资产清查登记明细表-1']
shet_name =list_shet_name[2]
def get_file_list(raw_folder_path):
# 打开文件
dirs = os.listdir(raw_folder_path)
raw_file_list=[]
raw_file_path_list=[]
for home, dirs, files in os.walk(raw_folder_path):
for file_name in files:
raw_file_list.append((file_name))
raw_file_path_list.append(os.path.join(home, file_name))
#print('raw_file_list')
#print(raw_file_list)
return raw_file_list,raw_file_path_list
def modf_excl(targ_file_path): #modify Excel
#Unmerges cells Excel 01.py:50: DeprecationWarning: Call to deprecated function get_sheet_by_name
# python的openpyxl连接Excel:舍弃get_sheet_names()
# 与get_shetet_by_name(),现在已经替换成了相应的其他两个方法。
# - wb.get_sheet_names()(舍弃) —— > wb.sheetnames(现在用的)
# - wb.get_sheet_by_names(‘sheet1’)(舍弃) —— > wb[ ‘sheet1’](现在用的)
print(targ_file_path)
wb = load_workbook(targ_file_path)
# ws = wb[' 固定资产清查登记表-2']
#ws = wb['封面']
#ws = wb[' 固定资产清查登记表-2']
ws = wb['应收款项清查登记表']
ws = wb['资源性资产清查登记明细表-1']
#ws = wb.get_sheet_by_name('封面')
# ws.merge_cells('A1:B1')
# ws.unmerge_cells('A1:B1')
# 以下函数可以达到相同效果
#ws = wb._sheets[0]
# 获取行列数
# print(wb.sheetnames)
# ['封面', '货币资金清查登记表', '短期投资清查登记表', '应收款项清查登记表', '库存物资清查登记表', '牲畜 (禽) 资产清查登记表', '林木资产清查登记表', '长期投资清查登记表',
# '固定资产清查登记表-1', ' 固定资产清查登记表-2', '在建工程清查登记表-1', '在建工程清查登记表-2', '无形资产清查登记表', '租赁发包合同', '短期借款清查登记表', '应付款项清查登记表',
# '长期借款及应付款清查登记表', '应付工资清查登记表', '应付福利费清查登记表', '一事一议资金清查登记表', '专项应付款清查登记表', '所有者权益清查登记表', '待界定资产清查登记表(账外)',
# '资源性资产清查登记明细表-1', '资源性资产清查登记明细表-2', '资源性资产清查登记明细表-3', '资产负债表(合并报表)', '资源性资产清查登记总表', '收益分配统计表', '合同总表']
row = ws.max_row
colm = ws.max_column
print(row)
#print(colm)
# # 单元格赋值
#ws.cell(row=9, column=1, value='金额')
# xl_cell = xl_sheet.cell(row=i, column=j, value=“金额”)
#ws.unmerge_cells(start_row=row-1, start_column=1, end_row=row-1, end_column=3) #wb[' 固定资产清查登记表-2']
#ws.unmerge_cells(start_row=row-1, start_column=1, end_row=row-1, end_column=2) #'应收款项清查登记表'
ws.unmerge_cells(start_row=row - 1, start_column=1, end_row=row - 1, end_column=2) # '资源性资产清查登记明细表-1'
# ws.unmerge_cells(start_row=1, start_column=1, end_row=2, end_column=2) #A1:B2,start_row=1就是冒号前的A,start_column是冒号前的1,从1行到1行
# #如果openpyxl在取消合并单元格的时候遇见报错ValueError: list.remove(x): x not in list,那么大概率是因为取消单元格的范围写错了!需检查下到底哪些范围是需要取消的。
# #PS:单元格取消合并后,原来合并单元格的值会赋值到左上角单元格,其他单元格是空白!
# ws.merge_cells(start_row=5, start_column=5, end_row=7, end_column=7)
# #end_row、end_column分别要比start_row、start_column大,合并E5:G7单元格
wb.save(targ_file_path)
# 释放资源,不然脚本无法打开,会处于锁定状态。
wb.close()
def func():
#raw_file_list,raw_file_path_list =get_file_list(data_sour_path)
#print(raw_file_list)
temp_file_list, temp_file_path_list = get_file_list(temp_tabl_path)
#模板文件夹template table的文件复制到output table文件夹下
outp_tabl_list = []
for i in range(len(temp_file_list)):
outp_file_path =os.path.join(outp_tabl_path, temp_file_list[i])
shutil.copy(temp_file_path_list[i], outp_file_path)
outp_file_list, outp_file_path_list = get_file_list(outp_tabl_path)
print(outp_file_path_list)
print('gather data to excel')
for i in range(0,len(outp_file_path_list)):
outp_fil_nam = outp_file_list[i]
orgz = outp_fil_nam.strip('.xlsx').strip('台山市冲蒌镇') #organization组织单位
print(orgz)
modf_excl(targ_file_path=outp_file_path_list[i])
print('第{}个文件'.format(i+1))
if __name__ == "__main__":
func()
三、插入行
#coding=utf-8
#
import xlrd, xlwt, xlwings, pyautogui, time, pyperclip, easygui, os, tkinter, io,pandas,shutil,re, os, openpyxl
from tkinter import filedialog,ttk
from openpyxl import load_workbook #pip install openpyxl
from openpyxl.styles import Border, Side, colors
#import autopy as at
#file= tkinter.filedialog.askopenfile()#选择打开什么文件,返回IO流对象
#file= tkinter.filedialog.askopenfilename()#选择打开什么文件,返回文件名
#print(file)
from io import StringIO
import sys
from contextlib import contextmanager
import sys
def row_inse(file_path): #row insert
# 参数visible设置False不显示excel界面,默认是True显示的
#app = xlwings.App(visible=False)
app = xlwings.App(visible=False)
wt = app.books.open(file_path)
# # 加载第一个sheet页签
# sheet = wt.sheets[0]
#sheet = wt.sheets[' 固定资产清查登记表-2']
sheet = wt.sheets[' 固定资产清查登记表-2']
#sheet = wt.sheets['封面']
time.sleep(2)
# 读取行数
#rows = sheet.used_range.last_cell.row
# sheet.api.Rows(33).Insert()
# sheet.api.Rows(23).Insert()
# sheet.api.Rows(13).Insert()
sheet.api.Rows(6).Insert()
time.sleep(2)
# 不指定路径,脚本会直接保存到原文件
wt.save()
# 释放资源,不然脚本无法打开,会处于锁定状态。
wt.close()
def row_inse2(targ_file_path): #
wb = openpyxl.load_workbook(targ_file_path)
# ws = wb[' 固定资产清查登记表-2']
# ws = wb['封面']
ws = wb.get_sheet_by_name(' 固定资产清查登记表-2')
# ws.merge_cells('A1:B1')
# ws.unmerge_cells('A1:B1')
# 以下函数可以达到相同效果
#ws = wb._sheets[0]
n=10
ws.insert_rows(n) # 在第n行插入一行
# (四)插入行列
# ws.insert_rows(n) # 在第n行插入一行
# ws.insert_cols(m, n) # 从第m列开始插入n列
print(1)
wb.save(targ_file_path)
# 释放资源,不然脚本无法打开,会处于锁定状态。
wb.close()
def func():
file_path ='台山市冲蒌镇八家经济联合社.xlsx'
file_path = '台山市冲蒌镇八家经济联合社 (5).xlsx'
#row_inse(file_path=file_path)
row_inse2(targ_file_path=file_path)
if __name__ == "__main__":
func()
#
#
#
#
#
#
#
#
#
#
# def saveAsNewExcelFile(raw_file_path_list):
# list1=[]
# print("file name")
# fil_nam='村委会1'
#
# for raw_file_path in raw_file_path_list:
#
# for i in getInfo.index:
# for j in range(len(getInfo.loc[i].values)):
# if (getInfo.loc[i].values[j] == '专项应付款-村(社区)办公经费'):
# start_col = i + 1
# row_data = getInfo.loc[i].values
# # print(row_data)
# row_data = list(row_data)
# row_data = list[fil_nam] + row_data
# list1.append(row_data)
# print(list1)
# print('target data目标数据')
# targ_data = pandas.DataFrame(list1)
#
#
#
#
# # get cared macro info from testplan and save as 'MacroInfo.xlsx'
# getInfo = pandas.read_excel(input_file_path_plan, sheet_name="Sheet1", dtype=str, keep_default_na=False)
# for i in getInfo.index:
# for j in range(len(getInfo.loc[i].values)):
# if (getInfo.loc[i].values[j] == '专项应付款-村(社区)办公经费'):
# start_col = i + 1
# row_data=getInfo.loc[i].values
# #print(row_data)
# row_data=list(row_data)
# row_data=list[fil_nam]+row_data
# list1.append(row_data)
# print(list1)
# print('target data目标数据')
# targ_data=pandas.DataFrame(list1)
# #break #add 2.3
# # print(getInfo.loc[i].values[j])
# #x = pandas.DataFrame(getInfo.iloc[start_col:, ])
# #print(x)
# # 判断是否存在output文件夹
# OutputPath=r"e:\贝佳会计系统导出数据\两项经费统计"
# if (os.path.exists(OutputPath)):
# shutil.rmtree(OutputPath)
# print('output dir has been rm -rf and new makedirs')
# os.makedirs(OutputPath)
#
# # 写入文件保存在output 文件夹下
# filepath = os.path.join(OutputPath, '村(社区)办公经费.xls')
# targ_data.to_excel(filepath, header=2, index=False, encoding='utf-8', sheet_name='村(社区)办公经费')