2016-04-19 24 views
-1

私はここにpythonでいくつかのコードを用意しています。これはopenpyxlを使って.xlsxファイルを作成しました。Python既存の.xlsxファイルのデータを変更します。

ただし、ファイルを変更しようとすると、新しいデータはファイルに登録されますが、以前のデータはなくなります。私はdeepcopyや(.copy.copy)を使ってファイルのデータをコピーすることを聞いたことがありますが、コピーしたデータと現在の編集内容を.xlsxファイルに貼り付けるにはどうしたらいいですか?

(それはGUIを持つプログラムであるとして、いくつかのコードはここに欠けている*、コードはjuzあまりにも長いです)

##############creating###################### 

try: 
    wb_ID = load_workbook('list.xlsx') 
    ws_ID = wb_ID.active 
    pass 

except EnvironmentError as e:  # OSError or IOError... As FileNotFoundError only exist in Python 3.x version 
    print(os.strerror(e.errno)) #use operating system error to define FileNotFoundErrorError 
    from openpyxl import Workbook #import Workbook function to create new xlsx (excel) file 
    wb_ID = Workbook() 
    ws_ID = wb_ID.active 
    ws_ID['A1'] = "IC" 
    ws_ID.merge_cells('B1:E1') 
    ws_ID['B1'] = "Name" 
    ws_ID.merge_cells('F1:K1') 
    ws_ID['L1'] = "Email" 
    ws_ID['M1'] = "Height" 
    ws_ID['N1'] = "Gender" 
    ws_ID['K1'] = "Bloodtype" 
    ws_ID.merge_cells('O1:Q1') 
    ws_ID['O1'] = "Default Consultation Day" 
    ws_ID.merge_cells('R1:T1') 
    ws_ID['R1'] = "Latest Appoinment" 
    wb_ID.save("list.xlsx") 
    pass 
############editing######################### 
wb = load_workbook(filename='list.xlsx') 
ws = wb.active 
last_row = 1 
while True: 
    last_row += 1 
    cellchecker =ws['A'+str(last_row)].value #get the value of the cell 
    print(cellchecker) 
    print last_row 
    if cellchecker is None: #check if cell is empty-->then this row number is the new row 
     wb.save('list.xlsx') 
     break 
    else: 
     continue 

print(str(last_row)) #convert to string var before passing the var for worksheet function 
from openpyxl import Workbook 
wb = Workbook() 
ws = wb.active 
ws['A'+str(last_row)] = (str(entry_IC.get().strip(' '))) 
ws.merge_cells('B'+str(last_row)+':E'+str(last_row)) 
ws['B'+str(last_row)] = (str(entry_Name.get())) 
ws.merge_cells('F'+str(last_row)+':K'+str(last_row)) 
ws['F'+str(last_row)] = (str(entry_email.get().strip(' '))) 
ws['L'+str(last_row)] = (str(entry_Height.get().strip(' '))) 
ws['M'+str(last_row)] = gender_selected 
ws['N'+str(last_row)] = bloodtype_selected 
ws.merge_cells('O'+str(last_row)+':Q'+str(last_row)) 
ws['O'+str(last_row)] = str(default_selected_day) 
ws.merge_cells('R'+str(last_row)+':T'+str(last_row)) 
today = datetime.date.today() #as u might wonder why i redeclare this var since it already exist, but this is local var for this function only 
ws['T'+str(last_row)] = (str(today)) 

wb.save('list.xlsx') 

はopenpyxl文書で警告して編集部には、既存のデータを上書きしますことに気づきました。私は本当に既存の.xlsxファイルを変更する方法を見つけることができませんでした。私を助けてください、私はここで立ち往生しています。

+0

私は問題が何かを理解していません。openpyxlは既存のファイルを編集することができます。これには上書きデータが含まれます。さらに、コードが不必要に冗長になります。 –

+0

上記のコードは、新しいデータが保存されている間に元のデータが失われてしまう@CharlieClark –

+0

どこのデータが失われていますか?意図的に "list.xlsx"というファイルを完全に新しいブックに置き換えています。 –

答えて

0

私はこの問題を数回実行してしまい、純粋なpythonを使用して解決できませんでした。ただし、次のコードを使用して、既存のExcelファイルを変更するために使用できるPythonスクリプトからVBAマクロを呼び出すことができます。

これにより、データ処理や集計にPythonが必要な場合でも、Excelファイルを実際に開いてファイルを更新する必要がなくなり、作業を合理化するという創造的な方法が思い浮かびました。

# run excel macro from python 
import win32com.client 
fn = '//path/filename.xlsm' 
xl=win32com.client.Dispatch("Excel.Application") 
xl.Application.Visible = True 
xl.Workbooks.Open(Filename = fn,ReadOnly = 1) 
xl.Application.Run("macroname") 
xl=0 
+0

xlsxファイルを更新する方法の例を教えていただけますか?ダミーファイルを変形しますか?どうかありがとうございます@ネイサンクレメント –

+0

@HashashihnAltheim本当にあなたがしたいことにかかっています。通常、私は変更したいマスターの.xlsmから始めます。これは通常、チャート、条件付き書式設定、およびデータ検証を束ねているため、Pythonで変更するのは困難です。新しいデータをPythonで既知の場所にエクスポートし、次にPythonを使用して、マスターの.xlsmでマクロを呼び出して、エクスポートをマスタースプレッドシートにコピーします。 –

関連する問題