2015-01-25 12 views
12

Molti fogli di lavoro hanno formule e formattazione che gli strumenti Python per leggere e scrivere file Excel non possono riprodurre fedelmente. Ciò significa che qualsiasi file che voglio creare programmaticamente deve essere qualcosa che fondamentalmente creo da zero, e quindi altri file di Excel (con la sofisticazione di cui sopra) devono fare riferimento a quel file (che crea una varietà di altri problemi di dipendenza).Can Pandas può leggere e modificare un singolo foglio di lavoro file Excel (scheda) senza modificare il resto del file?

La mia conoscenza delle "schede" del file di Excel è che in realtà sono solo una raccolta di file XML. Bene, è possibile utilizzare i panda (o uno dei sottostanti motori di lettura/scrittura come xlsxwriter o openpyxl per modificare solo una delle schede, lasciando intatte le altre schede (con più elementi malvagi)

MODIFICA: cercherò di articolare ulteriormente il problema con un esempio

  • foglio di Excel test.xlsx ha quattro schede (aka fogli di lavoro):. Foglio1, Foglio2, Sheet3, Sheet4
  • ho letto Sheet3 in un dataframe (facciamo chiamalo df) usando pandas.read_excel()
  • Foglio1 e Foglio2 contengono formule, grafici e varie formattazioni che né openpyxl né xlrd può analizzare correttamente e Sheet4 contiene altri dati. Non voglio affatto toccare quelle schede.
  • Sheet2 ha alcuni riferimenti alle celle su Sheet3
  • Apporto alcune modifiche a df e ora voglio scriverlo di nuovo su sheet3, lasciando intatti gli altri fogli (e i riferimenti ad esso contenuti da altri fogli di lavoro nella cartella di lavoro intatti)

Posso farlo e, in caso affermativo, come?

risposta

0

se si parla di "schede" come "schede", è possibile modificare solo una delle schede accedendo a quella particolare utilizzando la funzione parse(sheet_name).

un esempio è qui: Reading an Excel file in python using pandas

a scrivere di nuovo a eccellere, (controllando i fogli) utilizzare la funzione di to_excel, qui: http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.to_excel.html

+1

Se si potesse inviare un blocco di codice che dimostra questa (in modo che il file di origine, che contiene * altri fogli *, oltre a quella (s) si legge in, è inalterata ad eccezione per i fogli che scrivi), sarebbe utile. – HaPsantran

4

Sono sicuro al 90% la risposta a " può pandas fare questo "è no. La pubblicazione di un negativo è dura, perché ci potrebbe essere sempre qualcosa di intelligente che ho perso, ma qui è un caso:

possibili motori di interfaccia sono xlrd/xlwt/xlutils, openpyxl e xlsxwriter. Nessuno funzionerà per i tuoi scopi, poiché xlrd/wt non supporta tutte le formule, xlsxwriter non può modificare i file esistenti xlsx e openpyxl perde immagini e grafici.

Dal momento che ho spesso bisogno di fare questo, ho preso solo la scrittura di uscita semplice da un file separato e quindi chiamando il Win32API direttamente per copiare i dati tra le cartelle di lavoro, preservando tutte le figure lucide del mio collega. È fastidioso, perché significa che devo farlo in Windows invece che in * nix, ma funziona.

Se lavori con Windows, potresti fare qualcosa di simile. (Mi chiedo se abbia senso aggiungere un'opzione di inserimento nativa usando questo approccio per aiutare le persone in questa situazione, o se dovremmo semplicemente pubblicare una ricetta.)


P.S .: Questo molto problema mi ha infastidito abbastanza di tanto in tanto che ho pensato di imparare abbastanza del moderno formato Excel per aggiungere il supporto per questo di una delle biblioteche.

PPS: Ma dal momento che ignorare le cose che non si gestiscono e restituirle non modificate sembra abbastanza facile, il fatto che nessuno sembra sostenerlo mi fa pensare che ci sono alcuni grattacapi e dove sono coinvolto Redmond sono disposto a credere esso. @ john-machin conoscerebbe i dettagli, se si tratta di ..

+0

Grazie, @DSM; questo è un po 'quello che sospettavo. Ti capita di sapere se esiste un equivalente Mac per modificare i file di Excel come puoi con win32api? Ci sono risposte come [questo] (http://stackoverflow.com/questions/5446761/for-windows-there-is-win32-api-what-about-for-mac), ma sarebbe bello sapere se vale anche la pena esplorare. – HaPsantran

+0

Si noti che 'xlwings' sta mettendo un wrapper su pywin32 su Windows e appscript su Mac per ottenere una soluzione completamente multipiattaforma, lavorando anche su alcune delle limitazioni di pywin32. –

8

Ho avuto una domanda simile per quanto riguarda l'interazione tra Excel e Python (in particolare, panda), e mi è stato fatto riferimento a questa domanda.

Grazie ad alcuni indicatori della community di stackoverflow, ho trovato un pacchetto chiamato xlwings che sembra coprire molte delle funzionalità richieste da HaPsantran.

per usare l'esempio del PO:

Lavorare con un file esistente Excel, è possibile eliminare un ancoraggio nel blocco di dati (Sheet3) che si desidera importare al panda nominando in Excel e fare:

# opened an existing excel file 

wb = Workbook(Existing_file)

# Find in the excel file a named cell and reach the boundary of the cell block (boundary defined by empty column/row) and read the cell 

df = Range(Anchor).table.value

# import pandas and manipulate the data block 
df = pd.DataFrame(df) # into Pandas DataFrame 
df['sum'] = df.sum(axis= 1) 

# write back to Sheet3 
Range(Anchor).value = df.values 

testati che questa implementazione non temperare formula esistente nel file excel

fatemi sapere se questo risolve il problema e se c'è qualcosa che posso aiutare.

Grandi complimenti allo sviluppatore di xlwings, hanno reso possibile tutto ciò.


Di seguito è un aggiornamento alla mia precedente risposta, dopo ulteriore domanda da @jamzsabb, e per riflettere un API cambiato dopo xlwings aggiornati per> = 0.9.0.

import xlwings as xw 
import pandas as pd 
target_df = xw.Range('A7').options(pd.DataFrame, expand='table').value # only do this if the 'A7' cell (the cell within area of interest) is in active worksheet 
#otherwise do: 
#sht = xw.Book(r'path to your xlxs file\name_of_file.xlsx`).sheets['name of sheet'] 
#target_df = sht.Range('A7').options(pd.DataFrame, expand='table').value # you can also change 'A7' to any name that you've given to a cell like 'interest_table` 
+0

Questo sembra molto promettente. Lo verificherò quando il tempo lo permetterà e tornerò a commentare dopo. Grazie per l'attenzione su xlwings. – HaPsantran

+0

Per un po 'di tempo mi sono messo a litigare e ho difficoltà a capirlo. Qual è l'oggetto di ancoraggio? È il nome del foglio nella cartella di lavoro? Quando viene dichiarato df, in che modo è collegato all'oggetto Workbook? Sono stato nella documentazione di xlwings e non ho visto nulla di utile per la modifica di un singolo foglio in un excel ovunque ..... – jamzsabb

+0

Scusa per non essere chiaro, Ancoraggio indica la cella nominata nel foglio di lavoro. Dovrebbe essere una stringa come "Hero".Ho solo pensato che potrebbe essere più facile nominare una cella e quindi accedervi rapidamente in python, invece di localizzarla tramite la colonna, le coordinate di riga. In questo modo la tua logica di business diventa più chiara. E la portata della mia risposta è più focalizzata sulla modifica di una particolare area su un foglio di calcolo specifico. – PaulDong

Problemi correlati