From 35a5895d013aa509e9e9ec00a82515b0214f5259 Mon Sep 17 00:00:00 2001 From: Nicolas Sanchez Date: Tue, 7 Oct 2025 22:14:57 +0200 Subject: [PATCH] =?UTF-8?q?ajout=20du=20num=C3=A9ro=20de=20ligne=20s=C3=A9?= =?UTF-8?q?quentiel=20ou=20tel=20quel?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .~lock.test_masque.xlsx# | 2 +- src/arguments.rs | 21 +++++++++++++++++++-- src/xlsxtocsv.rs | 22 +++++++++++++++------- test_masque.xlsx | Bin 6252 -> 6224 bytes 4 files changed, 35 insertions(+), 10 deletions(-) diff --git a/.~lock.test_masque.xlsx# b/.~lock.test_masque.xlsx# index 540f683..58cf175 100644 --- a/.~lock.test_masque.xlsx# +++ b/.~lock.test_masque.xlsx# @@ -1 +1 @@ -,sanchezn,pc-sanchezn,07.10.2025 21:40,file:///home/sanchezn/.config/libreoffice/4; \ No newline at end of file +,sanchezn,pc-sanchezn,07.10.2025 21:58,file:///home/sanchezn/.config/libreoffice/4; \ No newline at end of file diff --git a/src/arguments.rs b/src/arguments.rs index b9be083..34aac97 100644 --- a/src/arguments.rs +++ b/src/arguments.rs @@ -38,6 +38,23 @@ impl ToString for TrimSpaces { } } +#[derive(Clone, Debug, ValueEnum)] +pub enum NumberRows { + AsIs, + Sequential, + None, +} + +impl ToString for NumberRows { + fn to_string(&self) -> String { + match self { + NumberRows::AsIs => "as-is".into(), + NumberRows::Sequential => "sequential".into(), + NumberRows::None => "none".into(), + } + } +} + #[derive(Parser, Debug)] pub struct Arguments { @@ -63,6 +80,6 @@ pub struct Arguments { #[arg(short, long, default_value_t = TrimSpaces::None)] pub trim: TrimSpaces, /// number the rows - #[arg(short, long, default_value_t = false)] - pub number_rows: bool, + #[arg(short, long, default_value_t = NumberRows::None)] + pub number_rows: NumberRows, } diff --git a/src/xlsxtocsv.rs b/src/xlsxtocsv.rs index 5ecb723..97ed067 100644 --- a/src/xlsxtocsv.rs +++ b/src/xlsxtocsv.rs @@ -1,7 +1,7 @@ use std::path::Path; use umya_spreadsheet::{Range, Worksheet, reader}; -use crate::arguments::{Arguments, TrimSpaces}; +use crate::arguments::{Arguments, NumberRows, TrimSpaces}; use crate::error::Error; pub fn xlsxtocsv(args: &Arguments) -> Result<(), Error> { @@ -65,7 +65,9 @@ pub fn xlsxtocsv(args: &Arguments) -> Result<(), Error> { // TODO get every hidden columns // for each row... + let mut seq_row_num = 0; for i in 1..=num_rows { + // Avoid hidden rows if asked for if !args.include_hidden_rows { match sheet.get_row_dimension(&i) { @@ -75,9 +77,8 @@ pub fn xlsxtocsv(args: &Arguments) -> Result<(), Error> { } } None => { - if args.number_rows { - print!("{}{}", i, args.separator); - } + seq_row_num += 1; + number_row(&args.number_rows, args.separator, seq_row_num, i); println!("{}", empty_row); continue; } @@ -85,9 +86,8 @@ pub fn xlsxtocsv(args: &Arguments) -> Result<(), Error> { } // number the row - if args.number_rows { - print!("{}{}", i, args.separator); - } + seq_row_num += 1; + number_row(&args.number_rows, args.separator, seq_row_num, i); // for each column in row... let mut first = true; @@ -147,6 +147,14 @@ pub fn xlsxtocsv(args: &Arguments) -> Result<(), Error> { Ok(()) } +fn number_row(number_row: &NumberRows, separator: char, seqrownum: u32, i: u32) { + match number_row { + NumberRows::AsIs => print!("{}{}", i, separator), + NumberRows::Sequential => print!("{}{}", seqrownum, separator), + NumberRows::None => {}, + } +} + struct MergedCells { merged_cells: Vec, fill_horizontal: bool, diff --git a/test_masque.xlsx b/test_masque.xlsx index ca413f245a212a83539101563511466b0eaf89db..cb2cb9e33c910b0946ec829d8289498f293cf204 100644 GIT binary patch delta 2959 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