Write};
use std::path::PathBuf;
//use chrono::{DateTime, Utc};
#[napi]
pub async fn make_csv(file: String) {
println!("Создаём файлы");
//Первый файл
let sce = PathBuf::from(&file);
match sce.extension().and_then(|s: &std::ffi::OsStr| s.to_str()) {
Some("xlsx") | Some("xlsm") | Some("xlsb") | Some("xls") => (),
_ => panic!("Expecting an excel file"),
}
let dest: PathBuf = sce.with_extension("csv");
let mut dest = BufWriter::new(File::create(dest).unwrap());
let mut xl = open_workbook_auto(&file).unwrap();
let range = xl.worksheet_range_at(0).unwrap().unwrap();
write_range(&mut dest, &range).await.unwrap();
println!("Файл {} готов!", file);
}
async fn write_range<W: Write>(dest: &mut W, range: &Range<DataType>) -> std::io::Result<()> {
let n = range.get_size().1 - 1;
for r in range.rows() {
for (i, c) in r.iter().enumerate() {
match *c {
DataType::Empty => Ok(()),
DataType::String(ref s) | DataType::DateTimeIso(ref s) | DataType::DurationIso(ref s) => {
write!(dest, "{}", s)
}
DataType::Float(ref f) | DataType::DateTime(ref f) | DataType::Duration(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 {
write!(dest, "|")?;
}
}
write!(dest, "\r\n")?;
}
Ok(())
}
Ох бля
Обсуждают сегодня