【问题标题】:Can excel CSV files be injected with macros?excel CSV文件可以注入宏吗?
【发布时间】:2018-08-06 18:49:10
【问题描述】:

我正在尝试使用自动适应 excel 中列宽的宏注入我的 csv 文件,但没有任何反应。我正在使用上一篇文章中的代码 (Use Python to Inject Macros into Spreadsheets)。但是这里是代码

import os
import sys

# Import System libraries
import glob
import random
import re

#sys.coinit_flags = 0 # comtypes.COINIT_MULTITHREADED

# USE COMTYPES OR WIN32COM
#import comtypes
#from comtypes.client import CreateObject

# USE COMTYPES OR WIN32COM
import win32com
from win32com.client import Dispatch

desktop = os.path.join(os.path.join(os.environ['USERPROFILE']), 'Desktop')
x = r'C:\This\is\the\path'
scripts_dir = x
conv_scripts_dir = x
strcode = \
'''
sub test()
        Column.Autofit
end sub
'''

#com_instance = CreateObject("Excel.Application", dynamic = True) # USING COMTYPES
com_instance = Dispatch("Excel.Application") # USING WIN32COM
com_instance.Visible = True#False
com_instance.DisplayAlerts = True#False 


for script_file in glob.glob(os.path.join(scripts_dir, '*.csv')):
    print("Processing: %s" % scr    ipt_file)
    # do the operation in background without actually opening Excel
    (file_path, file_name) = os.path.split(script_file)
    objworkbook = com_instance.Workbooks.Open(script_file)
    xlmodule = objworkbook.VBProject.VBComponents.Add(1)
    xlmodule.CodeModule.AddFromString(strcode.strip())
    objworkbook.SaveAs(os.path.join(conv_scripts_dir, file_name))

com_instance.Quit()

这段代码实际上是在excel中打开一个文件,执行一个宏,然后关闭excel窗口。为什么宏在 python 命令行中不起作用,但在 excel 中起作用?

【问题讨论】:

  • 'csv' 表示逗号分隔值。 csv 文件中没有“列宽”之类的东西 - 因为没有“列”,所以只有一个用逗号分隔的值列表。当您使用 Excel 打开 csv 文件时,它会为您解析数据并创建一个包含列的表,但它不是 csv 文件的属性,而是 Excel 文件的属性。如果要自动调整列,应该在 Excel 中进行,然后将拟合的表格保存为 xlsx 文件,而不是 csv 文件。
  • 您是否尝试将SaveAs 作为 Excel 文件? (.xls/.xlsx/.xlsm)。如果是这样,我没有看到指定的文件类型,也许这是你的问题。 (抱歉,我不懂 Python,所以不能确定)。 (如果不是,正如其他人所暗示的那样,那么列宽将不会保留在 .csv 文件中)。另一种可能性:Excel 安全是否会阻止您的代码注入?
  • 另外,我没有看到可以运行注入的 Sub 的 Python 代码。
  • @RADO 我有 300 个这样的文件,我需要每天更新它们;我不是每天都打开 300 个文件并更改它们的格式。我需要使用自动化所有脏工作的进程来注入我的文件。
  • @chrisneilsen for 块包含将 vba 代码注入 VBA 编辑器的代码。要注入的代码是strcode变量。

标签: python python-3.x excel csv


【解决方案1】:

没错。 CSV 中没有任何格式。这就像尝试向文本文件添加格式。你不能那样做。您可以将 CSV 文件转换为 XLSM 文件(Excel 宏)或 XLSB(二进制)。

Sub CSVtoXLSB2()
    Dim wb As Workbook
    Dim CSVPath As String
    Dim sProcessFile As String

    CSVPath = "C:\your_path_here\"
    sProcessFile = Dir(CSVPath & "*.csv")
    Do Until sProcessFile = ""   ' Loop until no file found.
        Set wb = Application.Workbooks.Open(CSVPath & sProcessFile)
        wb.SaveAs CSVPath & Split(wb.Name, ".")(0) & ".xlsb", FileFormat _
            :=50, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, _
            CreateBackup:=False
        wb.Close
        sProcessFile = Dir()   ' Get next entry.
    Loop
    Set wb = Nothing
End Sub

现在,如果您想将模块从一个工作簿复制到另一个工作簿,请按照下列步骤操作:

  • 将模块从一个工作簿复制到另一个工作簿
  • 打开包含要复制的宏的工作簿和要复制到的工作簿。
  • 在“开发人员”选项卡上,单击 Visual Basic 以打开 Visual Basic 编辑器。
  • 在 Visual Basic 编辑器的“查看”菜单上,单击“项目资源管理器”项目资源管理器按钮图像,或按 CTRL+R
  • 在“项目资源管理器”窗格中,将包含要复制的宏的模块拖动到目标工作簿。在这种情况下,我们将 Module1Book2.xlsm 复制到 Book1.xlsm

  • VBA 项目浏览器

  • Module1 复制自 Book2.xlsm
  • 复制Module1 复制到Book1.xlsm

【讨论】:

  • 这不能回答问题。 OPs 概念应该起作用 - 打开一个 Excel 实例,打开一个文件(恰好是一个 csv,但这没关系),向其中注入一些 vba 代码,运行该 vba(尽管可能缺少该位),另存为文件(如果不是另存为 Excel 文件,它可能会崩溃)
猜你喜欢
  • 2016-12-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2013-01-16
  • 1970-01-01
相关资源
最近更新 更多