xlsx_to_usv/
lib.rs

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    // ./tests
76}