Я пишу Excel, используя пакет XLSXWRITER на Python. К ячейкам применяются форматы, и все это работает, за исключением одной ячейки, в которой присвоенное значение представляет собой 27-значную текстовую строку (извлеченную из какого-то источника).
Я прочитал Как применить формат «Текст» и «Учет» с помощью xlsxwriter. Предлагается установить числовой формат «@», но когда я пытаюсь:
WSFMT_TX_REFINFO = wb.add_format({'num_format': '@'
, 'align': 'right'
, 'border_color': WS_TX_BORDERCOLOR
, 'right': WS_TX_BORDERSYTLE
})
и напишите ячейку с:
refdata = '001022002024080400002400105'
ws.write(wsRow, WS_COL_REF_INFO, refdata, WSFMT_TX_REFINFO)
Ячейка отображается как
1.041E+24
и в поле редактора как
1.041002024073E+24
Если я изменю спецификацию формата с '@'
на 0
, т. е. изменю
WSFMT_TX_REFINFO = wb.add_format({'num_format': '@'
к
WSFMT_TX_REFINFO = wb.add_format({'num_format': 0
ячейка отображается как
1022002024080400000000000
Обратите внимание, что цифры после 14-й заменяются нулями. В поле редактора это отображается как
1.0220020240804E+24
Что мне нужно: номер должен отображаться в виде 27-значной строки, точно так же, как в refdata
.
Примечание. В некоторых случаях refdata
может содержать буквенно-цифровые строки, помимо чистых 27-значных строк.
Есть какой-нибудь намек?
Когда вы пишете его как текст, он будет отображаться как строка цифр, поэтому в первом примере должно отображаться именно это «001022002024080400002400105». Только если оно было преобразовано в число, оно будет отображаться как 1.041E+24
@moken Да, должно, но это не так.
Для меня это так, я попробовал ваш код ради интереса. Вы получите ошибку «число, сохраненное как текст» в ячейке, но вся строка отображается так, как написано. Код, который я использовал, приведен ниже в ответе вместе с результатом.
@rachel Я пробовала это, но тогда данные отображаются как '001022002024080400002400105
, т. е. отображается апостроф.
Вероятно, отображается ведущий апостроф, потому что вы по-прежнему устанавливаете строковое форматирование. Оставьте это как общее.
Возможно, в этом случае лучше использовать write_string()
вместо более общего write()
.
@MarkRansom Пробовал использовать только формат, устанавливая границу ячейки, т. е. 'num_format: '@'
удаляя, но апостроф все равно отображается.
@jmcnamara Вот оно! Спасибо. Я не знал о методе write_string()
. Отлично работает. Если бы вы добавили свой комментарий в качестве ответа, я мог бы принять его.
Я запустил тест с вашим кодом, и результат такой, как показано.
import xlsxwriter
workbook = xlsxwriter.Workbook('test.xlsx')
worksheet = workbook.add_worksheet()
WS_TX_BORDERCOLOR = 'blue'
WS_TX_BORDERSYTLE = 1
WSFMT_TX_REFINFO = workbook.add_format({'num_format': '@',
'align': 'right',
'border_color': WS_TX_BORDERCOLOR,
'right': WS_TX_BORDERSYTLE
})
wsRow = 5
wsCol = 3
refdata = '001022002024080400002400105'
worksheet.write(wsRow, wsCol, refdata, WSFMT_TX_REFINFO)
workbook.close()
Результат
Это работает и для меня. Не вижу разницы с моим (более обширным) кодом. Требует дальнейшего расследования.
Возможно, в этом случае лучше использовать write_string() вместо более общего write().
Я использую
'
для преобразования чисел в текст в Excel:ws.write(0, 0, '\'001022002024080400002400105')
. Формат не применен.