@@ -704,18 +704,14 @@ func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error) {
704704 var (
705705 regSearch bool
706706 result []string
707- inElement string
708- r xlsxRow
709707 )
710708 for _ , r := range reg {
711709 regSearch = r
712710 }
713-
714711 xlsx , err := f .workSheetReader (sheet )
715712 if err != nil {
716713 return result , err
717714 }
718-
719715 name , ok := f .sheetMap [trimSheetName (sheet )]
720716 if ! ok {
721717 return result , nil
@@ -724,6 +720,17 @@ func (f *File) SearchSheet(sheet, value string, reg ...bool) ([]string, error) {
724720 output , _ := xml .Marshal (f .Sheet [name ])
725721 f .saveFileList (name , replaceWorkSheetsRelationshipsNameSpaceBytes (output ))
726722 }
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+ )
727734 xml .NewDecoder (bytes .NewReader (f .readXML (name )))
728735 d := f .sharedStringsReader ()
729736
@@ -1213,6 +1220,71 @@ func (f *File) GetPageLayout(sheet string, opts ...PageLayoutOptionPtr) error {
12131220 return err
12141221}
12151222
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+
12161288// workSheetRelsReader provides a function to get the pointer to the structure
12171289// after deserialization of xl/worksheets/_rels/sheet%d.xml.rels.
12181290func (f * File ) workSheetRelsReader (path string ) * xlsxWorkbookRels {
0 commit comments