@@ -13,6 +13,7 @@ package excelize
13
13
14
14
import (
15
15
"fmt"
16
+ "io"
16
17
"math"
17
18
"strings"
18
19
"unicode/utf16"
@@ -293,36 +294,70 @@ func (f *File) GetDataValidations(sheet string) ([]*DataValidation, error) {
293
294
if err != nil {
294
295
return nil , err
295
296
}
296
- if ws .DataValidations == nil || len (ws .DataValidations .DataValidation ) == 0 {
297
- return nil , err
297
+ var (
298
+ dataValidations []* DataValidation
299
+ decodeExtLst = new (decodeExtLst )
300
+ decodeDataValidations * xlsxDataValidations
301
+ ext * xlsxExt
302
+ )
303
+ if ws .DataValidations != nil {
304
+ dataValidations = append (dataValidations , getDataValidations (ws .DataValidations )... )
298
305
}
299
- var dvs []* DataValidation
300
- for _ , dv := range ws .DataValidations .DataValidation {
301
- if dv != nil {
302
- dataValidation := & DataValidation {
303
- AllowBlank : dv .AllowBlank ,
304
- Error : dv .Error ,
305
- ErrorStyle : dv .ErrorStyle ,
306
- ErrorTitle : dv .ErrorTitle ,
307
- Operator : dv .Operator ,
308
- Prompt : dv .Prompt ,
309
- PromptTitle : dv .PromptTitle ,
310
- ShowDropDown : dv .ShowDropDown ,
311
- ShowErrorMessage : dv .ShowErrorMessage ,
312
- ShowInputMessage : dv .ShowInputMessage ,
313
- Sqref : dv .Sqref ,
314
- Type : dv .Type ,
315
- }
316
- if dv .Formula1 != nil {
317
- dataValidation .Formula1 = unescapeDataValidationFormula (dv .Formula1 .Content )
318
- }
319
- if dv .Formula2 != nil {
320
- dataValidation .Formula2 = unescapeDataValidationFormula (dv .Formula2 .Content )
306
+ if ws .ExtLst != nil {
307
+ if err = f .xmlNewDecoder (strings .NewReader ("<extLst>" + ws .ExtLst .Ext + "</extLst>" )).
308
+ Decode (decodeExtLst ); err != nil && err != io .EOF {
309
+ return dataValidations , err
310
+ }
311
+ for _ , ext = range decodeExtLst .Ext {
312
+ if ext .URI == ExtURIDataValidations {
313
+ decodeDataValidations = new (xlsxDataValidations )
314
+ _ = f .xmlNewDecoder (strings .NewReader (ext .Content )).Decode (decodeDataValidations )
315
+ dataValidations = append (dataValidations , getDataValidations (decodeDataValidations )... )
321
316
}
322
- dvs = append (dvs , dataValidation )
323
317
}
324
318
}
325
- return dvs , err
319
+ return dataValidations , err
320
+ }
321
+
322
+ // getDataValidations returns data validations list by given worksheet data
323
+ // validations.
324
+ func getDataValidations (dvs * xlsxDataValidations ) []* DataValidation {
325
+ if dvs == nil {
326
+ return nil
327
+ }
328
+ var dataValidations []* DataValidation
329
+ for _ , dv := range dvs .DataValidation {
330
+ if dv == nil {
331
+ continue
332
+ }
333
+ dataValidation := & DataValidation {
334
+ AllowBlank : dv .AllowBlank ,
335
+ Error : dv .Error ,
336
+ ErrorStyle : dv .ErrorStyle ,
337
+ ErrorTitle : dv .ErrorTitle ,
338
+ Operator : dv .Operator ,
339
+ Prompt : dv .Prompt ,
340
+ PromptTitle : dv .PromptTitle ,
341
+ ShowDropDown : dv .ShowDropDown ,
342
+ ShowErrorMessage : dv .ShowErrorMessage ,
343
+ ShowInputMessage : dv .ShowInputMessage ,
344
+ Sqref : dv .Sqref ,
345
+ Type : dv .Type ,
346
+ }
347
+ if dv .Formula1 != nil {
348
+ dataValidation .Formula1 = unescapeDataValidationFormula (dv .Formula1 .Content )
349
+ }
350
+ if dv .Formula2 != nil {
351
+ dataValidation .Formula2 = unescapeDataValidationFormula (dv .Formula2 .Content )
352
+ }
353
+ if dv .XMSqref != "" {
354
+ dataValidation .Sqref = dv .XMSqref
355
+ dataValidation .Formula1 = strings .TrimSuffix (strings .TrimPrefix (dataValidation .Formula1 , "<xm:f>" ), "</xm:f>" )
356
+ dataValidation .Formula2 = strings .TrimSuffix (strings .TrimPrefix (dataValidation .Formula2 , "<xm:f>" ), "</xm:f>" )
357
+ }
358
+ dataValidations = append (dataValidations , dataValidation )
359
+ }
360
+ return dataValidations
326
361
}
327
362
328
363
// DeleteDataValidation delete data validation by given worksheet name and
0 commit comments