pub struct XlsxBook { /* private fields */ }Expand description
xlsx book reader
Implementations§
Source§impl XlsxBook
impl XlsxBook
Sourcepub fn new<T: AsRef<Path>>(path: T, load_share: bool) -> Result<XlsxBook>
pub fn new<T: AsRef<Path>>(path: T, load_share: bool) -> Result<XlsxBook>
load_share: if set to false, you should call load_share_strings before reading data. it should usually be true. If you only need to obtain the sheet names, you can set it false to open the file faster.
Examples found in repository?
examples/simple_batch_writer.rs (line 8)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut writer = XlsxWriter::new();
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// each row will have 3 cells.
let mut sheet = book.get_sheet_by_name(&shname, 100, 0, 1, get_num_from_ord("C".as_bytes())?, true)?;
// the sheet name will be write at the begin of each row
let pre_cells = vec![shname];
if let Some((rows_nums, rows_data)) = sheet.get_remaining_cells()? {
writer.append_rows("sheet", rows_nums, rows_data, &pre_cells)?;
// if you don't want row numbers to be writed before data, set nrows = vec![];
};
};
writer.save_as("xlsx/out.xlsx")?;
Ok(())
}More examples
examples/read_datatime.rs (line 5)
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let mut sheet = book.get_sheet_by_name(&shname, 100, 3, 1, MAX_COL_NUM, false)?;
if let Some((_, rows_data)) = sheet.get_remaining_cells()? {
let row = &rows_data[0];
let val_dt: NaiveDate = row[0].get()?.unwrap();
let val_tm: NaiveTime = row[0].get()?.unwrap();
let val_dttm: NaiveDateTime = row[0].get()?.unwrap();
let val_stamp: Timestamp = row[0].get()?.unwrap(); // since v0.1.4
println!("date:{}\ntime:{}\ndatetime:{}\ntimestamp:{}", val_dt, val_tm, val_dttm, val_stamp.utc());
};
}
Ok(())
}examples/cached_batch_reader.rs (line 7)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_cached_sheet_by_name(&shname, 100, 0, 1, MAX_COL_NUM, false)?;
for (rows_nums, rows_data) in sheet {
// empty rows will be skiped
for (row, cells) in rows_nums.into_iter().zip(rows_data) {
for (col, cel) in cells.into_iter().enumerate() {
let val: String = cel.get()?.unwrap(); // supprted types: String, i64, f64, bool, NaiveDate
println!("the value of {} is {val}; raw cell is {:?}", get_ord_from_tuple(row, (col+1) as u16)?, cel);
}
}
};
}
Ok(())
}examples/simple_batch_reader.rs (line 5)
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_sheet_by_name(&shname, 100, 0, 1, MAX_COL_NUM, false)?;
for batch in sheet {
let (rows_nums, rows_data) = batch?;
// empty rows will be skiped
for (row, cells) in rows_nums.into_iter().zip(rows_data) {
for (col, cel) in cells.into_iter().enumerate() {
let val: String = cel.get()?.unwrap(); // supprted types: String, i64, f64, bool, NaiveDate
println!("the value of {} is {val}; raw cell is {:?}", get_ord_from_tuple(row, (col+1) as u16)?, cel);
}
}
};
}
Ok(())
}examples/merged_range.rs (line 4)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// each row will have 3 cells.
let mut sheet = book.get_sheet_by_name(&shname, 100, 0, 1, get_num_from_ord("C".as_bytes())?, true)?;
// this is not necessary, if you don't care about the headers.
let (_, _header) = sheet.get_header_row()?;
if let Some((_rows_nums, _rows_data)) = sheet.get_remaining_cells()? {
// some code
};
// should be called when all data have been scaned.
let merged_rngs = sheet.get_merged_ranges()?;
match is_merged_cell(merged_rngs, 2, get_num_from_ord("A".as_bytes())?) {
(true, None) => {
println!("a merged cell(not top left cell)");
},
(true, Some((nrow, ncol))) => {
println!("a merged cell(top left cell), taking {nrow} row(s) and {ncol} column(s)");
},
_ => {
println!("not a merged cell");
}
}
}
Ok(())
}examples/cached_reader.rs (line 7)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// iter_batch will be supported in the future
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_cached_sheet_by_name(&shname, 100, 1, 1, MAX_COL_NUM, false)?;
println!("sheet: {}, row_ranges: {:?}, col_ranges: {:?}", sheet.sheet_name(), sheet.row_range(), sheet.column_range());
let (_, merge_info) = sheet.get_cell_value_with_merge_info("B2")?;
match merge_info {
(true, None) => {
println!("B2 is a merged cell(not top left cell)");
},
(true, Some((nrow, ncol))) => {
println!("B2 is a merged cell(top left cell), taking {nrow} row(s) and {ncol} column(s)");
},
_ => {
println!("B2 is not a merged cell");
}
};
let a4 = sheet.get_cell_value("A4")?;
println!("A4={:?}", a4);
}
Ok(())
}Additional examples can be found in:
get hidden sheets
Sourcepub fn get_visible_sheets(&self) -> &Vec<String>
pub fn get_visible_sheets(&self) -> &Vec<String>
get visible sheets
Examples found in repository?
examples/simple_batch_writer.rs (line 9)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut writer = XlsxWriter::new();
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// each row will have 3 cells.
let mut sheet = book.get_sheet_by_name(&shname, 100, 0, 1, get_num_from_ord("C".as_bytes())?, true)?;
// the sheet name will be write at the begin of each row
let pre_cells = vec![shname];
if let Some((rows_nums, rows_data)) = sheet.get_remaining_cells()? {
writer.append_rows("sheet", rows_nums, rows_data, &pre_cells)?;
// if you don't want row numbers to be writed before data, set nrows = vec![];
};
};
writer.save_as("xlsx/out.xlsx")?;
Ok(())
}More examples
examples/read_datatime.rs (line 6)
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let mut sheet = book.get_sheet_by_name(&shname, 100, 3, 1, MAX_COL_NUM, false)?;
if let Some((_, rows_data)) = sheet.get_remaining_cells()? {
let row = &rows_data[0];
let val_dt: NaiveDate = row[0].get()?.unwrap();
let val_tm: NaiveTime = row[0].get()?.unwrap();
let val_dttm: NaiveDateTime = row[0].get()?.unwrap();
let val_stamp: Timestamp = row[0].get()?.unwrap(); // since v0.1.4
println!("date:{}\ntime:{}\ndatetime:{}\ntimestamp:{}", val_dt, val_tm, val_dttm, val_stamp.utc());
};
}
Ok(())
}examples/cached_batch_reader.rs (line 8)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_cached_sheet_by_name(&shname, 100, 0, 1, MAX_COL_NUM, false)?;
for (rows_nums, rows_data) in sheet {
// empty rows will be skiped
for (row, cells) in rows_nums.into_iter().zip(rows_data) {
for (col, cel) in cells.into_iter().enumerate() {
let val: String = cel.get()?.unwrap(); // supprted types: String, i64, f64, bool, NaiveDate
println!("the value of {} is {val}; raw cell is {:?}", get_ord_from_tuple(row, (col+1) as u16)?, cel);
}
}
};
}
Ok(())
}examples/simple_batch_reader.rs (line 6)
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_sheet_by_name(&shname, 100, 0, 1, MAX_COL_NUM, false)?;
for batch in sheet {
let (rows_nums, rows_data) = batch?;
// empty rows will be skiped
for (row, cells) in rows_nums.into_iter().zip(rows_data) {
for (col, cel) in cells.into_iter().enumerate() {
let val: String = cel.get()?.unwrap(); // supprted types: String, i64, f64, bool, NaiveDate
println!("the value of {} is {val}; raw cell is {:?}", get_ord_from_tuple(row, (col+1) as u16)?, cel);
}
}
};
}
Ok(())
}examples/merged_range.rs (line 5)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// each row will have 3 cells.
let mut sheet = book.get_sheet_by_name(&shname, 100, 0, 1, get_num_from_ord("C".as_bytes())?, true)?;
// this is not necessary, if you don't care about the headers.
let (_, _header) = sheet.get_header_row()?;
if let Some((_rows_nums, _rows_data)) = sheet.get_remaining_cells()? {
// some code
};
// should be called when all data have been scaned.
let merged_rngs = sheet.get_merged_ranges()?;
match is_merged_cell(merged_rngs, 2, get_num_from_ord("A".as_bytes())?) {
(true, None) => {
println!("a merged cell(not top left cell)");
},
(true, Some((nrow, ncol))) => {
println!("a merged cell(top left cell), taking {nrow} row(s) and {ncol} column(s)");
},
_ => {
println!("not a merged cell");
}
}
}
Ok(())
}examples/cached_reader.rs (line 8)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// iter_batch will be supported in the future
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_cached_sheet_by_name(&shname, 100, 1, 1, MAX_COL_NUM, false)?;
println!("sheet: {}, row_ranges: {:?}, col_ranges: {:?}", sheet.sheet_name(), sheet.row_range(), sheet.column_range());
let (_, merge_info) = sheet.get_cell_value_with_merge_info("B2")?;
match merge_info {
(true, None) => {
println!("B2 is a merged cell(not top left cell)");
},
(true, Some((nrow, ncol))) => {
println!("B2 is a merged cell(top left cell), taking {nrow} row(s) and {ncol} column(s)");
},
_ => {
println!("B2 is not a merged cell");
}
};
let a4 = sheet.get_cell_value("A4")?;
println!("A4={:?}", a4);
}
Ok(())
}Additional examples can be found in:
if set load_share to false, you should call load_share_strings before reading data
Sourcepub fn get_sheet_by_name(
&mut self,
sht_name: &String,
iter_batch: usize,
skip_rows: u32,
left_ncol: ColNum,
right_ncol: ColNum,
first_row_is_header: bool,
) -> Result<XlsxSheet<'_>>
pub fn get_sheet_by_name( &mut self, sht_name: &String, iter_batch: usize, skip_rows: u32, left_ncol: ColNum, right_ncol: ColNum, first_row_is_header: bool, ) -> Result<XlsxSheet<'_>>
sht_name: sheet name
iter_batch: The number of rows per batch
skip_rows: number of skipped rows
left_ncol: Starting column (included), with 1 as the starting value
right_ncol: Terminate columns (including), MAX-COL_NUM to get non fixed termination columns
Examples found in repository?
examples/simple_batch_writer.rs (line 12)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut writer = XlsxWriter::new();
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// each row will have 3 cells.
let mut sheet = book.get_sheet_by_name(&shname, 100, 0, 1, get_num_from_ord("C".as_bytes())?, true)?;
// the sheet name will be write at the begin of each row
let pre_cells = vec![shname];
if let Some((rows_nums, rows_data)) = sheet.get_remaining_cells()? {
writer.append_rows("sheet", rows_nums, rows_data, &pre_cells)?;
// if you don't want row numbers to be writed before data, set nrows = vec![];
};
};
writer.save_as("xlsx/out.xlsx")?;
Ok(())
}More examples
examples/read_datatime.rs (line 9)
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let mut sheet = book.get_sheet_by_name(&shname, 100, 3, 1, MAX_COL_NUM, false)?;
if let Some((_, rows_data)) = sheet.get_remaining_cells()? {
let row = &rows_data[0];
let val_dt: NaiveDate = row[0].get()?.unwrap();
let val_tm: NaiveTime = row[0].get()?.unwrap();
let val_dttm: NaiveDateTime = row[0].get()?.unwrap();
let val_stamp: Timestamp = row[0].get()?.unwrap(); // since v0.1.4
println!("date:{}\ntime:{}\ndatetime:{}\ntimestamp:{}", val_dt, val_tm, val_dttm, val_stamp.utc());
};
}
Ok(())
}examples/simple_batch_reader.rs (line 9)
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_sheet_by_name(&shname, 100, 0, 1, MAX_COL_NUM, false)?;
for batch in sheet {
let (rows_nums, rows_data) = batch?;
// empty rows will be skiped
for (row, cells) in rows_nums.into_iter().zip(rows_data) {
for (col, cel) in cells.into_iter().enumerate() {
let val: String = cel.get()?.unwrap(); // supprted types: String, i64, f64, bool, NaiveDate
println!("the value of {} is {val}; raw cell is {:?}", get_ord_from_tuple(row, (col+1) as u16)?, cel);
}
}
};
}
Ok(())
}examples/merged_range.rs (line 8)
3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// each row will have 3 cells.
let mut sheet = book.get_sheet_by_name(&shname, 100, 0, 1, get_num_from_ord("C".as_bytes())?, true)?;
// this is not necessary, if you don't care about the headers.
let (_, _header) = sheet.get_header_row()?;
if let Some((_rows_nums, _rows_data)) = sheet.get_remaining_cells()? {
// some code
};
// should be called when all data have been scaned.
let merged_rngs = sheet.get_merged_ranges()?;
match is_merged_cell(merged_rngs, 2, get_num_from_ord("A".as_bytes())?) {
(true, None) => {
println!("a merged cell(not top left cell)");
},
(true, Some((nrow, ncol))) => {
println!("a merged cell(top left cell), taking {nrow} row(s) and {ncol} column(s)");
},
_ => {
println!("not a merged cell");
}
}
}
Ok(())
}examples/partial_batch_reader.rs (line 11)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let mut sheet = book.get_sheet_by_name(&shname, 100, 0, 1, MAX_COL_NUM, true)?;
let mut skip_until = HashMap::new();
skip_until.insert("A".into(), "col1".into());
skip_until.insert("C".into(), "col3".into());
sheet.with_skip_until(&skip_until);
let mut read_before = HashMap::new();
read_before.insert("B".into(), "sum".into());
sheet.with_read_before(&read_before);
// only rows after skip_until-row(included) and before read_before(excluded) will be returned
let captures = vec!["B2".into(), "C1".into()].into_iter().collect();
sheet.with_capture_vals(captures);
println!("captures: {:?}", sheet.get_captured_vals());
for batch in sheet {
let (rows_nums, rows_data) = batch?;
// empty rows will be skiped
for (row, cells) in rows_nums.into_iter().zip(rows_data) {
for (col, cel) in cells.into_iter().enumerate() {
let val: String = cel.get()?.unwrap(); // supprted types: String, i64, f64, bool, NaiveDate
println!("the value of {} is {val}; raw cell is {:?}", get_ord_from_tuple(row, (col+1) as u16)?, cel);
}
}
// println!("captured values: {:?}", sheet.get_captured_vals());
};
}
Ok(())
}Sourcepub fn get_cached_sheet_by_name(
&mut self,
sht_name: &String,
iter_batch: usize,
skip_rows: u32,
left_ncol: ColNum,
right_ncol: ColNum,
first_row_is_header: bool,
) -> Result<CachedSheet<'_>>
pub fn get_cached_sheet_by_name( &mut self, sht_name: &String, iter_batch: usize, skip_rows: u32, left_ncol: ColNum, right_ncol: ColNum, first_row_is_header: bool, ) -> Result<CachedSheet<'_>>
get cached sheet by name, all data will be cached in memory when sheet created
Examples found in repository?
examples/cached_batch_reader.rs (line 11)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_cached_sheet_by_name(&shname, 100, 0, 1, MAX_COL_NUM, false)?;
for (rows_nums, rows_data) in sheet {
// empty rows will be skiped
for (row, cells) in rows_nums.into_iter().zip(rows_data) {
for (col, cel) in cells.into_iter().enumerate() {
let val: String = cel.get()?.unwrap(); // supprted types: String, i64, f64, bool, NaiveDate
println!("the value of {} is {val}; raw cell is {:?}", get_ord_from_tuple(row, (col+1) as u16)?, cel);
}
}
};
}
Ok(())
}More examples
examples/cached_reader.rs (line 12)
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
fn main() -> Result<(), Box<dyn std::error::Error>> {
let mut book = XlsxBook::new("xlsx/test.xlsx", true)?;
for shname in book.get_visible_sheets().clone() {
// left_ncol should not be 0
// iter_batch will be supported in the future
// the tail empty cells will be ignored, if you want the length of cells in each row is fixed, you can set right_ncol to a number not MAX_COL_NUM
let sheet = book.get_cached_sheet_by_name(&shname, 100, 1, 1, MAX_COL_NUM, false)?;
println!("sheet: {}, row_ranges: {:?}, col_ranges: {:?}", sheet.sheet_name(), sheet.row_range(), sheet.column_range());
let (_, merge_info) = sheet.get_cell_value_with_merge_info("B2")?;
match merge_info {
(true, None) => {
println!("B2 is a merged cell(not top left cell)");
},
(true, Some((nrow, ncol))) => {
println!("B2 is a merged cell(top left cell), taking {nrow} row(s) and {ncol} column(s)");
},
_ => {
println!("B2 is not a merged cell");
}
};
let a4 = sheet.get_cell_value("A4")?;
println!("A4={:?}", a4);
}
Ok(())
}Auto Trait Implementations§
impl Freeze for XlsxBook
impl RefUnwindSafe for XlsxBook
impl Send for XlsxBook
impl Sync for XlsxBook
impl Unpin for XlsxBook
impl UnwindSafe for XlsxBook
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Mutably borrows from an owned value. Read more