tafia / calamine

A pure Rust Excel/OpenDocument SpreadSheets file reader: rust on metal sheets
MIT License
1.69k stars 158 forks source link

how to open_workbook from a Vec<u8> #337

Closed zhaohang15639535703 closed 1 year ago

zhaohang15639535703 commented 1 year ago

Hello , I am writing a simple webassembly project to read the xlsx ,but I could not find how to open workbook from a Vec here is my code:


#[wasm_bindgen]
pub async fn read_excel_file(file: web_sys::File) -> Result<JsValue, JsValue> {
    let file_name = file.name().to_lowercase();
    let suffix = if file_name.ends_with("xls") {
        "xls".to_owned()
    } else if file_name.ends_with("xlsx") {
        "xlsx".to_owned()
    } else {
        Err("this is not an excel")?
    };
    let buffer = file.slice()?;
    let buffer = JsFuture::from(buffer.array_buffer()).await?;
    let buffer = js_sys::Uint8Array::new(&buffer).to_vec();
    let sheets = calamine::open_workbook_auto()
        .map_err(|e| JsValue::from_str(&format!("Xlsx-error: {:?}", e)))?;
    Ok("hello".into())
}
dimastbk commented 1 year ago

Maybe use std::io::Cursor and calamine::open_workbook_auto_from_rs? Something like:

use crate::open_workbook_auto_from_rs;
use std::io::Cursor;
use wasm_bindgen::prelude::*;
use wasm_bindgen_futures::JsFuture;

#[wasm_bindgen]
pub async fn read_excel_file(file: web_sys::File) -> Result<JsValue, JsValue> {
    let file_name = file.name().to_lowercase();
    let suffix = if file_name.ends_with("xls") {
        "xls".to_owned()
    } else if file_name.ends_with("xlsx") {
        "xlsx".to_owned()
    } else {
        Err("this is not an excel")?
    };
    let buffer = file.slice()?;
    let buffer = JsFuture::from(buffer.array_buffer()).await?;
    let buffer = js_sys::Uint8Array::new(&buffer).to_vec();
    let cursor = Cursor::new(buffer);
    let sheets = open_workbook_auto_from_rs(cursor)
        .map_err(|e| JsValue::from_str(&format!("Xlsx-error: {:?}", e)))?;
    Ok("hello".into())
}
zhaohang15639535703 commented 1 year ago

thank you, it helps me a lot. @dimastbk