-
Notifications
You must be signed in to change notification settings - Fork 152
/
excel_to_csv.rs
51 lines (44 loc) · 1.66 KB
/
excel_to_csv.rs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
extern crate office;
use std::env;
use std::fs::File;
use std::io::{BufWriter, Write};
use std::path::PathBuf;
use office::{Excel, Range, DataType, Result};
fn main() {
// converts first argument into a csv (same name, silently overrides
// if the file already exists
let file = env::args().skip(1).next()
.expect("Please provide an excel file to convert");
let sheet = env::args().skip(2).next()
.expect("Expecting a sheet name as second argument");
let sce = PathBuf::from(file);
match sce.extension().and_then(|s| s.to_str()) {
Some("xlsx") | Some("xlsm") | Some("xlsb") => (),
_ => panic!("Expecting an excel file"),
}
let dest = sce.with_extension("csv");
let mut dest = BufWriter::new(File::create(dest).unwrap());
let mut xl = Excel::open(&sce).unwrap();
let range = xl.worksheet_range(&sheet).unwrap();
write_range(&mut dest, range).unwrap();
}
fn write_range<W: Write>(dest: &mut W, range: Range) -> Result<()> {
let n = range.get_size().1 - 1;
for r in range.rows() {
for (i, c) in r.iter().enumerate() {
let _ = try!(match *c {
DataType::Empty => Ok(()),
DataType::String(ref s) => write!(dest, "{}", s),
DataType::Float(ref f) => write!(dest, "{}", f),
DataType::Int(ref i) => write!(dest, "{}", i),
DataType::Error(ref e) => write!(dest, "{:?}", e),
DataType::Bool(ref b) => write!(dest, "{}", b),
});
if i != n {
let _ = try!(write!(dest, ";"));
}
}
let _ = try!(write!(dest, "\r\n"));
}
Ok(())
}