乐趣区

python批量修改excel文件

python 批量修改 excel

早上突然接到小姐姐求助,如何用程序批量删除 excel 里面的图片,作为前端狗的我心里咯噔一下,毕竟这不是我专长。小姐姐说 python 应该可以,赶紧 google 一下。

学 python 从入门到放弃至今已经有 2 年多了吧,心里赶紧列了一个问题清单

问题清单以及后续找到的解决方案
  • 单个 excel 文件

** 读取

# 使用 xlrd 读取 excel 文件
wb = open_workbook(path + '/' + name)

** 获取每个工作表

# 获取当前文件的工作表(sheet)list
sheetList = wb.sheets()
...
for sheet in sheetList:
...

** 修改工作表

# 修改工作表使用的是 xlutils, 其实也可以用 xlwt,# 我没有用,原因:用资料上 demo,demo 使用的是这个,虽然 demo 没有跑通
from xlutils.copy import copy
...
wb = open_workbook(path + '/' + name)
...
# 复制原文件,因为原文件只能读取,不能写入数据,所以要复制得到一个可以写入数据的文件
newwb = copy(wb)
...
for row in sheet.get_rows():
    # 遍历每一行,当 8 列的值小于 12 时,就把该值改为 0
    if row[0].value < 12:
        newsheet.write(index, 0, 0)
...

** 保存

newwb.save('./data/' + name)
  • 文件下的 excel 文件

** 获取文件列表

import os


os.listdir(path)

嗯,功能如下:

全部代码如下:

# -*- coding: utf-8 -*-
from xlrd import open_workbook
from xlutils.copy import copy
import os


def editExl(path, name):
    if os.path.exists('/data'):
        os.removedirs("/data")
    # 括号里放入要读取的文件的绝对路径, 相对路径也可以 
    # os.getcwd() 返回当前.py 文件所在的绝对路径
    # print(os.getcwd(), 'lujing')
    wb = open_workbook(path + '/' + name)
    # 获取所读取文件的第一张表单
    # sheet = wb.sheet_by_index(0)
    # 获取该表单的行数
    # s = sheet.nrows


    # 获取当前文件的工作表(sheet)list
    sheetList = wb.sheets()
    # print('sheetList', sheetList)


    # 复制原文件,因为原文件只能读取,不能写入数据,所以要复制得到一个可以写入数据的文件
    newwb = copy(wb)
    sheetIndex = 0
    for sheet in sheetList:


        # 获取可写文件的第一张表单
        newsheet = newwb.get_sheet(sheetIndex)
        # print(newsheet, newsheet.get_rows())
        index = 0
        try:
            for row in sheet.get_rows():
                # 遍历每一行,当 8 列的值小于 12 时,就把该值改为 0
                # print(row)
                # print(row[0].value, '000000000000000')
                if row[0].value < 12:
                    # print('here', index)
                    newsheet.write(index, 0, 0)
                    # print('after here')
                index = index + 1
        except:
            print("aaa")
        sheetIndex = sheetIndex + 1


    mkdir('./data')
    newwb.save('./data/' + name)


def mkdir(path): 
    folder = os.path.exists(path)
    if not folder:
        os.makedirs(path)
        print('--- folder mk ---')
    else:
        print('--- folder exists ---')


def getFileList(path):
    return os.listdir(path)


def editAll():
    originPath = './origin'
    fileList = getFileList(originPath)
    # print(fileList)
    for fileItem in fileList:
        editExl(originPath, fileItem)
editAll()
缺陷:

只能修改单元格的内容,图片还没有办法读取,修改完成后,表格里面的图片都丢失了。但是也差不多满足小姐姐的需求了,一会有空让我家小哥哥过来优化。

运行方式
  • 把你需要修改的文件放到 origin 文件夹下,如果没有辛苦手动创建一下
  • 安装 python

看到我这篇文章的应该都是大佬,应该不用贴出来了,也可以看我 python 学习专栏中的其他文章
只提一点,如果是 windows, 安装完成之后,如果 cmd 下运行 python 提示

python 不是内部命令 XXXXXXX

之类的,那就找到 python 的安装目录,添加到环境变量中(还有 pip 的目录)
还是举个例子吧

pthon 安装目录:D:\software\Python27
pip 安装目录:D:\software\Python27\Scripts

点击确定 -> 重启 cmd -> cd excel_opt.py 所在的文件夹

真实过程

文章虽然是这样写,但是实际编程过程是这样的

  • 读取 excel 文件
  • 修改第一个工作表的数据
  • 保存 excel 文件
  • 读取文件夹下的所有 excel 文件
  • 遍历每个 excel 下的工作表并且修改
啰嗦时间

整个过程其实没有花很多时间,能够实现基本功能跟我之前从入门到放弃有着必然联系,虽然当时门也有入。所以说,多学点东西还是有用的,说不定哪天还真能用上。

不知道满不满足小姐姐需求,但是我今天确实没有时间去优化了,毕竟我还深陷在工作和带娃之中。

先记录一下,我抽空再对上面的一些知识点进行研究和补充。

退出移动版