У меня есть таблица в файле Excel, который я храню. iCloud Drive для отслеживания расходов, и мне нужно использовать этот файл как в iOS, так и в MacOS.
До сих пор я использовал комбинацию ярлыка Apple, базового файла CSV и VBA для быстро ввести данные о расходах в Ярлыки, передать их в CSV, а затем периодически автоматически добавляю эти данные в файл Excel. (Это добавление в Excel происходит только тогда, когда я открываю файл на своем Mac, поскольку iOS Excel не поддерживает макросы.)
Теперь я хотел бы пропустить маршрут CSV и VBA и сделать это строго с помощью ярлыков и сценария Python, чтобы я мог обновлять файл Excel даже из iOS.
Я использую приложение A-Shell, чтобы облегчить выполнение сценария Python.
Я чувствую, что уже на 90 % добрался до финиша. line.
Однако, несмотря на различные изменения в моем скрипте (любезно предоставленные ChatGPT), я не могу придумать успешный скрипт
- Расширяет форматирование и формулы таблицы [которые обычно представляют собой структурированные ссылки] на вновь добавленную строку; и
- Не повреждает файл Excel при этом.
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}")
Заранее спасибо за помощь!
ОБНОВЛЕНИЕ: Чтобы прояснить проблему форматирования, я попробовал несколько подходов к расширению шрифтов и границ. , заливка, другое форматирование старой последней строки во вновь добавленную строку. Хотя кое-что из этого сработало, мне не удалось присвоить свойствам «new_cell.Fill» либо (1) свойства Fill старой ячейки (например, start_color, end_color); (2) PatternFill старых ячеек с использованием объекта Color и RGB; или (3) другие варианты этого.
Что касается формул в столбцах A и E:G, которые я хочу распространить на новую строку, все они в настоящее время основаны на структурированных ссылках и один из них вызывает имя пользовательской функции на основе LAMBDA. Самый простой столбец на основе формулы выглядит следующим образом:
=IF([@[My Net]]"",INDEX([Cum Bal],ROW()-2)+[@[My Net]],"")
Подробнее здесь: https://stackoverflow.com/questions/793 ... xcel-table
Мобильная версия