@@ -5,11 +5,13 @@ use crate::spreadsheet::{
5
5
} ;
6
6
use calamine:: { open_workbook_auto, DataType , Range , Reader , Sheets } ;
7
7
use std:: path:: Path ;
8
+ use std:: str:: FromStr ;
8
9
9
10
pub struct DataManager {
10
11
sheets : Sheets ,
11
12
worksheet : String ,
12
13
range : Option < CellRange > ,
14
+ colnames_row : Option < u32 > ,
13
15
}
14
16
15
17
pub enum DataManagerError {
@@ -47,9 +49,17 @@ impl DataManager {
47
49
pub fn get_columns ( & mut self ) -> Vec < String > {
48
50
let range = self . get_effective_range ( ) ;
49
51
if range. get_size ( ) . 1 > 0 {
52
+ let row_workspace_sheet = self . colnames_row
53
+ . and_then ( |v| Some ( ( v, self . sheets . worksheet_range ( self . worksheet . as_str ( ) ) ) ) )
54
+ . and_then ( |( row, sheet) | Some ( ( row, sheet?. ok ( ) ?) ) ) ;
50
55
( range. start ( ) . unwrap ( ) . 1 ..=range. end ( ) . unwrap ( ) . 1 )
51
56
. into_iter ( )
52
- . map ( |n| CellIndex :: new ( n + 1 , 1 ) . get_x_as_string ( ) )
57
+ . map ( |n| {
58
+ row_workspace_sheet
59
+ . as_ref ( )
60
+ . and_then ( |( row, sheet) | sheet. get_value ( ( * row, n) ) . map ( |v| v. to_string ( ) ) )
61
+ . unwrap_or_else ( || CellIndex :: new ( n + 1 , 1 ) . get_x_as_string ( ) )
62
+ } )
53
63
. collect ( )
54
64
} else {
55
65
Vec :: new ( )
@@ -68,6 +78,7 @@ pub struct DataManagerBuilder {
68
78
file : Option < String > ,
69
79
worksheet : Option < String > ,
70
80
range : Option < CellRange > ,
81
+ colnames_row : Option < u32 > ,
71
82
}
72
83
73
84
impl DataManagerBuilder {
@@ -89,6 +100,9 @@ impl DataManagerBuilder {
89
100
UsingOption :: Range ( range) => {
90
101
builder = builder. range ( CellRange :: try_parse ( range. as_str ( ) ) . unwrap ( ) ) ;
91
102
}
103
+ UsingOption :: ColNames ( colnames) => {
104
+ builder = builder. colnames_row ( u32:: from_str ( colnames. as_str ( ) ) . unwrap ( ) ) ;
105
+ } ,
92
106
}
93
107
}
94
108
@@ -110,6 +124,11 @@ impl DataManagerBuilder {
110
124
self
111
125
}
112
126
127
+ pub fn colnames_row ( mut self , row : u32 ) -> Self {
128
+ self . colnames_row = Some ( row) ;
129
+ self
130
+ }
131
+
113
132
pub fn open ( self ) -> Result < DataManager , DataManagerError > {
114
133
if let Some ( file) = self . file {
115
134
if let Some ( worksheet) = self . worksheet {
@@ -118,6 +137,7 @@ impl DataManagerBuilder {
118
137
sheets,
119
138
worksheet,
120
139
range : self . range ,
140
+ colnames_row : self . colnames_row ,
121
141
} ) ,
122
142
Err ( err) => Err ( DataManagerError :: Calamine ( err) ) ,
123
143
}
0 commit comments