如何使用Pandas将长URL保存在单元格中的*.xlsx文件中

38
例如,我使用2列(id和URL)将Excel文件读入DataFrame中。输入文件中的URL是文本格式(没有超链接)。
input_f = pd.read_excel("input.xlsx")

观察DataFrame中的内容-所有内容都已成功读取,在input_f中,所有URL都没有问题。然后我想将此文件保存为Excel格式

input_f.to_excel("output.xlsx", index=False)

我收到了警告。

路径\worksheet.py:836: UserWarning: 忽略 URL'http://这是一个超长的URL',因为它的链接或位置/锚点> 255个字符,超过了Excel对URLS的限制 force_unicode(url))

在output.xlsx中,带有超长URL的单元格是空的,并且URL变成了超链接。

如何修复?

3个回答

74
您可以创建一个ExcelWriter对象,并选择不将字符串转换为URL。
writer = pandas.ExcelWriter(
    r'file.xlsx', 
    engine='xlsxwriter',
    options={'strings_to_urls': False}
)
df.to_excel(writer)
writer.close()

在最新版本的Pandas中,你需要编写
writer = pd.ExcelWriter(
   r'file.xlsx', 
   engine='xlsxwriter',
   engine_kwargs={'options': {'strings_to_urls': False}}
 )

3
供其他人参考,xlsxwriter 1.2.3 版本将最大 URL 长度从 255 增加到 2079 个字符,这在更近期的 Excel 版本中得到支持,可能避免了需要使用 strings_to_urls=False 的情况。 - Garrett
有没有什么诀窍可以绕过 Excel 文件中 URL 数量的最大限制? :) - Roelant

5

我自己尝试了一下,结果也遇到了同样的问题。你可以试着创建一个临时的csv文件,然后使用xlsxwriter来创建一个Excel文件。完成后再删除临时文件。xlsxwriter有一个write_string方法,它可以覆盖Excel自动建立超链接的功能。这对我有效。

import pandas as pd
import csv
import os
from xlsxwriter.workbook import Workbook
inData = "C:/Users/martbar/Desktop/test.xlsx"
tmp = "C:/Users/martbar/Desktop/tmp.csv"
exFile = "C:/Users/martbar/Desktop/output.xlsx"

#read in data
df = pd.read_excel(inData)

#send to csv
df.to_csv(tmp, index=False)

#convert to excel
workbook = Workbook(exFile)
worksheet = workbook.add_worksheet()
with open(tmp, 'r') as f:
    reader = csv.reader(f)
    for r, row in enumerate(reader):
        for c, col in enumerate(row):
            #if you use write instead of write_string you will get the error
            worksheet.write_string(r, c, col) 
workbook.close()

#delete tmp file
os.remove(tmp)

2

文档中的章节:"将XlsxWriter构造函数选项传递给Pandas"中,'strings_to_urls': False现在可以这样指定:

writer = pd.ExcelWriter('pandas_example.xlsx',
                        engine='xlsxwriter',
                        engine_kwargs={'options': {'strings_to_urls': False}})

然后继续执行所接受的响应建议这里

df.to_excel(writer)
writer.close()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接