前提:项目里已经有函数功能将数据库数据生成excel表格
需求:将现有的excel表格数值覆盖为url超链接
利用pandas直接写入
优点:
- 省事,只要把数值用原始的excel函数 =HYPERLINK 替代,生成的表格数值既是超链接
- 用pandas.to_excel() 即可直接生成表格,只要传入的参数没有遗漏,一般表格不会出错
缺点:
- 原始的excel函数限制参数不能超过255个字符长度,导致某些长度较长的超链接不能正常生效
利用xlsxwriter直接写入
优点:
- 可xlsxwriter.write_url写入超长的url链接(限制2079个字符),像pandas只能用原始的excel函数 =HYPERLINK 写入超链接(限制255个字符)
缺点:
- 破坏原有代码结构(现在项目里已经有代码自动生成excel表格,只是不带url数据)
- excel表格里每个格子都需要用代码控制写入,代码量较大,可能会有遗漏
wordbook = None
try:
wordbook = xlsxwriter.Workbook(file_path)
sheet = wordbook.add_worksheet('Sheet') # 创建一个新的sheet
for 列名:
sheet.write(0, colume + 1, value['label']) # 写列名
for 行:
for 列:
sheet.write_url(row_num + 1, column_num + 1, url, string = str(value)) # 写入url
finally:
if wordbook is not None:
wordbook.close()
pandas读取表格,然后xlsxwriter覆盖
pandas.read_excel 可以 返回一个pandaDataFrame,然后利用这个DF的数据可以用xlsxwriter重写覆盖数据
优点:
- 读到的数据是表格原有的数据(写入表格的数据可能会缺失)
缺点:
1. xlsxwriter写入的时候会触动原有表格的清空(既需要整张excel表格的数据都需要重新写入,即使有些数据你并不想修改)
pandas读取数据
A B C
0 0 2 3
1 0 4 1
2 10 20 30
df = pandas.read_excel()
df.iat[1, 2] # 读取第一行第二列
df.iloc[0] # 第一行的数据 <class 'pandas.core.series.Series'>
df.iloc[[0]] # 第一行的数据 <class 'pandas.core.frame.DataFrame'>
df.loc['row_name'] # 读取索引为row_name的这一行数据
row_count = df.shape[0] # 总行数
col_count = df.shape[1] # 总列数
最终方案
- 其实原始的excel表格也是利用pandas.to_excel()进行生成的,这里传入的参数也是 pandas.DataFrame 结构的数据
- 我们可以直接在代码里拿到这个DataFrame数据,然后再利用xlsxwriter生成对应的表格数据
缺点:
- 用xlsxwriter写入可能会有遗漏和出错,没有直接调用pandas.to_excel方便