@@ -704,18 +704,14 @@ func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error) {
704
704
var (
705
705
regSearch bool
706
706
result []string
707
- inElement string
708
- r xlsxRow
709
707
)
710
708
for _ , r := range reg {
711
709
regSearch = r
712
710
}
713
-
714
711
xlsx , err := f .workSheetReader (sheet )
715
712
if err != nil {
716
713
return result , err
717
714
}
718
-
719
715
name , ok := f .sheetMap [trimSheetName (sheet )]
720
716
if ! ok {
721
717
return result , nil
@@ -724,6 +720,17 @@ func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error) {
724
720
output , _ := xml .Marshal (f .Sheet [name ])
725
721
f .saveFileList (name , replaceWorkSheetsRelationshipsNameSpaceBytes (output ))
726
722
}
723
+ return f .searchSheet (name , value , regSearch )
724
+ }
725
+
726
+ // searchSheet provides a function to get coordinates by given worksheet name,
727
+ // cell value, and regular expression.
728
+ func (f * File ) searchSheet (name , value string , regSearch bool ) ([]string , error ) {
729
+ var (
730
+ inElement string
731
+ result []string
732
+ r xlsxRow
733
+ )
727
734
xml .NewDecoder (bytes .NewReader (f .readXML (name )))
728
735
d := f .sharedStringsReader ()
729
736
@@ -1213,6 +1220,71 @@ func (f *File) GetPageLayout(sheet string, opts ...PageLayoutOptionPtr) error {
1213
1220
return err
1214
1221
}
1215
1222
1223
+ // SetDefinedName provides a function to set the defined names of the workbook
1224
+ // or worksheet. If not specified scopr, the default scope is workbook.
1225
+ // For example:
1226
+ //
1227
+ // f.SetDefinedName(&excelize.DefinedName{
1228
+ // Name: "Amount",
1229
+ // RefersTo: "Sheet1!$A$2:$D$5",
1230
+ // Comment: "defined name comment",
1231
+ // Scope: "Sheet2",
1232
+ // })
1233
+ //
1234
+ func (f * File ) SetDefinedName (definedName * DefinedName ) error {
1235
+ wb := f .workbookReader ()
1236
+ d := xlsxDefinedName {
1237
+ Name : definedName .Name ,
1238
+ Comment : definedName .Comment ,
1239
+ Data : definedName .RefersTo ,
1240
+ }
1241
+ if definedName .Scope != "" {
1242
+ if sheetID := f .GetSheetIndex (definedName .Scope ); sheetID != 0 {
1243
+ sheetID --
1244
+ d .LocalSheetID = & sheetID
1245
+ }
1246
+ }
1247
+ if wb .DefinedNames != nil {
1248
+ for _ , dn := range wb .DefinedNames .DefinedName {
1249
+ var scope string
1250
+ if dn .LocalSheetID != nil {
1251
+ scope = f .GetSheetName (* dn .LocalSheetID + 1 )
1252
+ }
1253
+ if scope == definedName .Scope && dn .Name == definedName .Name {
1254
+ return errors .New ("the same name already exists on scope" )
1255
+ }
1256
+ }
1257
+ wb .DefinedNames .DefinedName = append (wb .DefinedNames .DefinedName , d )
1258
+ return nil
1259
+ }
1260
+ wb .DefinedNames = & xlsxDefinedNames {
1261
+ DefinedName : []xlsxDefinedName {d },
1262
+ }
1263
+ return nil
1264
+ }
1265
+
1266
+ // GetDefinedName provides a function to get the defined names of the workbook
1267
+ // or worksheet.
1268
+ func (f * File ) GetDefinedName () []DefinedName {
1269
+ var definedNames []DefinedName
1270
+ wb := f .workbookReader ()
1271
+ if wb .DefinedNames != nil {
1272
+ for _ , dn := range wb .DefinedNames .DefinedName {
1273
+ definedName := DefinedName {
1274
+ Name : dn .Name ,
1275
+ Comment : dn .Comment ,
1276
+ RefersTo : dn .Data ,
1277
+ Scope : "Workbook" ,
1278
+ }
1279
+ if dn .LocalSheetID != nil {
1280
+ definedName .Scope = f .GetSheetName (* dn .LocalSheetID + 1 )
1281
+ }
1282
+ definedNames = append (definedNames , definedName )
1283
+ }
1284
+ }
1285
+ return definedNames
1286
+ }
1287
+
1216
1288
// workSheetRelsReader provides a function to get the pointer to the structure
1217
1289
// after deserialization of xl/worksheets/_rels/sheet%d.xml.rels.
1218
1290
func (f * File ) workSheetRelsReader (path string ) * xlsxWorkbookRels {
0 commit comments