3

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 に再びあるということです.... コードに間違いがあることに気付きましたが、見つかりません。

4

3 に答える 3