AlphaProgrammer 2024-12-04 21:10 采纳率: 0%
浏览 14

Rust 中使用calamine报错

我写了一段Rust代码,其中使用了crate calamine, 代码内容如下:

use calamine::{open_workbook, Range, Reader, Xlsx, DataType};
use std::error::Error;

#[derive(Debug)]
struct Record {
    wavelength: f64,
    global_tilt: f64,
}

fn main() -> Result<(), Box<dyn Error>> {
    let path = format!("{}/data/am15.xlsx", std::env!("CARGO_MANIFEST_DIR"));
    let mut workbook: Xlsx<_> = open_workbook(&path)?;

    if let Some(Ok(range)) = workbook.worksheet_range("Sheet1").ok() {
        let mut rows_read = 0;

        // Iterate over the rows in the range
        for row in range.rows() {
            if rows_read >= 10 {
                break;
            }

            // Parse the row into a Record struct
            let record = Record {
                wavelength: row.get(0).and_then(|cell| cell.get_float()).unwrap_or(0.0),
                global_tilt: row.get(1).and_then(|cell| cell.get_float()).unwrap_or(0.0),
            };

            // Print the record
            println!("Wavelength: {}, Global tilt: {}", record.wavelength, record.global_tilt);
            rows_read += 1;
        }
    } else {
        println!("Worksheet 'Sheet1' not found or could not be read.");
    }

    Ok(())
} 

但是编译总是报错,错误如下:

error[E0308]: mismatched types
  --> src/print_header.rs:14:15
   |
14 |     if let Ok(Ok(range)) = workbook.worksheet_range("Sheet1") {
   |               ^^^^^^^^^    ---------------------------------- this expression has type `Result<calamine::Range<Data>, XlsxError>`
   |               |
   |               expected `Range<Data>`, found `Result<_, _>`
   |
   = note: expected struct `calamine::Range<Data>`
                found enum `Result<_, _>`

我该怎样解决掉这个报错?

  • 写回答

2条回答 默认 最新

  • 关注

    以下回复参考:皆我百晓生券券喵儿等免费微信小程序作答:

    这个错误是因为 workbook.worksheet_range("Sheet1") 这个函数返回的是一个 Result 类型,这意味着它可能会返回一个表示成功的值或者一个错误值。你正在尝试直接将这个 Result 值绑定到一个期望得到 Range<Data> 类型值的变量上,这就是为什么你收到了类型不匹配的错误信息。为了处理这个问题,你需要对这个 Result 类型进行合适的处理。以下是解决这个问题的一种方式:

    你需要检查 Result 是否包含错误值,如果存在错误值,你应该适当地处理这个错误,否则可以解开 Result 并使用内部的 Range<Data> 值。代码示例如下:

    use calamine::{open_workbook, Range, Reader, Xlsx};
    use std::error::Error;
    
    #[derive(Debug)]
    struct Record {
        wavelength: f64,
        global_tilt: f64,
    }
    
    fn main() -> Result<(), Box<dyn Error>> {
        let path = format!("{}/data/am15.xlsx", std::env!("CARGO_MANIFEST_DIR"));
        let mut workbook = open_workbook(&path)?; // 这里直接处理错误值,而不是忽略它
    
        if let Some(range) = workbook.worksheet_range("Sheet1")?.ok() { // 对可能返回 Result 的表达式进行处理
            let mut rows_read = 0;
            for row in range.rows() {
                if rows_read >= 10 {
                    break;
                }
                let record = Record {
                    wavelength: row.get(0).and_then(|cell| cell.get_float()).unwrap_or(0.0),
                    global_tilt: row.get(1).and_then(|cell| cell.get_float()).unwrap_or(0.0),
                };
                println!("Wavelength: {}, Global tilt: {}", record.wavelength, record.global_tilt);
                rows_read += 1;
            }
        } else {
            println!("Worksheet 'Sheet1' not found or could not be read.");
        }
        Ok(())
    }
    

    在这个修改后的代码中,我使用了问号运算符 (?) 来处理可能出现的错误。如果 open_workbook(&path) 返回的是一个 Err 值,这个问号运算符将会直接返回一个表示错误的 Result 值并退出函数。这是一个非常方便的方式来处理可能的错误,特别是当函数本身没有合适的返回值来表示出错时的情况。注意这种方式要求你的函数返回一个 Result 类型或者 Option 类型,这样才能使用问号运算符来处理错误。

    评论

报告相同问题?

问题事件

  • 创建了问题 12月4日