| upsert_xlsx_sheet |
function |
py |
infra |
1.0.0 |
impure |
def upsert_xlsx_sheet(xlsx_path: str, sheet_name: str, records: list[dict], columns: list[str], key_col: str = "", preserve_cols: list[str] | None = None, formulas: dict | None = None, backup: bool = True, freeze: str = "A2", autofilter: bool = True) -> dict |
Actualiza de forma NO DESTRUCTIVA una hoja concreta de un archivo .xlsx con openpyxl. Reescribe SOLO la hoja indicada (sheet_name) y conserva intactas las demas hojas del libro. Antes de limpiar la hoja gestionada lee, por una columna clave (key_col), los valores de las columnas de trabajo manual (preserve_cols) y los reescribe ganando sobre los datos nuevos. Cabecera estilizada (negrita, relleno, texto blanco, borde, centrado), freeze_panes, autofilter, auto-ancho de columnas, formulas por columna con placeholders {row} y {NombreColumna}, y backup .bak opcional. Devuelve un resumen con filas escritas, hojas conservadas y celdas manuales preservadas. |
| xlsx |
| openpyxl |
| spreadsheet |
| office |
| onlyoffice |
| infra |
|
|
|
|
false |
error_go_core |
|
| name |
desc |
| xlsx_path |
Ruta del archivo .xlsx. Si existe se abre con openpyxl (y se respaldan las demas hojas); si no existe se crea un libro nuevo eliminando la hoja por defecto vacia. |
|
| name |
desc |
| sheet_name |
Nombre de la hoja a (re)escribir. Es la UNICA hoja que la funcion toca; el resto del libro queda intacto. Si la hoja no existe, se crea. |
|
| name |
desc |
| records |
Lista de dicts; cada dict es una fila y sus claves son nombres de columna. Se escribe una fila por record en el orden definido por columns. |
|
| name |
desc |
| columns |
Orden canonico de columnas (nombres de cabecera). Define que columnas se escriben y en que orden. Una clave de un record que no este en columns se ignora. |
|
| name |
desc |
| key_col |
Nombre de la columna clave usada para emparejar filas existentes con records al preservar trabajo manual. Vacio (default) desactiva la preservacion. El match normaliza el valor (lowercase + espacios colapsados). |
|
| name |
desc |
| preserve_cols |
Lista de columnas cuyos valores manuales existentes en el libro se conservan: si una celda ya tenia valor para esa clave, ese valor gana sobre el de records. None o lista vacia desactiva la preservacion. |
|
| name |
desc |
| formulas |
Dict opcional {columna: "plantilla"} o {columna: {"f": plantilla, "fmt": formato_numerico}}. La plantilla admite {row} (numero de fila actual) y {NombreColumna} (letra de la columna con ese nombre). Estas columnas se escriben como formula en cada fila y NO se rellenan desde records. |
|
| name |
desc |
| backup |
Si True y el archivo existe, copia a xlsx_path + '.bak' antes de escribir. El .bak es rotativo: cada llamada lo sobrescribe. Default True. |
|
| name |
desc |
| freeze |
Celda para freeze_panes (inmoviliza filas/columnas por encima/izquierda). Default 'A2' (congela la cabecera). |
|
| name |
desc |
| autofilter |
Si True activa auto_filter sobre el rango A1 hasta la ultima columna y fila de datos. Default True. |
|
|
Dict con: sheet (nombre de la hoja escrita), rows_written (numero de filas de datos), other_sheets_preserved (lista con los nombres de las demas hojas conservadas), manual_cells_preserved (cuantas celdas de trabajo manual se conservaron) y backup_path (ruta del .bak creado, o cadena vacia si no hubo backup). |
true |
| test_no_destructivo_y_preserva_trabajo_manual |
| test_crea_libro_nuevo_si_no_existe |
|
python/functions/infra/upsert_xlsx_sheet_test.py |
python/functions/infra/upsert_xlsx_sheet.py |