由于您的CSV导入到电子表格可以使用Excel VBA宏使用QueryTables考虑有Python的复制VBA与COM接口,Excel对象库来处理。之前的所有宏代码保持不变,因为没有被覆盖,但是单元数据。 注意:下面假定您正在使用Excel for Windows。
使用win32com
库,Python几乎可以复制VBA所做的任何事情。事实上,您将会知道VBA是Office应用程序中的附加参考,并且绝不会是本机内置对象,并且会执行相同的COM接口!在您的IDE中查看Tools\References
中的第一个选定项目。
import pandas as pd
import win32com.client as win32
# ...same pandas code...
macrofile = "C:\\Path\\To\\Macro\\Workbook.xlsm"
strfile = "C:\\Path\\To\\CSV\\Output.csv"
df.to_csv(strfile)
try:
xl = win32.gencache.EnsureDispatch('Excel.Application')
wb = xl.Workbooks.Open(macrofile)
# DELETE PREVIOUS DATA
wb.Sheets("Source").Range("B:Q").EntireColumn.Delete()
# ADD QUERYTABLE (SPECIFYING DESTINATION CELL START)
qt = wb.Sheets("Source").QueryTables.Add(Connection="TEXT;" + strfile,
Destination=wb.Sheets(1).Cells(2, 2))
qt.TextFileParseType = 1
qt.TextFileConsecutiveDelimiter = False
qt.TextFileTabDelimiter = False
qt.TextFileSemicolonDelimiter = False
qt.TextFileCommaDelimiter = True
qt.TextFileSpaceDelimiter = False
qt.Refresh(BackgroundQuery=False)
# REMOVE QUERYTABLE
for qt in wb.Sheets("Source").QueryTables:
qt.Delete()
# CLOSES WORKBOOK AND SAVES CHANGES
wb.Close(True)
except Exception as e:
print(e)
finally:
qt = None
wb = None
xl = None
可替代地,创建在VBA一个新的宏(置于一个独立的模块中),并且具有的Python调用它,传递csv文件路径作为参数:
VBA
Public Sub ImportCSV(strfile As String)
Dim qt As QueryTable
ThisWorkbook.Sheets("Source").Range("B:Q").EntireColumn.Delete
' ADD QUERYTABLE
With ThisWorkbook.Sheets("Source").QueryTables.Add(Connection:="TEXT;" & strfile, _
Destination:=ThisWorkbook.Sheets(1).Cells(2, 2))
.TextFileParseType = xlDelimited
.TextFileConsecutiveDelimiter = False
.TextFileTabDelimiter = False
.TextFileSemicolonDelimiter = False
.TextFileCommaDelimiter = True
.TextFileSpaceDelimiter = False
.Refresh BackgroundQuery:=False
End With
' REMOVE QUERYTABLE
For Each qt In ThisWorkbook.Sheets(1).QueryTables
qt.Delete
Next qt
Set qt = Nothing
End Sub
Python
import pandas as pd
import win32com.client as win32
# ...same pandas code...
macrofile = "C:\\Path\\To\\Macro\\Workbook.xlsm"
strfile = "C:\\Path\\To\\CSV\\Output.csv"
df.to_csv(strfile)
try:
xl = win32.gencache.EnsureDispatch('Excel.Application')
wb = xl.Workbooks.Open(macrofile)
xl.Application.Run('ImportCSV', strfile)
wb.Close(True)
xl.Quit
except Exception as e:
print(e)
finally:
wb = None
xl = None
开始录制宏,而这样做你列出的操作。然后拿出它的结果代码并进行处理。 – user3598756
基本上,我从你的问题中了解到,你想在数据框中将列B中的值替换为Q? 如果是这种情况,那么您可以使用'df.drop()'并通过'df [] = ' –
@ user3598756添加新列谢谢您的评论。但是,我不是一个非常精明的人,所以我不完全理解你的建议。似乎您建议手动处理复制和粘贴数据。虽然我试图自动化我的编译工作。尽管如此,谢谢你的建议! – arnold