Skip to content

Commit 7d4fd45

Browse files
committed
Basic Excel output
1 parent 757f0d1 commit 7d4fd45

File tree

2 files changed

+56
-49
lines changed

2 files changed

+56
-49
lines changed

cspell.json

+6-3
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,15 @@
55
{
66
"name": "projectWords",
77
"path": "./project-words.txt"
8-
},
8+
}
99
],
1010
"dictionaries": [
1111
"projectWords"
1212
],
1313
"words": [],
14-
"ignoreWords": [],
14+
"ignoreWords": [
15+
"tbody",
16+
"thead"
17+
],
1518
"import": []
16-
}
19+
}

server/service/src/report/report_service.rs

+50-46
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ use repository::{
55
PaginationOption, Report, ReportFilter, ReportRepository, ReportRowRepository, ReportSort,
66
ReportType, RepositoryError,
77
};
8-
use std::{collections::HashMap, time::SystemTime};
8+
use std::{cell, collections::HashMap, time::SystemTime};
99
use util::uuid::uuid;
1010

1111
use crate::{
@@ -176,58 +176,62 @@ fn print_html_report_to_excel(
176176
document: GeneratedReport,
177177
report_name: String,
178178
) -> 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";
185180

186181
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)))?;
188185

189-
// TO-DO: Process document data into book
190186
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();
192190
let row_selector = Selector::parse("tr").unwrap();
193191
let cell_selector = Selector::parse("td").unwrap();
194192

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)
231235
}
232236

233237
/// Puts the document content, header and footer into a <html> template.

0 commit comments

Comments
 (0)