@@ -637,9 +637,34 @@ type coord struct {
637637 y int
638638}
639639
640+ func makeRelations (fi * File , rsheet * xlsxSheet ) (* xlsxRels , error ) {
641+ rels := new (xlsxRels )
642+
643+ wrap := func (err error ) (* xlsxRels , error ) {
644+ return nil , fmt .Errorf ("makeRelations: %w" , err )
645+ }
646+
647+ relsFile , ok := fi .worksheetRels ["sheet" + rsheet .SheetId ]
648+ if ok {
649+ rc , err := relsFile .Open ()
650+ if err != nil {
651+ return wrap (fmt .Errorf ("file.Open: %w" , err ))
652+ }
653+ defer rc .Close ()
654+
655+ decoder := xml .NewDecoder (rc )
656+ err = decoder .Decode (rels )
657+ if err != nil {
658+ return wrap (fmt .Errorf ("xml.Decoder.Decode: %w" , err ))
659+ }
660+ }
661+
662+ return rels , nil
663+ }
664+
640665type hyperlinkTable map [coord ]Hyperlink
641666
642- func makeHyperlinkTable (worksheet * xlsxWorksheet , fi * File , rsheet * xlsxSheet ) (hyperlinkTable , error ) {
667+ func makeHyperlinkTable (worksheet * xlsxWorksheet , rels * xlsxRels ) (hyperlinkTable , error ) {
643668 wrap := func (err error ) (hyperlinkTable , error ) {
644669 return nil , fmt .Errorf ("makeHyperlinkTable: %w" , err )
645670 }
@@ -648,26 +673,10 @@ func makeHyperlinkTable(worksheet *xlsxWorksheet, fi *File, rsheet *xlsxSheet) (
648673
649674 // Convert xlsxHyperlinks to Hyperlinks
650675 if worksheet .Hyperlinks != nil {
651-
652- worksheetRelsFile , ok := fi .worksheetRels ["sheet" + rsheet .SheetId ]
653- worksheetRels := new (xlsxWorksheetRels )
654- if ok {
655- rc , err := worksheetRelsFile .Open ()
656- if err != nil {
657- return wrap (fmt .Errorf ("file.Open: %w" , err ))
658- }
659- defer rc .Close ()
660-
661- decoder := xml .NewDecoder (rc )
662- err = decoder .Decode (worksheetRels )
663- if err != nil {
664- return wrap (fmt .Errorf ("xml.Decoder.Decode: %w" , err ))
665- }
666- }
667676 for _ , xlsxLink := range worksheet .Hyperlinks .HyperLinks {
668677 newHyperLink := Hyperlink {}
669678
670- for _ , rel := range worksheetRels .Relationships {
679+ for _ , rel := range rels .Relationships {
671680 if rel .Id == xlsxLink .RelationshipId {
672681 newHyperLink .Link = rel .Target
673682 break
@@ -724,12 +733,24 @@ func readSheetFromFile(rsheet xlsxSheet, fi *File, sheetXMLMap map[string]string
724733 return wrap (err )
725734 }
726735
727- linkTable , err := makeHyperlinkTable ( worksheet , fi , & rsheet )
736+ sheet , err = NewSheetWithCellStore ( rsheet . Name , fi . cellStoreConstructor )
728737 if err != nil {
729738 return wrap (err )
730739 }
731740
732- sheet , err = NewSheetWithCellStore (rsheet .Name , fi .cellStoreConstructor )
741+ rels , err := makeRelations (fi , & rsheet )
742+ if err != nil {
743+ return wrap (err )
744+ }
745+ for _ , rel := range rels .Relationships {
746+ sheet .Relations = append (sheet .Relations , Relation {
747+ Type : rel .Type ,
748+ Target : rel .Target ,
749+ TargetMode : rel .TargetMode ,
750+ })
751+ }
752+
753+ linkTable , err := makeHyperlinkTable (worksheet , rels )
733754 if err != nil {
734755 return wrap (err )
735756 }
0 commit comments