首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >通过Python导出Excel模块

通过Python导出Excel模块
EN

Stack Overflow用户
提问于 2018-03-01 16:06:35
回答 1查看 727关注 0票数 0

我正在尝试用Python从Excel表格中复制代码模块的导出。

以下内容在VBA中可用:

代码语言:javascript
复制
Public Sub ExportModules()
    Dim wb As Workbook
    Set wb = ThisWorkbook
    Dim D As String
    Dim N

    D = ThisWorkbook.Path
    For Each VBComp In wb.VBProject.VBComponents
        If (VBComp.Type = 1) Then
            N = D + "\" + VBComp.Name + ".txt"
            VBComp.Export N
        End If
    Next
End Sub

我在Python中有以下代码:

代码语言:javascript
复制
import os
import sys
import glob
from win32com.client import Dispatch

scripts_dir = 'folder address'

com_instance = Dispatch("Excel.Application")
com_instance.Visible = False
com_instance.DisplayAlerts = False

for script_file in glob.glob(os.path.join(scripts_dir, "*.xlsm")):
    print "Processing: %s" % script_file
    (file_path, file_name) = os.path.split(script_file)
    objworkbook = com_instance.Workbooks.Open(script_file)
    for xlmodule in objworkbook.VBProject.VBComponents:
        xlmodule.Export('export file name')

我的问题是,我必须在Python中做什么才能按照VBA代码复制文件的导出?

EN

回答 1

Stack Overflow用户

发布于 2018-07-29 07:15:18

使用默认的excel xltrails提供了从.xlsm或其他oletools文件中提取.bas文件的好方法

代码语言:javascript
复制
import os
import shutil
from oletools.olevba3 import VBA_Parser


EXCEL_FILE_EXTENSIONS = ('xlsb', 'xls', 'xlsm', 'xla', 'xlt', 'xlam',)


def parse(workbook_path):
    vba_path = workbook_path + '.vba'
    vba_parser = VBA_Parser(workbook_path)
    vba_modules = vba_parser.extract_all_macros() if vba_parser.detect_vba_macros() else []

    for _, _, _, content in vba_modules:
        decoded_content = content.decode('latin-1')
        lines = []
        if '\r\n' in decoded_content:
            lines = decoded_content.split('\r\n')
        else:
            lines = decoded_content.split('\n')
        if lines:
            name = lines[0].replace('Attribute VB_Name = ', '').strip('"')
            content = [line for line in lines[1:] if not (
                line.startswith('Attribute') and 'VB_' in line)]
            if content and content[-1] == '':
                content.pop(len(content)-1)
                lines_of_code = len(content)
                non_empty_lines_of_code = len([c for c in content if c])
                if non_empty_lines_of_code > 0:
                    if not os.path.exists(os.path.join(vba_path)):
                        os.makedirs(vba_path)
                    with open(os.path.join(vba_path, name + '.bas'), 'w') as f:
                        f.write('\n'.join(content))


if __name__ == '__main__':
    for root, dirs, files in os.walk('.'):
        for f in dirs:
            if f.endswith('.vba'):
                shutil.rmtree(os.path.join(root, f))

        for f in files:
            if f.endswith(EXCEL_FILE_EXTENSIONS):
                parse(os.path.join(root, f))

我试过了,效果很好。

参考:https://www.xltrail.com/blog/auto-export-vba-commit-hook

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49045184

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档