2017-09-03 146 views
-1

我有一個Excel工作表,包含不同的單位值,如「百」和「千」。如何用Python替換多個Excel表格中的單元格內容?

現在,我想所有的「千」改爲「百」,這意味着原單單元格的值將[單元]倍10

我用VBA解決了這個問題,我想知道如何使用Python解決這個問題?

VBA這樣的:

Sub changecell() 
Dim rng As Range 
Dim i, t 
Set rng = Sheet1.Range("b3:c5") 
For Each i In rng 
    t = t + 1 
    If Not i Is Nothing Then 
     If Right(i, 4) = "sand" Then 
     rng(t) = Left(i, Len(i) - 8) * 10 & "hundred" 
     End If 
    End If 
Next 
End Sub 

如何使用Python替換這些[細胞來自多Excel表? enter image description here

+0

你不能乘以字符串。你寫它的方式,你不能做任何數學或分析你的數據,而不做大量的分割字符串和轉換的工作....你在想什麼?????? – jsotola

+0

在Excel中,我可以在不分割字符串和轉換類型的情況下執行此操作。您可以嘗試。 –

+0

事實上,在我的vba中,我使用Left(i,Len(i) - 8),這個純粹的數字,它可以乘以 –

回答

2

保存您的Excel工作表以csv文件,那就試試這個:

import csv 


with open('path_name_to_new_file', 'w', newline='') as newfile: 
    with open('path_name_to_original_file', newline='') as original: 
     writer = csv.writer(newfile, delimiter=',') 
     reader = csv.reader(original, delimiter=',') 
     for row in reader: 
      row[1] = row[1] * 10 
      row[2] = row[2] * 10 
      writer.writerow(row) 

編輯:

所以,你有數以百計的Excel文件...而不是所有列。非測試代碼:

import pandas 

def test(cell): 
    t = str(cell).split(' ') 
    t = t[1] if len(t[1]) = 2 else None 
    if t == 'thousand': 
     return float(cell)*10 
    else: 
     return cell 

excel_file_names = [##make a list of your file names##] 
for file in excel_file_names: 
    df = pandas.read_excel(file) 
    for index,row in df.iterrows(): 
     row['2016'] = test(row['2016']) 
     row['2015'] = test(row['2015']) 

    writer = pd.ExcelWriter() 
    df.to_excel(writer,'Sheet1') 
    writer.save(file + '_modified') 
+0

我只有xls類型,轉換千張excel表格很難。我考慮使用熊貓。 –

+0

不是每一行,每個cloumn在表中都有「千」。只有一些單元格有'千' –

+0

使用這種方法,6列更改60列 –

1

如果您需要做的是在Python中使用熊貓

但這VBA將在當前工作簿中的所有表進行更換:


Option Explicit 

Public Sub GlobalReplaceThousandToHundred() 
    Dim ws As Worksheet, ur As Variant, r As Long, c As Long, sz As Long 

    Const STR1 = "thousand" 
    Const STR2 = "hundred" 

    sz = Len(STR1) 

    For Each ws In ThisWorkbook.Worksheets 
     ur = ws.UsedRange 
     For r = LBound(ur) To UBound(ur) 
      For c = LBound(ur, 2) To UBound(ur, 2) 
       If Not IsError(ur(r, c)) Then 
        If LCase(Right(ur(r, c), sz)) = STR1 Then 
         ur(r, c) = Left(ur(r, c), Len(ur(r, c)) - sz) & STR2 
        End If 
       End If 
      Next 
     Next 
     ws.UsedRange = ur 
    Next 
End Sub 

+0

如果單元格以'千',[單元格] * 10結尾;'千'不能取代'百' –

+0

@championCh查看更新回答 –

+0

謝謝您的幫助,這是一個好方法,但這裏有一千個文件,當我這樣做時,Excel打開,關閉,打開,關閉,打開,關閉........ 。我當時無法做其他事情,並且它會花費更多的時間..... –

相關問題