Search code examples
rustxlsx

How can I use calamine to lookup a cell by its coordinates?


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)));

Solution

  • 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),
            }
        }
    }