Ich habe eine Tabelle in einer Excel-Datei, die ich behalte iCloud Drive zum Verfolgen von Ausgaben, und ich muss diese Datei sowohl in iOS als auch in MacOS verwenden.
Bisher habe ich dazu die Kombination aus einer Apple-Verknüpfung, einer zugrunde liegenden CSV-Datei und VBA verwendet Spesendaten schnell in Verknüpfungen eingeben, an die CSV übergeben, und diese Daten dann regelmäßig automatisch an meine Excel-Datei anhängen. (Dieses Anhängen in Excel geschieht nur, wenn ich die Datei auf meinem Mac öffne, da iOS Excel keine Makros unterstützt.)
Jetzt möchte ich die CSV- und VBA-Route überspringen und dies tun Ausschließlich mit Verknüpfungen und einem Python-Skript, damit ich die Excel-Datei auch von iOS aus aktualisieren kann.
Ich verwende die A-Shell-App, um die Ausführung des Python-Skripts zu erleichtern.
Ich habe das Gefühl, dass ich zu 90 % damit einverstanden bin Ziellinie.
Allerdings kann ich trotz verschiedener Optimierungen an meinem Skript (mit freundlicher Genehmigung von ChatGPT) kein Skript erstellen, das erfolgreich ist
- < li>Erweitert die Formatierung und Formeln der Tabelle [bei denen es sich im Allgemeinen um strukturierte Verweise handelt] auf die neu hinzugefügte Zeile; und
- Die Excel-Datei wird dabei nicht beschädigt.
Code: Select all
from openpyxl import load_workbook
from openpyxl.utils import get_column_letter
import sys
# Get input data from command-line arguments
input_data = sys.argv[1:] # Example: ["Value1", "Value2", "Value3"]
# Ensure there are exactly three inputs
if len(input_data) != 3:
print("Error: Please provide exactly three input values.")
sys.exit(1)
# Define the full path to your Excel file
excel_file = "/path_to_my_file/dummy.xlsx"
try:
# Load the workbook and worksheet
wb = load_workbook(excel_file)
ws = wb['Expenses']
# Identify the table range
table_name = 'tbl_expenses'
if table_name not in ws.tables:
print(f"Table '{table_name}' not found in worksheet.")
sys.exit(1)
table = ws.tables[table_name]
start_cell, end_cell = table.ref.split(':')
start_row = ws[start_cell].row
end_row = ws[end_cell].row
end_col = ws[end_cell].column
# Determine the next row index
new_row_idx = end_row + 1
# Insert data starting from the second column (Column B)
for col_index, value in enumerate(input_data, start=2): # Start at column B
ws.cell(row=new_row_idx, column=col_index, value=value)
# Extend structured reference formulas for remaining columns
for col in range(1, end_col + 1):
source_cell = ws.cell(row=end_row, column=col)
target_cell = ws.cell(row=new_row_idx, column=col)
if source_cell.data_type == 'f': # If it's a formula
target_cell.value = source_cell.value
# Update the table's range manually
from openpyxl.utils import get_column_letter
new_end_cell = f"{get_column_letter(end_col)}{new_row_idx}"
table.ref = f"{start_cell}:{new_end_cell}"
# Save the workbook
wb.save(excel_file)
print("Row added successfully with extended structured reference formulas.")
except Exception as e:
print(f"An unexpected error occurred: {e}")
UPDATE: Um das Formatierungsproblem zu klären, habe ich einige Ansätze zur Erweiterung der Schriftarten und Rahmen ausprobiert , Füllen, andere Formatierung der alten letzten Zeile zur neu hinzugefügten Zeile. Während einiges davon funktionierte, scheiterte ich beim Versuch, die „new_cell.Fill“-Eigenschaften mit entweder (1) den Fill-Eigenschaften der alten Zelle (z. B. start_color, end_color); (2) das PatternFill der alten Zellen unter Verwendung des Farbobjekts & RGB; oder (3) andere Varianten davon.
Die Formeln in den Spalten A und E:G, die ich auf die neue Zeile erweitern möchte, basieren derzeit alle auf strukturierten Referenzen und Einer von ihnen ruft einen benutzerdefinierten Funktionsnamen auf, der auf LAMBDA basiert. Die einfachste formelbasierte Spalte sieht hier wie folgt aus:
Code: Select all
=IF([@[My Net]]"",INDEX([Cum Bal],ROW()-2)+[@[My Net]],"")