I'm rebuilding a Python project in Rust to help me with Excel. I can get all values from a xlsx file.
use calamine::Reader;
use calamine::open_workbook;
use calamine::Xlsx;
use calamine::DataType;
fn main() {
let path = "example.xlsx";
let mut workbook: Xlsx<_> = open_workbook(path).expect("Open Failed");
let mut rows: usize = 0;
let mut cols: usize = 0;
match workbook.worksheet_range("Sheet1") {
Some(Ok(range)) => {
rows = range.get_size().0;
cols = range.get_size().1;
for row in range.rows() {
for ele in row {
match ele {
DataType::Float(value) => print!("{}", value),
DataType::String(value) => print!("{}", value),
DataType::Error(value) => print!("{}", value),
DataType::Bool(value) => print!("{}", value),
DataType::DateTime(value) => print!("{}", value),
DataType::Empty => print!("/"),
DataType::Int(value) => print!("{}", value),
}
print!(" | ");
}
println!("");
}
},
_ => (),
}
println!("rows: {}, cols: {}", rows, cols);
}
How can I get the value of an individual cell with coordinates like (1, 3)?
I tried to use get_value()
like this but it doesn't work:
use calamine::{Range, DataType};
let mut range = Range::new((0, 0), (5, 2));
assert_eq!(range.get_value((2, 1)), Some(&DataType::Empty));
range.set_value((2, 1), DataType::Float(1.0));
assert_eq!(range.get_value((2, 1)), Some(&DataType::Float(1.0)));
I found a way to do it.
use calamine::{open_workbook, Reader, Xlsx, DataType};
fn main() {
let file_path = "example.xlsx";
let mut workbook: Xlsx<_> = open_workbook(file_path).unwrap();
if let Some(Ok(range)) = workbook.worksheet_range("Sheet1") {
let row = 1;
let col = 1;
let cell = range[row][col].to_owned();
match cell {
DataType::Float(value) => println!("{}", value),
DataType::String(value) => println!("{}", value),
DataType::Error(value) => println!("{}", value),
DataType::Bool(value) => println!("{}", value),
DataType::DateTime(value) => println!("{}", value),
DataType::Empty => println!("/"),
DataType::Int(value) => println!("{}", value),
}
}
}