@@ -5,7 +5,7 @@ use repository::{
5
5
PaginationOption , Report , ReportFilter , ReportRepository , ReportRowRepository , ReportSort ,
6
6
ReportType , RepositoryError ,
7
7
} ;
8
- use std:: { collections:: HashMap , time:: SystemTime } ;
8
+ use std:: { cell , collections:: HashMap , time:: SystemTime } ;
9
9
use util:: uuid:: uuid;
10
10
11
11
use crate :: {
@@ -176,58 +176,62 @@ fn print_html_report_to_excel(
176
176
document : GeneratedReport ,
177
177
report_name : String ,
178
178
) -> Result < String , ReportError > {
179
- let id = uuid ( ) ;
180
- // TODO use a proper tmp dir here instead of base_dir?
181
- // let excel = html_to_excel(base_dir, &format_html_document(document), &id)
182
- // .map_err(|err| ReportError::HTMLToPDFError(format!("{}", err)))?;
183
-
184
- // let doc = Html::parse_document(&format_html_document(document));
179
+ let sheet_name = "Report" ;
185
180
186
181
let mut book = umya_spreadsheet:: new_file ( ) ;
187
- // let _ = book.new_sheet("Report");
182
+ let _ = book
183
+ . set_sheet_name ( 0 , sheet_name)
184
+ . map_err ( |err| ReportError :: DocGenerationError ( format ! ( "{}" , err) ) ) ?;
188
185
189
- // TO-DO: Process document data into book
190
186
let fragment = Html :: parse_fragment ( & format_html_document ( document) ) ;
191
- let table_selector = Selector :: parse ( "table" ) . unwrap ( ) ;
187
+ let container_selector = Selector :: parse ( r#"div[class="container"]"# ) . unwrap ( ) ;
188
+ let table_head_selector = Selector :: parse ( "thead" ) . unwrap ( ) ;
189
+ let table_body_selector = Selector :: parse ( "tbody" ) . unwrap ( ) ;
192
190
let row_selector = Selector :: parse ( "tr" ) . unwrap ( ) ;
193
191
let cell_selector = Selector :: parse ( "td" ) . unwrap ( ) ;
194
192
195
- let table = fragment. select ( & table_selector) . next ( ) . unwrap ( ) ;
196
- // for element in table.select(&row_selector).enumerate() {
197
- // book
198
- // }
199
-
200
- book. get_sheet_by_name_mut ( "Sheet1" )
201
- . unwrap ( )
202
- . get_cell_mut ( "A1" )
203
- . set_value ( "TEST1" ) ;
204
- book. get_sheet_by_name_mut ( "Sheet1" )
205
- . unwrap ( )
206
- . get_cell_mut ( "B2" )
207
- . set_value ( "TEST2" ) ;
208
- book. get_sheet_by_name_mut ( "Sheet1" )
209
- . unwrap ( )
210
- . get_cell_mut ( "C3" )
211
- . set_value ( "TEST3" ) ;
212
-
213
- let path = std:: path:: Path :: new ( "/Users/carl/Desktop/_OUTPUT/test.xlsx" ) ;
214
-
215
- let _ = umya_spreadsheet:: writer:: xlsx:: write ( & book, & path) ;
216
-
217
- // let file_service = StaticFileService::new(base_dir)
218
- // .map_err(|err| ReportError::DocGenerationError(format!("{}", err)))?;
219
- // let now: DateTime<Utc> = SystemTime::now().into();
220
-
221
- // let file = file_service
222
- // .store_file(
223
- // &format!("{}_{}.xls", now.format("%Y%m%d_%H%M%S"), report_name),
224
- // StaticFileCategory::Temporary,
225
- // &book,
226
- // )
227
- // .map_err(|err| ReportError::DocGenerationError(format!("{}", err)))?;
228
- // Ok(file.id)
229
-
230
- Ok ( "temp" . to_string ( ) )
193
+ let container = fragment. select ( & container_selector) . next ( ) . unwrap ( ) ;
194
+ let header = container. select ( & table_head_selector) . next ( ) . unwrap ( ) ;
195
+ let header_row = header. select ( & row_selector) . next ( ) . unwrap ( ) ;
196
+ for cell in header_row. select ( & cell_selector) . enumerate ( ) {
197
+ book. get_sheet_by_name_mut ( sheet_name)
198
+ . unwrap ( )
199
+ . get_cell_mut ( ( cell. 0 as u32 + 1 , 1 ) )
200
+ . set_value ( cell. 1 . inner_html ( ) ) ;
201
+ book. get_sheet_by_name_mut ( sheet_name)
202
+ . unwrap ( )
203
+ . get_cell_mut ( ( cell. 0 as u32 + 1 , 1 ) )
204
+ . get_style_mut ( )
205
+ . get_font_mut ( )
206
+ . set_bold ( true ) ;
207
+ }
208
+
209
+ let table_body = container. select ( & table_body_selector) . next ( ) . unwrap ( ) ;
210
+ for row in table_body. select ( & row_selector) . enumerate ( ) {
211
+ for cell in row. 1 . select ( & cell_selector) . enumerate ( ) {
212
+ book. get_sheet_by_name_mut ( sheet_name)
213
+ . unwrap ( )
214
+ . get_cell_mut ( ( cell. 0 as u32 + 1 , row. 0 as u32 + 2 ) )
215
+ . set_value ( cell. 1 . inner_html ( ) ) ;
216
+ }
217
+ }
218
+
219
+ let now: DateTime < Utc > = SystemTime :: now ( ) . into ( ) ;
220
+ let file_service = StaticFileService :: new ( base_dir)
221
+ . map_err ( |err| ReportError :: DocGenerationError ( format ! ( "{}" , err) ) ) ?;
222
+
223
+ let reserved_file = file_service
224
+ . reserve_file (
225
+ & format ! ( "{}_{}.xlsx" , now. format( "%Y%m%d_%H%M%S" ) , report_name) ,
226
+ & StaticFileCategory :: Temporary ,
227
+ None ,
228
+ )
229
+ . map_err ( |err| ReportError :: DocGenerationError ( format ! ( "{}" , err) ) ) ?;
230
+
231
+ umya_spreadsheet:: writer:: xlsx:: write ( & book, reserved_file. path )
232
+ . map_err ( |err| ReportError :: DocGenerationError ( format ! ( "{}" , err) ) ) ?;
233
+
234
+ Ok ( reserved_file. id )
231
235
}
232
236
233
237
/// Puts the document content, header and footer into a <html> template.
0 commit comments