|
10 | 10 | import click |
11 | 11 | import pandas as pd |
12 | 12 | from sqlalchemy.orm.exc import NoResultFound |
| 13 | +from openpyxl.worksheet.worksheet import Worksheet |
13 | 14 | import packaging.version |
14 | 15 |
|
15 | 16 | from fire.api.model import ( |
|
23 | 24 | import fire.cli |
24 | 25 | from fire.cli import firedb, grøn |
25 | 26 |
|
26 | | - |
27 | 27 | # Kotesystemer som understøttes i niv-modulet |
28 | 28 | KOTESYSTEMER = { |
29 | 29 | "DVR90": "EPSG:5799", |
@@ -134,6 +134,38 @@ def anvendte(arkdef: Dict) -> str: |
134 | 134 | return "A:" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n - 1] |
135 | 135 |
|
136 | 136 |
|
| 137 | +def påfør_df_style(df: pd.DataFrame) -> pd.io.formats.style.Styler: |
| 138 | + """ |
| 139 | + Påfør en style til en dataframe inden den gemmes som excel |
| 140 | +
|
| 141 | + Efter pandas 3 er alt styling som default fjernet når en DataFrame gemmes som Excel. |
| 142 | + Vi sætter derfor her eksplicit style til den tidligere default, som var at kolonnenavne |
| 143 | + gemmes med fed skrift og fuldt optrukne cellekanter. |
| 144 | +
|
| 145 | + For mere info se: https://pandas.pydata.org/docs/user_guide/io.html#style-and-formatting |
| 146 | + """ |
| 147 | + # Hvis dataframen ikke har nogen kolonner, som fx. fanebladet "Projektforside", så går |
| 148 | + # der ged i den |
| 149 | + if len(df.columns) == 0: |
| 150 | + return df |
| 151 | + |
| 152 | + css = "border: 1px solid black; font-weight: bold;" |
| 153 | + return df.style.map_index(lambda x: css, axis=1) |
| 154 | + |
| 155 | + |
| 156 | +def juster_kolonnebredder(faneblad: Worksheet): |
| 157 | + """Juster fanebladets kolonnebredder |
| 158 | +
|
| 159 | + For hver kolonne sættes bredden lig længden af den længste celle + 1. |
| 160 | + For at begrænse bredden ved meget lange tekstfelter som fx. fikspunktbeskrivelser, |
| 161 | + anvendes en maximal bredde på 40. |
| 162 | + """ |
| 163 | + max_bredde = 40 |
| 164 | + for kolonne in faneblad.columns: |
| 165 | + kolonnebredde = min(max([len(str(row.value)) for row in kolonne])+1, max_bredde) |
| 166 | + faneblad.column_dimensions[kolonne[0].column_letter].width = kolonnebredde |
| 167 | + |
| 168 | + |
137 | 169 | # ----------------------------------------------------------------------------- |
138 | 170 | def skriv_ark( |
139 | 171 | projektnavn: str, nye_faneblade: Dict[str, pd.DataFrame], suffix: str = "" |
@@ -264,14 +296,16 @@ def skriv_ark( |
264 | 296 | # Derved bliver de nye faneblade umiddelbart synlige, når arket åbnes. |
265 | 297 | try: |
266 | 298 | with pd.ExcelWriter(fil) as writer: |
267 | | - for navn in nye_faneblade: |
268 | | - nye_faneblade[navn].replace("nan", "").to_excel( |
269 | | - writer, sheet_name=navn, index=False |
270 | | - ) |
271 | | - for navn in gamle_faneblade: |
272 | | - gamle_faneblade[navn].replace("nan", "").to_excel( |
273 | | - writer, sheet_name=navn, index=False |
274 | | - ) |
| 299 | + for navn, df in nye_faneblade.items(): |
| 300 | + stylet_df = påfør_df_style(df) |
| 301 | + stylet_df.to_excel(writer, sheet_name=navn, index=False) |
| 302 | + juster_kolonnebredder(writer.sheets[navn]) |
| 303 | + |
| 304 | + for navn, df in gamle_faneblade.items(): |
| 305 | + stylet_df = påfør_df_style(df) |
| 306 | + stylet_df.to_excel(writer, sheet_name=navn, index=False) |
| 307 | + juster_kolonnebredder(writer.sheets[navn]) |
| 308 | + |
275 | 309 | except Exception as ex: |
276 | 310 | fire.cli.print(f"Kan ikke skrive opdateret '{fil}'!") |
277 | 311 | if gamle_navne: |
@@ -302,7 +336,10 @@ def find_faneblad( |
302 | 336 | ) |
303 | 337 | raise SystemExit(1) |
304 | 338 |
|
305 | | - return raw.astype(arkdef).replace("nan", "") |
| 339 | + raw = raw.astype(arkdef) |
| 340 | + raw[raw.select_dtypes(str).columns] = raw.select_dtypes(str).fillna("") |
| 341 | + |
| 342 | + return raw |
306 | 343 |
|
307 | 344 | except Exception as ex: |
308 | 345 | if ignore_failure: |
|
0 commit comments