1use log::*;
2use std::path::Path;
3use usv::style::Style;
4use calamine::{
5 open_workbook,
6 open_workbook_from_rs,
7 DataType,
8 Error,
9 Xlsx,
10 Reader,
11};
12pub mod examples;
13
14pub fn xlsx_file_to_usv<
15 P: AsRef<Path> + Sized,
16>(
17 path: P,
18 style: &Style,
19) -> Result<String, Error> {
20 trace!("xlsx_file_to_usv");
21 let workbook: Xlsx<_> = open_workbook(path)?;
22 xlsx_workbook_to_usv(workbook, style)
23}
24
25pub fn xlsx_reader_to_usv<
26 RS: std::io::Read + std::io::Seek,
27>(
28 rs: RS,
29 style: &Style,
30) -> Result<String, Error> {
31 trace!("xlsx_reader_to_usv");
32 let workbook: Xlsx<_> = open_workbook_from_rs(rs)?;
33 xlsx_workbook_to_usv(workbook, style)
34}
35
36pub fn xlsx_workbook_to_usv<
37 RS: std::io::Read + std::io::Seek,
38>(
39 mut workbook: Xlsx<RS>,
40 style: &Style,
41) -> Result<String, Error> {
42 trace!("xlsx_workbook_to_usv");
43 let worksheets = workbook.worksheets();
44 let mut s = String::new();
45 for worksheet in worksheets {
46 trace!("worksheet");
47 s += &xlsx_worksheet_to_usv(worksheet, style)?;
48 s += &style.group_separator;
49 }
50 Ok(s)
51}
52
53pub fn xlsx_worksheet_to_usv(
54 worksheet: (String, calamine::Range<calamine::Data>),
55 style: &Style,
56) -> Result<String, Error> {
57 trace!("xlsx_worksheet_to_usv");
58 let (name, range) = worksheet;
59 trace!("name: {}", name);
60 let mut s = String::new();
61 s += &format!("{}{}{}", name, style.unit_separator, style.record_separator);
62 for row in range.rows() {
63 for data in row {
64 let unit = data.as_string().unwrap_or(String::from(""));
65 trace!("unit: {}", unit);
66 s += &format!("{}{}", unit, style.unit_separator);
67 }
68 s += &style.record_separator;
69 }
70 Ok(s)
71}
72
73#[cfg(test)]
74mod tests {
75 }