|
1 | 1 | """Table wrapper implementation.""" |
2 | 2 |
|
3 | | -from typing import Literal, NotRequired, Self, TypeAlias, TypedDict |
| 3 | +from typing import Literal, NotRequired, Self, TypeAlias, TypedDict, cast |
4 | 4 |
|
5 | 5 | from pptx.enum.text import MSO_VERTICAL_ANCHOR, PP_ALIGN |
6 | 6 | from pptx.shapes.graphfrm import GraphicFrame |
7 | 7 |
|
| 8 | +from pptxr._features import ( |
| 9 | + USE_PANDAS, |
| 10 | + USE_POLARS, |
| 11 | + PandasDataFrame, |
| 12 | + PolarsDataFrame, |
| 13 | + PolarsLazyFrame, |
| 14 | +) |
8 | 15 | from pptxr.types._length import Length, LiteralLength, LiteralPoint, Point |
9 | 16 |
|
10 | 17 | from ..converter import to_pptx_length |
11 | 18 | from . import Shape |
12 | 19 |
|
13 | | -DataFrame: TypeAlias = list[list[str]] |
| 20 | +# Define DataFrame type alias |
| 21 | +DataFrame: TypeAlias = list[list[str]] | PandasDataFrame | PolarsDataFrame |
14 | 22 |
|
15 | 23 |
|
16 | 24 | class TableCellStyle(TypedDict): |
@@ -65,12 +73,28 @@ def __init__( |
65 | 73 |
|
66 | 74 | # Apply table data if provided |
67 | 75 | if "data" in props: |
68 | | - table_data = props["data"] |
| 76 | + data = props["data"] |
| 77 | + |
| 78 | + # Convert different DataFrame types to list of lists |
| 79 | + if USE_POLARS and issubclass( |
| 80 | + data.__class__, (PolarsDataFrame, PolarsLazyFrame) |
| 81 | + ): |
| 82 | + # Convert pandas DataFrame to list of lists |
| 83 | + data = cast(PandasDataFrame, data) |
| 84 | + table_data = [data.columns.tolist()] + data.values.tolist() |
| 85 | + elif USE_PANDAS and issubclass(data.__class__, PandasDataFrame): # type: ignore |
| 86 | + # Convert polars DataFrame to list of lists |
| 87 | + data = cast(PandasDataFrame, data) |
| 88 | + table_data = [data.columns] + data.to_numpy().tolist() |
| 89 | + else: |
| 90 | + table_data = data |
| 91 | + |
| 92 | + # Now apply the data to the table |
69 | 93 | for i, row in enumerate(table_data): |
70 | 94 | if i < len(table.rows): |
71 | 95 | for j, cell_text in enumerate(row): |
72 | 96 | if j < len(table.columns): |
73 | | - table.cell(i, j).text = cell_text |
| 97 | + table.cell(i, j).text = str(cell_text) |
74 | 98 |
|
75 | 99 | # Apply cell styles if provided |
76 | 100 | if "cell_styles" in props: |
|
0 commit comments