【问题标题】:How to replace [cell] content from multi excel sheets with Python?如何用 Python 替换多个 excel 工作表中的 [cell] 内容?
【发布时间】:2018-02-11 16:21:32
【问题描述】:

我有一个 Excel 表格,包含不同的单位值,例如“百”和“千”。

现在,我想将所有“千”改为“百”,这意味着原始单元格值将 [cell] 乘以 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 表中替换这些 [单元格]?

【问题讨论】:

  • 您不能将字符串相乘。按照您编写的方式,如果不进行大量拆分字符串和转换的工作,您将无法对数据进行任何数学计算或分析....您在想什么??????
  • 在excel中,不用拆分字符串和转换类型也可以做到。你可以试试。
  • 其实在我的vba中,我用的是Left(i, Len(i) - 8),这个纯数字,可以相乘
  • 愚蠢的我......我知道得更好,但我实际上检查过......浪费了我的时间......不,你不能像你所拥有的那样直接对单元格内容进行数学运算
  • 再次......你在想什么????您必须求助于提取子字符串。 .....为什么不在B和C之间插入一列并将“百”放入该列

标签: python excel vba pandas


【解决方案1】:

如果您需要在 Python 中执行此操作,请使用 pandas

但此 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

【讨论】:

  • 如果单元格以'千'结尾,[单元格]*10;不要用'千'替换'百'
  • 感谢您的帮助,这是一个好方法,但是这里有数千个文件,当我这样做时,Excel,打开,关闭,打开,关闭,打开,关闭...... .....当时我不能做其他事情。而且它会花费更多的时间......
  • 我上传文件,链接在这里:drive.google.com/file/d/0B0a6sHIFDtZeQnlMa0xnWk90cFk/…
【解决方案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')

【讨论】:

  • 我只有xls类型,转换数千张excel表格很难。我考虑使用熊猫。
  • 不是每一行,每一行在工作表中都有“千”。只有一些单元格有“千”
  • 用这个方法,6列改60列
  • 感谢您的帮助。这是很好的方法。但是当我这样做时,我发现问题比我想象的要难。首先,第一行是空白的;其次,列的名称是 nums。当我这样做时,它会出现:df =pd.read_excel('00.xls') _locate_stream(Workbook): seen
  • 所以我上传了原始文件和结束文件,链接在这里:drive.google.com/file/d/0B0a6sHIFDtZeQnlMa0xnWk90cFk/…
猜你喜欢
  • 1970-01-01
  • 2016-02-18
  • 2018-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-30
  • 1970-01-01
相关资源
最近更新 更多