@@ -2,11 +2,11 @@ use std::sync::atomic::{self, AtomicUsize};
2
2
3
3
use super :: { BindInfo , DataChunkHandle , InitInfo , LogicalTypeHandle , TableFunctionInfo , VTab } ;
4
4
use crate :: core:: { Inserter , LogicalTypeId } ;
5
- use calamine:: { open_workbook_auto, DataType , Range , Reader } ;
5
+ use calamine:: { open_workbook_auto, Data , DataType , Range , Reader } ;
6
6
7
7
#[ repr( C ) ]
8
8
struct ExcelBindData {
9
- range : Range < DataType > ,
9
+ range : Range < Data > ,
10
10
width : usize ,
11
11
height : usize ,
12
12
}
@@ -35,7 +35,7 @@ impl VTab for ExcelVTab {
35
35
let mut workbook = open_workbook_auto ( path) ?;
36
36
let range = workbook
37
37
. worksheet_range ( & sheet)
38
- . unwrap_or_else ( || panic ! ( "Can't find sheet: {sheet} ?" ) ) ? ;
38
+ . unwrap_or_else ( |_ | panic ! ( "Can't find sheet: {sheet} ?" ) ) ;
39
39
let _column_count = range. get_size ( ) . 1 ;
40
40
let mut rows = range. rows ( ) ;
41
41
let header = rows. next ( ) . unwrap ( ) ;
@@ -44,7 +44,7 @@ impl VTab for ExcelVTab {
44
44
let mut found = true ;
45
45
for cell in data. iter ( ) {
46
46
match cell {
47
- DataType :: Error ( _) | DataType :: Empty => {
47
+ Data :: Error ( _) | Data :: Empty => {
48
48
found = false ;
49
49
break ;
50
50
}
@@ -58,39 +58,39 @@ impl VTab for ExcelVTab {
58
58
// use the first row as data type
59
59
for ( idx, cell) in data. iter ( ) . enumerate ( ) {
60
60
match cell {
61
- DataType :: String ( _) => {
61
+ Data :: String ( _) => {
62
62
bind. add_result_column (
63
63
header[ idx]
64
64
. get_string ( )
65
65
. unwrap_or_else ( || panic ! ( "idx {idx} header empty?" ) ) ,
66
66
LogicalTypeHandle :: from ( LogicalTypeId :: Varchar ) ,
67
67
) ;
68
68
}
69
- DataType :: Float ( _) => {
69
+ Data :: Float ( _) => {
70
70
bind. add_result_column (
71
71
header[ idx]
72
72
. get_string ( )
73
73
. unwrap_or_else ( || panic ! ( "idx {idx} header empty?" ) ) ,
74
74
LogicalTypeHandle :: from ( LogicalTypeId :: Double ) ,
75
75
) ;
76
76
}
77
- DataType :: Int ( _) => {
77
+ Data :: Int ( _) => {
78
78
bind. add_result_column (
79
79
header[ idx]
80
80
. get_string ( )
81
81
. unwrap_or_else ( || panic ! ( "idx {idx} header empty?" ) ) ,
82
82
LogicalTypeHandle :: from ( LogicalTypeId :: Bigint ) ,
83
83
) ;
84
84
}
85
- DataType :: Bool ( _) => {
85
+ Data :: Bool ( _) => {
86
86
bind. add_result_column (
87
87
header[ idx]
88
88
. get_string ( )
89
89
. unwrap_or_else ( || panic ! ( "idx {idx} header empty?" ) ) ,
90
90
LogicalTypeHandle :: from ( LogicalTypeId :: Boolean ) ,
91
91
) ;
92
92
}
93
- DataType :: DateTime ( _) => {
93
+ Data :: DateTime ( _) => {
94
94
bind. add_result_column (
95
95
header[ idx]
96
96
. get_string ( )
@@ -133,20 +133,21 @@ impl VTab for ExcelVTab {
133
133
continue ;
134
134
}
135
135
match cell. unwrap ( ) {
136
- DataType :: String ( s) => {
136
+ Data :: String ( s) => {
137
137
vector. insert ( j, s. as_str ( ) ) ;
138
138
}
139
- DataType :: Float ( f) => {
139
+ Data :: Float ( f) => {
140
140
vector. as_mut_slice :: < f64 > ( ) [ j] = * f;
141
141
}
142
- DataType :: Int ( ii) => {
142
+ Data :: Int ( ii) => {
143
143
vector. as_mut_slice :: < i64 > ( ) [ j] = * ii;
144
144
}
145
- DataType :: Bool ( b) => {
145
+ Data :: Bool ( b) => {
146
146
vector. as_mut_slice :: < bool > ( ) [ j] = * b;
147
147
}
148
- DataType :: DateTime ( d) => {
149
- vector. as_mut_slice :: < i32 > ( ) [ j] = d. round ( ) as i32 - 25569 ;
148
+ Data :: DateTime ( d) => {
149
+ // 25569 = number of days between Unix and Excel epochs
150
+ vector. as_mut_slice :: < i32 > ( ) [ j] = d. as_f64 ( ) . round ( ) as i32 - 25569 ;
150
151
}
151
152
_ => {
152
153
vector. set_null ( j) ;
0 commit comments