2016-07-21 5 views
0

У меня есть несколько speadsheets:pyexcel - получить имена столбцов и добавить целые строки вместе

Sheet 1  sheet2  sheet3 

A B C  D E F  D F G 

1 2 3  4 5 6  7 9 8 

Я использую pyexcel присоединиться строки вместе с таблицами 1 и 2, а также 1 и 3, так что в сочетании строка для 1 и 2 будет:

A B C D E F D F G, 
1 2 3 4 5 6 

и 1 и 3:

A B C D E F D F G 
1 2 3  7 9 8 

Как это может быть сделано в pyexcel?

Сейчас у меня есть два для петель и это:

if t_row['name'] is not "": 
        update_sheet[count, 'name'] = t_row['name'] 

Но лист 2 не имеет F и G столбцов и лист 3 не имеют E и F. Как перечислить, какие столбцы листа имеет ИЛИ просто возьмите всю строку и присоедините ее к строке и сохраните ее?

ответ

1

Не ясно:

  1. Как вы читаете лист
  2. , как вы хотите обрабатывать присоединиться, когда оба листа имеет значения. Я предполагаю, что вы хотите подвести итог.

    import numpy as np 
    import pyexcel as pe 
    
    a = np.array(pe.get_array(file_name='Sheet1.xlsx')) 
    b = np.array(pe.get_array(file_name='Sheet2.xlsx')) 
    c = np.array(pe.get_array(file_name='Sheet3.xlsx')) 
    
    all=[a,b,c] 
    max_cols = max([i.shape[1] for i in all]) 
    
    
    for i in range(3): 
        if all[i].dtype!=np.dtype('int'): 
         all[i][all[i]=='']=0 
         all[i]=all[i].astype('int') 
        if (all[i].shape[1] != max_cols): 
         all[i]=np.hstack([all[i], [[0]*(max_cols-all[i].shape[1])]*(all[i].shape[0])]) 
    
    np.sum(np.vstack(all), 0) 
    

EDIT

Использование вам нужно будет не для петель (только для цикла через разные листы). Это будет использовать numpy в питоническом стиле!

def join_sheets(a, b): 
    both = [a,b] 
    max_cols = max([i.number_of_columns() for i in both]) 
    min_rows = min([i.number_of_rows() for i in both]) 
    both_arr = [np.array(i.array) for i in both] 
    for i in range(2): 
     both_arr[i] = np.hstack([both_arr[i], [['']*(max_cols - both_arr[i].shape[1])]*(both_arr[i].shape[0])]) 
    both_arr[0][0:min_rows,][both_arr[1][0:min_rows,]!=''] = both_arr[1][0:min_rows,][both_arr[1][0:min_rows,]!=''] 
    if (b.number_of_rows() > min_rows): 
     both_arr[0] = np.vstack([both_arr[0], both_arr[1][min_rows:,]]) 
    a.array = both_arr[0].tolist() 

sheets = pe.get_book(file_name='Sheet1.xlsx') 
for i in range(1, sheets.number_of_sheets()): join_sheets(sheets[0], sheets[i]) 
sheets.save_as(sheets.path + '/' + sheets.filename) 
+0

Нет, на самом деле я хочу, чтобы листы 2 и 3 перезаписывали листы 1 (думаю, что прейскуранты для предметов, некоторые предметы новы, некоторые детали новы). – user2757902

+0

Есть ли способ в pyexcel сделать что-то вроде: для строки в записях: строка ['mycolname'] = 'обновленное описание' ? – user2757902

+0

вы рассмотрели использование [Sheet.to_records] (http://pyexcel.readthedocs.io/en/latest/generated/pyexcel.Sheet.to_records.html#pyexcel.Sheet.to_records)? – chfw