Skip to main content

table_generation/
table_generation.rs

1//! Example: Table generation and integration
2//!
3//! Demonstrates table creation and rendering in PPTX presentations
4//! Run with: cargo run --example table_generation
5
6use ppt_rs::generator::{SlideContent, Table, TableRow, TableCell, TableBuilder, create_pptx_with_content};
7use std::fs;
8
9fn main() -> Result<(), Box<dyn std::error::Error>> {
10    println!("╔════════════════════════════════════════════════════════════╗");
11    println!("║        Generating Table Examples                          ║");
12    println!("╚════════════════════════════════════════════════════════════╝");
13    println!();
14
15    fs::create_dir_all("examples/output")?;
16
17    // Example 1: Simple table
18    println!("1. Creating simple table...");
19    create_simple_table_example()?;
20    println!("   ✓ Created: examples/output/simple_table.pptx");
21    println!();
22
23    // Example 2: Styled table
24    println!("2. Creating styled table...");
25    create_styled_table_example()?;
26    println!("   ✓ Created: examples/output/styled_table.pptx");
27    println!();
28
29    // Example 3: Data table
30    println!("3. Creating data table...");
31    create_data_table_example()?;
32    println!("   ✓ Created: examples/output/data_table.pptx");
33    println!();
34
35    // Example 4: Multiple tables
36    println!("4. Creating multiple tables...");
37    create_multiple_tables_example()?;
38    println!("   ✓ Created: examples/output/multiple_tables.pptx");
39    println!();
40
41    println!("✅ All table examples generated successfully!");
42    println!();
43    println!("Generated files:");
44    println!("  - examples/output/simple_table.pptx");
45    println!("  - examples/output/styled_table.pptx");
46    println!("  - examples/output/data_table.pptx");
47    println!("  - examples/output/multiple_tables.pptx");
48    println!();
49    println!("Note: Tables are generated as XML structures and can be");
50    println!("      integrated into slides for full rendering.");
51    println!();
52
53    Ok(())
54}
55
56fn create_simple_table_example() -> Result<(), Box<dyn std::error::Error>> {
57    let table = Table::from_data(
58        vec![
59            vec!["Name", "Age"],
60            vec!["Alice", "30"],
61            vec!["Bob", "25"],
62        ],
63        vec![2000000, 2000000],
64        500000,
65        1500000,
66    );
67
68    let slides = vec![
69        SlideContent::new("Simple 2x2 Table")
70            .add_bullet("Table with basic structure")
71            .add_bullet("Headers and data rows"),
72        SlideContent::new("Table Data")
73            .table(table),
74    ];
75
76    let pptx_data = create_pptx_with_content("Simple Table", slides)?;
77    fs::write("examples/output/simple_table.pptx", pptx_data)?;
78    Ok(())
79}
80
81fn create_styled_table_example() -> Result<(), Box<dyn std::error::Error>> {
82    let header_cells = vec![
83        TableCell::new("Name").bold().background_color("003366"),
84        TableCell::new("Age").bold().background_color("003366"),
85        TableCell::new("City").bold().background_color("003366"),
86    ];
87    let header_row = TableRow::new(header_cells);
88
89    let data_rows = vec![
90        TableRow::new(vec![
91            TableCell::new("Alice"),
92            TableCell::new("30"),
93            TableCell::new("NYC"),
94        ]),
95        TableRow::new(vec![
96            TableCell::new("Bob"),
97            TableCell::new("28"),
98            TableCell::new("LA"),
99        ]),
100        TableRow::new(vec![
101            TableCell::new("Carol"),
102            TableCell::new("35"),
103            TableCell::new("Chicago"),
104        ]),
105    ];
106
107    let table = Table::new(
108        vec![vec![header_row], data_rows].concat(),
109        vec![1500000, 1500000, 1500000],
110        500000,
111        1500000,
112    );
113
114    let slides = vec![
115        SlideContent::new("Styled Table")
116            .title_bold(true)
117            .title_color("003366")
118            .add_bullet("Table with formatting"),
119        SlideContent::new("People Data")
120            .table(table),
121    ];
122
123    let pptx_data = create_pptx_with_content("Styled Table", slides)?;
124    fs::write("examples/output/styled_table.pptx", pptx_data)?;
125    Ok(())
126}
127
128fn create_data_table_example() -> Result<(), Box<dyn std::error::Error>> {
129    let header_cells = vec![
130        TableCell::new("Product").bold().background_color("1F497D"),
131        TableCell::new("Revenue").bold().background_color("1F497D"),
132        TableCell::new("Growth").bold().background_color("1F497D"),
133    ];
134    let header_row = TableRow::new(header_cells);
135
136    let data_rows = vec![
137        TableRow::new(vec![
138            TableCell::new("Product A"),
139            TableCell::new("$100K"),
140            TableCell::new("+15%"),
141        ]),
142        TableRow::new(vec![
143            TableCell::new("Product B"),
144            TableCell::new("$150K"),
145            TableCell::new("+22%"),
146        ]),
147        TableRow::new(vec![
148            TableCell::new("Product C"),
149            TableCell::new("$200K"),
150            TableCell::new("+18%"),
151        ]),
152    ];
153
154    let table = Table::new(
155        vec![vec![header_row], data_rows].concat(),
156        vec![2000000, 2000000, 1500000],
157        457200,
158        1400000,
159    );
160
161    let slides = vec![
162        SlideContent::new("Sales Data Table")
163            .title_bold(true)
164            .title_size(48)
165            .add_bullet("Quarterly sales figures"),
166        SlideContent::new("Q1 2025 Sales")
167            .table(table),
168        SlideContent::new("Summary")
169            .content_bold(true)
170            .add_bullet("Total Revenue: $450K")
171            .add_bullet("Average Growth: +18.3%")
172            .add_bullet("Best Performer: Product C"),
173    ];
174
175    let pptx_data = create_pptx_with_content("Sales Data", slides)?;
176    fs::write("examples/output/data_table.pptx", pptx_data)?;
177    Ok(())
178}
179
180fn create_multiple_tables_example() -> Result<(), Box<dyn std::error::Error>> {
181    // Table 1: Employees
182    let emp_header = TableRow::new(vec![
183        TableCell::new("ID").bold().background_color("4F81BD"),
184        TableCell::new("Name").bold().background_color("4F81BD"),
185        TableCell::new("Department").bold().background_color("4F81BD"),
186    ]);
187    let emp_rows = vec![
188        TableRow::new(vec![
189            TableCell::new("001"),
190            TableCell::new("Alice"),
191            TableCell::new("Engineering"),
192        ]),
193        TableRow::new(vec![
194            TableCell::new("002"),
195            TableCell::new("Bob"),
196            TableCell::new("Sales"),
197        ]),
198        TableRow::new(vec![
199            TableCell::new("003"),
200            TableCell::new("Carol"),
201            TableCell::new("Marketing"),
202        ]),
203    ];
204    let emp_table = Table::new(
205        vec![vec![emp_header], emp_rows].concat(),
206        vec![1000000, 2000000, 2000000],
207        500000,
208        1500000,
209    );
210
211    // Table 2: Projects
212    let proj_header = TableRow::new(vec![
213        TableCell::new("Project").bold().background_color("003366"),
214        TableCell::new("Status").bold().background_color("003366"),
215        TableCell::new("Owner").bold().background_color("003366"),
216    ]);
217    let proj_rows = vec![
218        TableRow::new(vec![
219            TableCell::new("Project A"),
220            TableCell::new("In Progress"),
221            TableCell::new("Alice"),
222        ]),
223        TableRow::new(vec![
224            TableCell::new("Project B"),
225            TableCell::new("Completed"),
226            TableCell::new("Bob"),
227        ]),
228        TableRow::new(vec![
229            TableCell::new("Project C"),
230            TableCell::new("Planning"),
231            TableCell::new("Carol"),
232        ]),
233    ];
234    let proj_table = Table::new(
235        vec![vec![proj_header], proj_rows].concat(),
236        vec![2000000, 2000000, 1500000],
237        500000,
238        1500000,
239    );
240
241    let slides = vec![
242        SlideContent::new("Multiple Tables")
243            .title_bold(true)
244            .add_bullet("Slide with multiple tables"),
245        SlideContent::new("Table 1: Employees")
246            .table(emp_table),
247        SlideContent::new("Table 2: Projects")
248            .table(proj_table),
249        SlideContent::new("Summary")
250            .add_bullet("Total Employees: 3")
251            .add_bullet("Active Projects: 3")
252            .add_bullet("Completion Rate: 33%"),
253    ];
254
255    let pptx_data = create_pptx_with_content("Multiple Tables", slides)?;
256    fs::write("examples/output/multiple_tables.pptx", pptx_data)?;
257    Ok(())
258}
259
260/// Helper function to demonstrate table creation
261#[allow(dead_code)]
262fn create_table_structure() -> Table {
263    // Create table using builder
264    TableBuilder::new(vec![1000000, 1000000, 1000000])
265        .position(500000, 1000000)
266        .add_simple_row(vec!["Header 1", "Header 2", "Header 3"])
267        .add_simple_row(vec!["Data 1", "Data 2", "Data 3"])
268        .add_simple_row(vec!["Data 4", "Data 5", "Data 6"])
269        .build()
270}
271
272/// Helper function to demonstrate styled table
273#[allow(dead_code)]
274fn create_styled_table() -> Table {
275    let header_cells = vec![
276        TableCell::new("Name").bold().background_color("003366"),
277        TableCell::new("Age").bold().background_color("003366"),
278        TableCell::new("City").bold().background_color("003366"),
279    ];
280    let header_row = TableRow::new(header_cells);
281
282    let data_cells = vec![
283        TableCell::new("Alice"),
284        TableCell::new("30"),
285        TableCell::new("NYC"),
286    ];
287    let data_row = TableRow::new(data_cells);
288
289    Table::new(
290        vec![header_row, data_row],
291        vec![1000000, 1000000, 1000000],
292        500000,
293        1000000,
294    )
295}