2016-10-13 9 views
0

У меня есть следующий контент в старом листе Excel:Python Xlrd и Xlwt

excel sheet screenshot

Мне нужно создать новый лист Excel со следующими значениями:

excel sheet updated

В 3-й столбец ввода Excel Excel имеет диапазон 10010-10040 и значение приращения 10. Это необходимо расширить в моем новом файле Excel.

Если я даю запятую (,) между значениями, ее следует рассматривать как отдельные значения и расширены. (Как в строке 2, столбец 3)

Я понятия не имею, как это сделать, и я новичок в Python.

+0

Вам необходимо отделить значение «10010-10040-10» («initNumber-FinalNumber-Increment»), используя символ «-» в качестве деления. Затем вы можете выполнить цикл for (или что-то подобное), где ваш приращение будет «Increment» и начнется с «initNumber» и закончится с «FinalNumber». Внутри вашего цикла вы объединяете «Ex» + iterationNumber, чтобы получить Ex1, Ex2, .... Для третьего столбца вы можете иметь переменную, которая начинается с «initNumber» и добавляет «Increment» каждый цикл. – luizfvpereira

+0

Вы имеете дело со старыми файлами 'xls'? Или новые файлы 'xlsx'? Эти библиотеки предназначены для работы со старым форматом. –

+0

Привет, Martin .. Я использовал новый файл xlsx в качестве входного файла. xlrd работает с ним. Выходной файл вышел как старый формат xls. –

ответ

0

Попробуйте следующее. Это использует xlrd и xlwt библиотеки для чтения и записи xls таблицы:.

import xlrd 
import xlwt 

wb_in = xlrd.open_workbook(r'input.xls') 
sheet_name = wb_in.sheet_names()[0] 
ws_in = wb_in.sheet_by_name(sheet_name) 

wb_out = xlwt.Workbook() 
ws_out = wb_out.add_sheet(sheet_name) # Use the same sheet name 

row_out = 0 

for row_in in range(ws_in.nrows): 
    row = ws_in.row_values(row_in) 

    if isinstance(row[2], float): 
     req_spec = str(int(row[2])) 
    else: 
     req_spec = row[2] 

    req_range = req_spec.split('-') 
    req_enum = req_spec.split(',') 

    if len(req_range) > 1: # e.g. 10010-10040-10 
     for value in range(int(str(req_range[0])), int(str(req_range[1])) + 1, int(str(req_range[2]))): 
      ws_out.write(row_out, 0, row[0]) 
      ws_out.write(row_out, 1, row[1]) 
      ws_out.write(row_out, 2, str(value)) 
      row_out += 1 
    elif len(req_enum) > 1: # e.g. 1010,1020 
     for value in req_enum: 
      ws_out.write(row_out, 0, row[0]) 
      ws_out.write(row_out, 1, row[1]) 
      ws_out.write(row_out, 2, value) 
      row_out += 1 
    else:      # e.g. 10100 
     ws_out.write(row_out, 0, row[0]) 
     ws_out.write(row_out, 1, row[1]) 
     ws_out.write(row_out, 2, req_spec) 
     row_out += 1 

wb_out.save('output.xls') 

К сожалению, если вы не знакомы с Python есть довольно много, чтобы принять в

Скрипт работает путем создания входной книги и выходную книгу. Для каждой строки на входе предполагается, что у вас всегда будет 3 столбца, а третий - один из трех типов спецификаций. Он принимает решение о том, что используется в зависимости от наличия или отсутствия - или ,. Затем он записывает строки на выход на основе этого диапазона.

Обратите внимание, что при чтении файла, xlrd пытается угадать формат ячейки. Для большинства ваших записей он угадывает строковый формат, но иногда он ошибочно догадывается о числе с плавающей запятой. Скрипт проверяет это и преобразует его в строку для согласованности. Также xlrd использует формат unicode u"xxx" для хранения строк. Они должны быть преобразованы в числа, чтобы иметь возможность рассчитать требуемые диапазоны.

+0

Спасибо, Мартин ... Мне это очень помогло ...! –

+0

Добро пожаловать! Не забудьте щелкнуть по серому тику по ответу, чтобы принять его в качестве решения. –

 Смежные вопросы

  • Нет связанных вопросов^_^