parquet_to_excel/
lib.rs

1pub mod csv;
2pub mod xlsx;
3pub mod calc;
4pub mod meta;
5pub mod utils;
6#[cfg(feature = "feishu")]
7pub mod feishu;
8
9pub use serde;
10
11pub use csv::{file_to_csv as parq_file_to_csv, folder_to_csv as parq_folder_to_csv};
12pub use xlsx::{file_to_xlsx as parq_file_to_xlsx, folder_to_xlsx as parq_folder_to_xlsx};
13
14// publish to crates.io
15// cargo publish --registry crates-io
16
17
18/// 遍历目录的宏
19/// scan_dir!(root: AsRef<Path>, get_file: bool, [regex=Regex], [ftype=String], [level=int])   
20/// root: 根目录  
21/// get_file:true-返回文件,false-返回目录   
22/// regex: 路径过滤的正则表达式,regex::Regex类型   
23/// ftype: 文件类型后缀,比如.xlsx   
24/// level: 遍历的层级,0-根目录,1-直接子目录,依次类推
25#[macro_export]
26macro_rules! scan_dir {
27    ( $root:expr, $getFile:expr $(,regex=$regex:expr)? $(,ftype=$ftype:expr)? $(,level=$level:expr)? ) => {
28        {   
29            // use walkdir::WalkDir;
30            let iter = walkdir::WalkDir::new($root);
31            $(
32            let mut iter = iter;
33            iter = iter.min_depth($level);    // 0-不限制,1-当前目录,2-当前目录的子目录,以此类推
34            iter = iter.max_depth($level);
35            )?
36            iter.into_iter().filter(|f| 
37                match f {
38                    Err(_) => false,
39                    Ok(f) => {
40                        if $getFile {
41                            let file_name = f.file_name().to_str().as_ref().unwrap().as_bytes();
42                            if f.path().is_file() && (!file_name.starts_with(b"~$")) {
43                                true $(&& {if $ftype.len() == 0 || file_name.ends_with($ftype.as_bytes()) {
44                                        true
45                                    } else {
46                                        false
47                                    }})?
48                            } else {
49                                false
50                            }
51                        } else {
52                            if f.path().is_file() {
53                                false
54                            } else {
55                                true
56                            }
57                        }
58                    }
59                }
60            )
61            $(
62            .filter_map(|f| {
63                match f {
64                    Ok(item) => {
65                        let path = item.path().display().to_string();
66                        match $regex.captures(path.as_str()) {
67                            Some(caps) => {
68                                let mut cs = vec![];
69                                for i in 1..caps.len() {
70                                    cs.push(caps.get(i).unwrap().as_str().to_string());
71                                };
72                                Some((item, cs))
73                            },
74                            _ => None
75                        }
76                    },
77                    _ => None
78                }
79            })
80            )?
81        }
82    };
83}