Добавление файлов xlsx с сохранением гиперссылок через python - PullRequest
0 голосов
/ 01 октября 2019

У меня есть около 20 файлов xlsx, которые я хотел бы добавить, используя python. Я легко могу сделать это с пандами, проблема в том, что в первом столбце у меня есть гиперссылки, и когда я использую панд для добавления своих файлов xlsx, я теряю гиперссылку и получаю только текст в столбце. Вот код, использующий панд.

excels = [pd.ExcelFile(name) for name in files]
frames = [x.parse(x.sheet_names[0], header=None,index_col=None) for x in excels]
frames[1:] = [df[1:] for df in frames[1:]]
combined = pd.concat(frames)
combined.to_excel("c.xlsx", header=False, index=False)

Можно ли как-нибудь добавить свои файлы, сохранив гиперссылки? Есть ли конкретная библиотека, которая может сделать это?

1 Ответ

0 голосов
/ 02 октября 2019

Это зависит от того, как гиперссылки записаны в исходных файлах Excel, и от того, какой редактор Excel вы используете. read_excel вернет отображаемый текст, например, если у вас есть гиперссылка на https://www.google.com, а диплейный текст просто google, тогда нет никакой возможности сохранить ссылку с пандами, так как в вашем распоряжении будет только googledataframe.

Если отдельное отображаемое имя не задано (или отображаемое имя совпадает с гиперссылкой) и вы используете xlsxwriter (engine='xlsxwriter'), тогда вывод to_excel будетавтоматически конвертируется в гиперссылки (потому что начинается с 'http://' или любой другой схемы) (начиная с версии 1.1.5 xlsxwriter).

Если вы знаете, что все ваши гиперссылки являются ссылками 'http://' без прав доступа, а отображаемое имя (если отличается от ссылки) является просто путем URL-адреса, тогда вы можете добавить суффикс' http://' иВы получите гиперссылки в файле Excel:

combined.iloc[combined[~combined.iloc[:,0].str.startswith('http')].index,0] = 'http://' + combined.iloc[combined[~combined.iloc[:,0].str.startswith('http')].index,0]
combined.to_excel("c.xlsx", header=False, index=False, engine='xlsxwriter')


Универсальное решение без панд с использованием openpyxl показано в этот ответ натот же самый вопрос, откуда вы взяли решение для панд. Чтобы скопировать и гиперссылки, вам нужно просто добавить следующие строки в функцию copySheet:
        if cell.hyperlink is not None:
            newCell.hyperlink = copy(cell.hyperlink)
...