Skip to content

Commit 4ef96b1

Browse files
authored
Merge pull request #887 from krebslw/opgrader-pd
Opgradér til pandas 3.*
2 parents 9a9d9bc + 918d03f commit 4ef96b1

2 files changed

Lines changed: 48 additions & 11 deletions

File tree

‎environment.yml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ dependencies:
1111
- networkx=3.*
1212
- numpy=2.*
1313
- pyarrow=20.*
14-
- pandas=2.*
14+
- pandas=3.*
1515
- pyproj=3.7.*
1616
- python=3.13.*
1717
- rich=14.*

‎src/fire/cli/niv/__init__.py‎

Lines changed: 47 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
import click
1111
import pandas as pd
1212
from sqlalchemy.orm.exc import NoResultFound
13+
from openpyxl.worksheet.worksheet import Worksheet
1314
import packaging.version
1415

1516
from fire.api.model import (
@@ -23,7 +24,6 @@
2324
import fire.cli
2425
from fire.cli import firedb, grøn
2526

26-
2727
# Kotesystemer som understøttes i niv-modulet
2828
KOTESYSTEMER = {
2929
"DVR90": "EPSG:5799",
@@ -134,6 +134,38 @@ def anvendte(arkdef: Dict) -> str:
134134
return "A:" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ"[n - 1]
135135

136136

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+
137169
# -----------------------------------------------------------------------------
138170
def skriv_ark(
139171
projektnavn: str, nye_faneblade: Dict[str, pd.DataFrame], suffix: str = ""
@@ -264,14 +296,16 @@ def skriv_ark(
264296
# Derved bliver de nye faneblade umiddelbart synlige, når arket åbnes.
265297
try:
266298
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+
275309
except Exception as ex:
276310
fire.cli.print(f"Kan ikke skrive opdateret '{fil}'!")
277311
if gamle_navne:
@@ -302,7 +336,10 @@ def find_faneblad(
302336
)
303337
raise SystemExit(1)
304338

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
306343

307344
except Exception as ex:
308345
if ignore_failure:

0 commit comments

Comments
 (0)