【Rust】RustでExcelを操作したかった話
~前置き~
RustでExcel操作したい!
これまでPython
のopenpyxl
や
C#
のClosedXML
などでExcelの操作をすることはあったのですが、
こういうのRust
でもできんかな~と調べていました。
ちょっと前に調べたときは
windows-rs
とかwinapi
を使う記事が上の方に出てきて
「ちょっとハードル高いなぁ……」と思っていたのですが、
最近調べるともっと簡単に操作できそうな
calamine
クレートというのが見つかったので早速使ってみました。
~前置き終わり~
calamine
のdocs.rs
こっちはGithub
Rust
を勉強してると大体英語のリファレンスとか記事なんですよね……。
禁断症状が出そうです……。
使ってみた
前準備としてCargo.toml
の[dependencies]
に以下を記述します。
以下は7月下旬ごろのバージョンです。
この記事を読んだ時期によってはバージョンが変わっていて、
calamine
の記述方法も変わってると思うので注意してください。
[dependencies]
calamine = "0.18.0"
今回は読み込みだけです。
書き込みは……気が向いた時にやりますゆるして()
Excelブックの読み込み
ブックの読み込みは以下のように書きます。
use calamine::{open_workbook, Reader, Xlsx};
fn main() {
let xl_book_path = "Your Excel Book Path .xlsx";
let mut wb: Xlsx<_> = open_workbook(xl_book_path).expect("cannot open xl book");
}
めっちゃかんたーん!
シートの読み込み
ここは公式の書き方に習っています。
なんかもう少しうまい書き方があるような気がしますが
試す時間がなかったのでそのままで。
(シートの読み込みというよりかは、指定したシートのRange情報とってきてるのかも……?)
if let Some(Ok(range)) = wb.worksheet_range("sheet name") {
[処理]
}
セルの値を取得する
openpyxl
とかClosedXML
に比べるとちょっと違う書き方をしていますが、
まぁ、わからんでもないなという感じです。
if let Some(Ok(range)) = wb.worksheet_range("sheet name") {
let cell_value = range.get_value((row, column)).unwrap();
}
get_value
の後に2つ括弧があることに注意してください。
ちなみにrow
とcolumn
の部分に変数を使用する場合は
u32
じゃないとダメみたいです。
for
文とかでぶん回してその値をそのまま渡したりすると
「それはusize
だるるぉ?」って怒られます……。
なのでちゃんとas u32
って書いて変換しておきましょう。
if let Some(Ok(range)) = wb.worksheet_range("sheet name") {
for row in 0..10{
let cell_value = range.get_value((row as u32, 1)).unwrap();
}
}
最大行と最大列の取得
get_size
を使うだけです。
インデックス0
に行、1
に列が入っています。
if let Some(Ok(range)) = wb.worksheet_range("sheet name") {
let max_row = range.get_size().0;
let max_column = range.get_size().1;
}
ここはusize
で出てきます。
u32
じゃないのね~。
終わりに
今回書いた内容で一通り簡単な読み込みはできるかな~と思います。
ちょっと特殊な事しようと思うとまた変わってくるかもです。
(VBA
プロジェクト読み込む……とか)
Discussion