You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Fixed height issues with more than 200 rows. Added GEMINI.md. Added envwrap dependency. Added more ColorsNamed (#203)
* Improved colums height issue, ✦ He corregido la lógica para que sea limpia y segura:
1. Explicación: El problema es que Calc calcula las alturas óptimas basándose en el ancho de columna actual. Si insertamos datos y luego ensanchamos la
columna, Calc no siempre reduce la altura de la fila automáticamente si ya estaba marcada como OptimalHeight. Al hacer un toggle (False y luego True),
obligamos a Calc a mirar el nuevo ancho.
2. Corrección: He eliminado la llamada que contaminaba la memoria. Ahora el proceso en setColumnsWidth es:
* Poner todas las filas a OptimalHeight = False temporalmente para limpiar cualquier cálculo erróneo.
* Llamar a _set_rows_optimal_height(..., False) para restaurar la altura predeterminada en las filas que no deben tener ajuste de texto.
* Iterar por bloques sobre las filas que sí están en nuestra memoria (_wrapped_rows) para volver a ponerlas en OptimalHeight = True. Esto fuerza el
recálculo correcto sobre el nuevo ancho de columna sin añadir nada nuevo a la memoria.
He verificado que esto mantiene las alturas en 452 cuando el texto cabe en una sola línea tras el ajuste de columnas, y que no afecta a las filas que el
usuario quiera mantener sin ajuste.
* ✦ He optimizado la función para que no haya impacto apreciable en el rendimiento:
1. Iteración inteligente: En lugar de recorrer cada una de las (potencialmente) millones de filas de una hoja de Calc, ahora solo procesamos la lista de
filas que sabemos que tienen ajuste de texto activado (_wrapped_rows).
2. Agrupación por bloques: Seguimos usando la técnica de bloques para minimizar las llamadas a la API de LibreOffice. Si tienes 10.000 filas con ajuste
de texto seguidas, solo haremos una sola llamada para refrescarlas todas.
3. Seguridad: He mantenido el uso de getSheetSize() para asegurarnos de que no refrescamos áreas vacías del documento.
Con este cambio, el rendimiento de setColumnsWidth seguirá siendo excelente incluso en documentos extremadamente grandes. Todas las pruebas de regresión
siguen pasando.
* Added GEMINI.md
* ✦ He añadido envwrap a las dependencias del proyecto en pyproject.toml y he documentado el motivo en GEMINI.md.
Resumen sobre envwrap:
1. Por qué es necesario: Hemos detectado que tqdm (una de nuestras dependencias) intenta importar envwrap en este entorno. Al usar la librería uno de
LibreOffice, esta modifica los hooks de importación de Python, lo que hace que si envwrap no está instalado de forma explícita, se produzca un
ImportError intermitente que rompe los tests y los scripts de demo.
2. Seguridad: Es una librería segura y extremadamente ligera diseñada para manejar variables de entorno. Su inclusión no supone ningún riesgo para el
código ni penaliza el rendimiento.
3. Documentación: He creado una sección específica en GEMINI.md explicando que, aunque no es una dependencia directa de nuestra lógica de negocio, es
fundamental para la estabilidad del entorno de desarrollo y ejecución cuando conviven tqdm y uno.
Con esto, el entorno queda estabilizado y la razón de este cambio queda registrada para el futuro.
* ✦ He añadido una gran variedad de nuevos colores con nombre a la clase ColorsNamed en unogenerator/commons.py y he actualizado el script de demostración
para mostrarlos.
Cambios realizados:
1. Nuevos colores en ColorsNamed: He ampliado significativamente la lista de colores disponibles, añadiendo:
* Colores básicos: Cyan, Magenta, Purple, Brown, Lime, Navy, Teal, Olive, Maroon.
* Colores decorativos: Gold, Silver, Pink, SkyBlue, Salmon, Indigo, Lavender, Beige, Orchid, Turquoise, Chocolate, Coral, Crimson.
* Variantes oscuras y profundas: DarkBlue, DarkGreen, DarkOrange, DarkRed, DeepPink, DeepSkyBlue, y más.
2. Actualización de la Demo (unogenerator/demo.py):
* La hoja Styles de la demo ahora muestra automáticamente todos estos nuevos colores, ya que utiliza introspección sobre la clase ColorsNamed.
* He actualizado el ejemplo de celda combinada en la demo para que utilice el nuevo color SkyBlue, haciendo la hoja de estilos más vistosa.
Estos cambios permiten a los usuarios utilizar nombres de colores intuitivos en lugar de códigos hexadecimales, mejorando la legibilidad del código al
crear documentos. Las pruebas de regresión confirman que la generación de documentos sigue siendo estable y rápida.
* Añadidos colorsofficial para mantener compatibilidad
* Añadidos colorsofficial para mantener compatibilidad
### 1. Row Height and Column Width Interactions (Calc)
6
+
**Problem:** In LibreOffice Calc, setting `OptimalHeight = True` on an empty cell or range results in a default height (e.g., 452 for 10pt font). If data is inserted afterwards, or if column widths are changed, Calc may fail to automatically shrink the row height back to its minimum single-line value, or it may jump to a larger height (e.g., 841) if it considers the previous calculation "locked".
7
+
8
+
**Decisions:**
9
+
-**Data First, Height Second:** In `addListOfRowsWithStyle`, we now insert all data (`setDataArray`/`setFormulaArray`) *before* calling `_set_rows_optimal_height`. This ensures Calc has the actual content to perform a correct single-pass height calculation.
10
+
-**Forced Refresh on Width Change:** In `setColumnsWidth`, we explicitly toggle `OptimalHeight` (False then True) for all rows that are supposed to be wrapped. This forces Calc to recalculate heights based on the *new* column widths, preventing rows from staying at an excessively large height when they could now fit in a single line.
11
+
-**Block Processing Performance:** To maintain high performance with large datasets, the refresh logic in `setColumnsWidth` only iterates over rows known to have wrapping enabled (`_wrapped_rows`) and processes them in contiguous blocks to minimize UNO API calls.
12
+
13
+
### 2. Style Application Optimization
14
+
**Problem:** An optimization in `addListOfRowsWithStyle` incorrectly skipped applying styles if they matched `self.default_cell_style`. This was problematic for `ODS_Standard` which uses `Normal`, because the underlying template often defaults to `Default`. If we didn't explicitly set `Normal`, the cells would remain as `Default`, leading to styling inconsistencies.
15
+
16
+
**Decision:**
17
+
-**Safety-First Optimization:** The optimization now only skips style application if both the intended style is `Default` AND the document's default is also `Default`. If a custom `default_cell_style` (like `Normal`) is defined, it will always be explicitly applied to ensure document consistency.
18
+
19
+
### 3. Regression Testing
20
+
New tests have been added to `tests/test_unogenerator.py` to protect these fixes:
21
+
-`test_ods_row_height_consistency`: Ensures heights stay at 452 even after `setColumnsWidth` with many columns.
22
+
-`test_ods_normal_style_applied`: Verifies that `Normal` style is correctly applied by `ODS_Standard`.
23
+
24
+
### 4. Dependency: `envwrap`
25
+
**Issue:** When using `uno` (LibreOffice Python API), it modifies the Python import hook. In certain environments, this causes `tqdm` (a project dependency) to fail if `envwrap` is not explicitly installed, resulting in an `ImportError`.
26
+
27
+
**Decision:**
28
+
-**Explicit Dependency:**`envwrap` has been added to `pyproject.toml`. While not a direct dependency of the library's core logic, it is essential for the environment's stability when `tqdm` and `uno` coexist.
29
+
-**Safety:** It is a safe, lightweight utility for environment variable wrapping. Adding it explicitly prevents the intermittent `ImportError` and ensures that tests and demo scripts run reliably across different setups.
0 commit comments