python操作excel:批量为多个sheet页生成超链接
目录
- 需求
- 解决办法
- 举一反三
需求
excel文件内存在多个sheet页,想要将总表中的信息进行关联和对应的sheet页进行关联,可以通过总表部分,快速调到特定的sheet页。一看excel里边要为好几百个sheet页加超链接,看着都头大。
有问题,相应的就有解决问题的对策。
解决办法
网上其实有很多办法,就不一一说明了。直接总结下自己的处理办法。
最基本的原理就是对 **HYPERLINK函数**的使用。
HYPERLINK函数的语法1如下:
HYPERLINK(link_location,friendly_name).
说明:
HYPERLINK 为函数名
link_location 为链接位置
friendly_name 为显示文本
举例:
比如A1单元格,输入公式:=HYPERLINK("#B8",“跳转到B8”)
意思是单击A1单元格,将跳转到B8单元格。
因此,就是对我们想要进行添加超链接的单元格,赋值为:"=HYPERLINK(link_location,friendly_name)" ,主要是对参数link_location和参数friendly_name 的迭代更新。
看一个具体的表格信息:
针对这一表格,对应的python实现如下:
import pandas as pd
import warnings
warnings.filterwarnings('ignore')
filename = r'超链接测试文件.xls'
data = pd.read_excel(filename,sheet_name=None) # sheet_name参数,很重要,在这里
with pd.ExcelWriter('添加超链接后的文件.xls',engine='xlsxwriter') as writer:
sheet_names = list(data.keys())
for s_name in sheet_names[1:]:
# 生成超链接字符串
hypre_link = r'=HYPERLINK("#'+s_name+'!a1' + '\",\"'+s_name+ '")'
flag = data['总表']['table_comment']==s_name
print(hypre_link)
data['总表'].ix[flag,1] = hypre_link
data[s_name].to_excel(writer,sheet_name=s_name,index=False)
data['总表'].to_excel(writer,sheet_name='总表',index=False)
打印出来的超链接函数值:
=HYPERLINK("#行政许可信息!a1","行政许可信息")
=HYPERLINK("#问题台账!a1","问题台账")
=HYPERLINK("#公告信息!a1","公告信息")
=HYPERLINK("#公告记录!a1","公告记录")
=HYPERLINK("#更正公告信息!a1","更正公告信息")
完美可以跳转,结果文件如下图所示:
举一反三
上述案例说明的是对excel内部的sheet页进行添加超链接。其实,对于想要超链接其他的文件处理的思路都是一样的,就是对 HYPERLINK(link_location,friendly_name) 函数的参数赋予相应的位置信息而已。
下述的代码案例,相对来说比较复杂,主要是我的个人工作内容的一个备份。看到此处的博友可以忽略。
import pandas as pd
import re
import warnings
warnings.filterwarnings('ignore')
idc_filename = r'C:\Users\14369\Desktop\20210222 idc信息处理\idc同步数据统计表20201231.xlsx'
datamulu_filename = r'C:\Users\14369\Desktop\20210222 idc信息处理\数据20201215.xlsx'
idc_data = pd.read_excel(idc_filename)
# datamulu = pd.read_excel(datamulu_filename)
datamulu = pd.read_excel(datamulu_filename,sheet_name=None)
idc_data_copy = idc_data.copy(deep=True)
#声明一个读写对象
counts = 0 # 记录处理了几个文件
with pd.ExcelWriter('result.xls',engine='xlsxwriter') as writer:
# 插入对应的表字段
for comment in idc_data['table_comment']:
for sheetname in datamulu.keys():
try:
name = re.split(r'[-_]',comment)[1]
except:
print(comment)
continue
flags = [name in m for m in datamulu[sheetname]['数据资源名称']]
if sum(flags)>0:
counts +=1
# print(counts,comment)
temp_data = datamulu[sheetname].ix[flags,:]
temp_data.to_excel(writer,sheet_name=name,index=False)
# 生成超链接字符串并修改对应的表格位置内容
hypre_link = r'=HYPERLINK("#'+name+'!a1' + '\",\"'+comment+ '")'
idc_data_copy.ix[idc_data['table_comment']==comment,1] = hypre_link
break
idc_hyp_true = ['HYPERLINK' in com for com in idc_data_copy['table_comment']]
idc_hyp_false = [not i for i in idc_hyp_true]
idc_data_copy.ix[idc_hyp_true,:].to_excel(writer,sheet_name='tab20201231_有超链接',index=False) # 总表
idc_data_copy.ix[idc_hyp_false,:].to_excel(writer,sheet_name='tab20201231_无超链接',index=False) # 总表
常有问题是一种好现象,说明你是在走上坡路!