pywin32 操作 Excel 的代码片段

将一个目录及其子目录下的每个工作簿合并在一起

下面的代码将一个目录及其子目录下所有的工作簿中的所有工作表放到一个新的工作簿中。

import win32com.client as win32client
import os

# 工作表名称不能包含如下不合法的字符
INVALID_TAB_NAME = (":", "\\","/", "?", "*", "[", "]")
# 列出一个目录下的所有文件(包括子目录)
LS = 'dir /s/b ' 
EXCEL = win32client.Dispatch('Excel.Application')
EXCEL.Visible = 1 # 使 Excel 可见。如果设置为 0 的话,则 Excel 不可见。不可见的话,执行起来更快,但是没有反馈,不刺激

def merge_workbooks(path,wb):
    """ 合并一个目录(包括其子目录)中所有的工作簿中的所有工作表到 wb 工作簿中
    """
    # 得到该目录及其子目录下所有的文件及文件夹
    files = [x.strip() for x in os.popen(LS+path).readlines()]
    tab_names = [] # 记录 wb 中的工作表名称,因为怕合并过来的工作表有重复的名称
    for f in files:
        print('正在处理', f)
        if os.path.isfile(f):
            if f.endswith('.xlsx') or f.endswith('.xls') or f.endswith('.xlsm'):  # 可以自行添加需要处理的 Excel 文件格式
                workbook = EXCEL.Workbooks.Open(f)
                for sh in workbook.Worksheets:
                    sh.Copy(None,wb.Worksheets(wb.Worksheets.Count))
                    # 工作表的名称不能大于 31 个字符,因此我为了简单,取复制过来的工作簿的名称+复制过来的工作表的前4个名称。这里可以自行调整
                    new_name = f"{f.split(os.sep)[-1].replace('.xlsx','').replace(' ','')}{sh.Name[:4]}"
                    for invalid in INVALID_TAB_NAME:
                        if invalid in new_name:
                            print(f'不合法的工作表名称:"{new_name}", 工作表名称不能包含 {INVALID_TAB_NAME}')
                            new_name = input('请输入合法的工作表名称:')
                    if not new_name:
                        print('工作表名称不能为空')
                        new_name = input('请输入合法的工作表名称:')
                    if len(new_name) > 31:
                        print(f'不合法的工作表名称:"{new_name}",工作表名称不能大于30个字符')
                        new_name = input('请输入合法的工作表名称:')
                    if new_name in tab_names:
                        print(f'"{new_name}"已经被使用,工作表名称不能重复')
                        new_name = input('请输入其他工作表名称:')
                    tab_names.append(new_name)
                    wb.Worksheets(wb.Worksheets.Count).Name = new_name
                workbook.Close(False)  # 关闭,不保存

def main():
    wb = EXCEL.Workbooks.Add()  # 创建新的工作表
    merge_workbooks(r'D:\成本',wb)
    wb.Save()
    wb.Close()

if __name__ == '__main__':
    main()

根据工作表中的某个值重命名工作簿

下面代码将当前文件夹下面的每个工作簿重命名为其工作表 Sheet1 中 A1 单元格的值,另存储在 C 盘 Documes 文件夹下。

import win32com.client as win32
import os

ls = 'dir /s/b ' 
excel = win32.Dispatch("Excel.Application")
excel.DisplayAlerts = False

files = [x.strip() for x in os.popen(ls).readlines()]
for f in files:
    if f.endswith('.xls'):
        wb = excel.Workbooks.Open(f)
        ws = wb.Sheets('Sheet1')
        name = ws.Range('A1').Value
        name = name.strip()
        wb.SaveAs(r'C:\Documents\%s' % name)
        wb.Close(False)
excel.quit()

批量转换 doc 文件为 docx 文件

import win32com.client as client
import os

files_dir = r'C:\Users\Administrator\Desktop\Files'

os.chdir(files_dir)
files = os.listdir()
word = client.Dispatch("Word.Application")
for f in files:
    if os.path.isfile(f):
        try:
            doc = word.Documents.Open(files_dir + '/' + f)
            doc.SaveAs2(f[:-4] + ".docx", 12)
            doc.Close()
        except:
            print("打开文件失败", f)
print()
  
word.Quit()

你可能感兴趣的:(excel-vba,pywin32,excel,vba,python)