openpyxl читает ширину столбца из .xlsx и записывает его в новый .xlsx: ширина отличается в новом файле - PullRequest
0 голосов
/ 30 января 2019

Я использую openpyxl для работы с .xlsx файлами в Python.

У меня есть файл sample.xlsx, из которого я хочу получить список полей заголовков и ширину столбцов для использования вфайл, сгенерированный моим сценарием.

Сначала я создаю список с именами столбцов и соответствующими им значениями ширины.Поэтому я использую:

filter_list = {"name": [], "width": []} 
row_count = sheet.max_row 
   for i in range(row_count): 
      cell = sheet.cell(row, i + 1) 
      if cell.value: 
        filter_list["name"].append(cell.value)
        filter_list["width"].append(sheet.column_dimensions
             [cell.column].width)  

значение, чтобы получить ширину столбца, а затем я устанавливаю то же значение:

if filter_list["width"][i] is not None: 
    sheet.column_dimensions[cell.column].width = filter_list["width"][i]

Это прекрасно работает, если конкретный столбец имеет значение не по умолчанию (т.е.не нет).Когда я открываю выходной файл (как на Mac, так и на Windows), я вижу, что ширина этого конкретного столбца одинакова для обоих файлов.

Но если один из столбцов имеет ... width = Noneво входном файле (таким образом, выходной файл имеет то же значение None для параметра ширины столбца), тот же столбец в выходном файле выглядит по-разному.

Любые идеи о том, почему это происходит?

Похоже, где-то в .xlsx есть параметр, который каким-то образом определяет, какой ширине по умолчанию (= None value) присвоено значение.

Есть ли способ заставить оба файла выглядеть одинаково с точки зренияширина столбца?

Обновление: Я добавил проверку для значения ширины None.Я устанавливаю параметр ширины столбца только для столбцов, которые не имеют значения None.Результат остается тем же - файлы различаются по ширине по умолчанию.

Обновление 2: Я обновил код, чтобы показать, как именно я читаю и установить ширину столбца.

Ответы [ 2 ]

0 голосов
/ 30 января 2019

Если размер столбца имеет ширину None, Excel по умолчанию равен 0, а не ширине столбца по умолчанию для рабочего листа.openpyxl пытается упростить доступ к измерениям, создав их, если они не существуют.Таким образом, ваш код создает некоторые с width=None в обоих файлах, но эффект этого становится видимым только при сохранении файла.

В вашем случае вы сможете избежать проблем, работая явно с измерениямив первом файле:

for k, cd in ws1.column_dimensions.items():
    ws2.column_dimensions[k].width = cd.width
0 голосов
/ 30 января 2019

В ответ на первый бит: нет, не знаю, почему это происходит

Но в ответ на второй, мне кажется, что это так же просто, как:

if mywidth is not None:
    output_sheet.column_dimensions['A'].width = mywidth

т.е.в цикле через все столбцы просто проверьте, что ширина столбца действительно определена.Если это так, примените его к новому листу, если нет, то просто проигнорируйте его.

Примечание: это column_dimensions (множественное число), а не единственная версия

РЕДАКТИРОВАТЬ ПослеОбновление вопроса:

Способ, которым Excel работает с шириной столбцов по умолчанию, находится на уровне листа.Посмотрев несколько основных книг Excel с использованием OpenXML tools , а затем перекрестных ссылок с openpyxl docs , может показаться, что вы можете выполнить следующее:

wb1 = load_workbook("my/workbook/name.xlsx")
ws1 = wb1.active
default_col_width = ws1.sheet_format.defaultColWidth

В качестве альтернативы, открыв новую книгу, перейдите на вкладку Home, раздел Cells, нажмите кнопку Format, выберите Default width... и установите его как хотите.

...