2017-09-03 118 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打开,关闭,打开,关闭,打开,关闭........ 。我当时无法做其他事情,并且它会花费更多的时间..... –

相关问题