Es ist zu nisch, aber ich werde die Probleme beim Erstellen einer Excel-Instanz mit xlwings und deren Lösung vorstellen.
Überprüfen Sie unten.
Verwenden Sie zum Erstellen einer Excel-Instanz mit xlwings "xw.apps.add ()" oder "xw.App ()". Diese Methode weist jedoch die folgenden Probleme auf.
Wenn Sie nur Excel öffnen, ohne die Arbeitsmappe zu öffnen (starten Sie sie über das Startmenü), wird das Add-In normal geladen.
Erstellen Sie eine Excel-Instanz aus der Shell und übergeben Sie sie an xlwings, ohne "xw.apps.add ()" oder "xw.App ()" zu verwenden.
import re
import subprocess
import time
from pathlib import Path
import xlwings as xw
def get_xl_path() -> Path:
#Eine Funktion, die den Excel-Installationspfad zurückgibt
subprocess_rtn = (
subprocess
.run(['assoc','.xlsx'], shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
.stdout.decode("utf8")
)
assoc_to = re.search('Excel.Sheet.[0-9]+', subprocess_rtn).group()
subprocess_rtn = (
subprocess
.run(['ftype', assoc_to], shell=True, stdout = subprocess.PIPE, stderr = subprocess.PIPE)
.stdout.decode('utf-8')
)
xl_path = re.search('C:.*EXCEL.EXE', subprocess_rtn).group()
return Path(xl_path)
def xw_apps_add_fixed() -> xw.App:
#Funktion zum Generieren einer Excel-Instanz
xl_path = get_xl_path()
num = xw.apps.count
pid = subprocess.Popen([str(xl_path),'/e']).pid
#Warten Sie, bis es von xlwings erkannt wird
while xw.apps.count == num:
time.sleep(1)
#Warten Sie, bis es bei xlwings verfügbar ist
while True:
try:
xw.apps[pid].activate()
break
except:
time.sleep(1)
return xw.apps[pid]
app = xw_apps_add_fixed()
Recommended Posts