Excelとxlwingsを使用しています。book.xlsm があります。最初のシートには、次の vba コードに割り当てられたボタンがあります。
book.xlsm!ThisWorkbook.get_data
VBA にこれを追加しました。これは、ボタンが呼び出されて vba コードが実行されると実行されます。
Sub get_data()
RunPython ("import my_script; my_script.get_data()")
End Sub
my_script は次のとおりです。
import pandas as pd
from xlwings import Workbook, Range
def get_data():
wb = Workbook.caller()
df = pd.read_csv("data.csv")
Range("Sheet2", "A1").value = df
私が遭遇する問題は次のとおりです。
pywintypes.com_error: (-2147024882, 'Not enough storage is available to complete this operation.', None, None)
data.csv ファイルには、150000 行と 120 行があります。より少ないデータを使用して、エラーなしで実行されます。
更新:現在、解決策はありませんが、コメントで提供されている回避策があります: https://github.com/ZoomerAnalytics/xlwings/issues/77
私は以下を使用します:
df = pd.read_csv(csv_file, na_values={"", " ", "-"})
df.fillna("-", inplace=True)
startcell = 'A1'
chunk_size = 2500
if len(df) <= (chunk_size + 1):
Range(sheet_name, startcell, index=False).value = df
else: # chunk df and and dump each (default is 10k)\n",
c = re.match(r"([a-z]+)([0-9]+)", startcell, re.I)
cL = c.group(1)
cN = int(c.group(2))
n = 0
for i in (df[rw:rw + chunk_size] for rw in xrange(0, len(df), chunk_size)):
if n == 0:
Range(sheet_name, cL + str(cN+n), index=False).value = i
cN += chunk_size
else:
Range(sheet_name, cL + str(cN+n)).value = i.values
cN += chunk_size
n += 1
私が遭遇した問題は、シートにデータを挿入すると、5002 に空の行があり、7503、10004 に再びあるということです.... コードに間違いがあることに気付きましたが、見つかりません。