我正在尝试将某些.csv文档转换为.xlsx。我用下面显示的VBA代码执行此操作,并且工作正常,但我想将文件文件夹的路径定义为python中的变量并链接到VBA。
Sub CSVtoXLSX()
Dim CSVfolder As String, _
XlsFolder As String, _
fname As String, _
wBook As Workbook
CSVfolder = "pathcsv"
XlsFolder = "pathxlsx"
fname = Dir(CSVfolder & "*.csv")
Do While fname <> ""
Set wBook = Workbooks.Open(CSVfolder & fname)
wBook.SaveAs XlsFolder & Replace(fname, ".csv", ""), xlOpenXMLWorkbook
wBook.Close False
fname = Dir
Loop
End Sub
而且在使用Win32插件从python运行时,它也可以正常运行。当我尝试定义变量并将其传递给VBA时,就会出现问题。
python代码:
import win32com.client
CSVfolder = "csvpath"
XlsFolder = "xlsxpath"
xl=win32com.client.Dispatch("Excel.Application")
xl.Workbooks.Open(Filename = r"macro.xlsm", ReadOnly=1)
xl.Application.Run('CSVtoXLSX', CSVfolder, XlsFolder)
## xl.Application.Save() # if you want to save then uncomment this line and change delete the ", ReadOnly=1" part from the open function.
xl.Application.Quit() # Comment this out if your excel script closes
del xl
我发现this线程几乎有相同的问题,但出现错误:
Traceback (most recent call last):
File "C:/Users/.../PycharmProjects/untitled6/exc.py", line 7, in <module>
xl.Application.Run('CSVtoXLSX', CSVfolder, XLsFolder)
File "C:\Users\...\AppData\Local\Temp\gen_py\3.8\00020813-0000-0000-C000-000000000046x0x1x9\_Application.py", line 370, in Run
return self._ApplyTypes_(259, 1, (12, 0), ((12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17), (12, 17)), 'Run', None,Macro
File "C:\Users\...\AppData\Local\Programs\Python\Python38\lib\site-packages\win32com\client\__init__.py", line 467, in _ApplyTypes_
self._oleobj_.InvokeTypes(dispid, 0, wFlags, retType, argTypes, *args),
pywintypes.com_error: (-2147352567, 'Exception occurred.', (0, None, None, None, 0, -2147352562), None)
我在做什么错?
您可能需要更改vba函数,以接受CSVfolder和Xlsfolder的参数以及在函数主体中指定的默认值。
Sub CSVtoXLSX (Optional CSVfolder As String = "csvpath", Optional Xlsfolder As String = "xlspath")
但是,如果您需要做的只是将csv转换为xlsx,在python中有一种简单的方法。
from pathlib import Path
import pandas as pd
CSVfolder = Path("pathcsv")
XlsFolder = Path("pathxlsx")
for f in CSVfolder.glob("*.csv"):
df = pd.read_csv(f)
xlsfn = XlsFolder / f.with_suffix('.xlsx').name
df.to_excel(xlsfn, index=False)