AddVBAProject provides the method to add vbaProject.bin file which contains functions and/or macros. The file extension should be XLSM or XLTM. For example: codeName := "Sheet1" if err := f.SetSheetProps("Sheet1", &excelize.SheetPropsOptions{ CodeName: &codeName, }); err != nil { fmt.P
(file []byte)
| 551 | // return |
| 552 | // } |
| 553 | func (f *File) AddVBAProject(file []byte) error { |
| 554 | var err error |
| 555 | // Check vbaProject.bin exists first. |
| 556 | if !bytes.Contains(file, oleIdentifier) { |
| 557 | return ErrAddVBAProject |
| 558 | } |
| 559 | rels, err := f.relsReader(f.getWorkbookRelsPath()) |
| 560 | if err != nil { |
| 561 | return err |
| 562 | } |
| 563 | rels.mu.Lock() |
| 564 | defer rels.mu.Unlock() |
| 565 | var rID int |
| 566 | var ok bool |
| 567 | for _, rel := range rels.Relationships { |
| 568 | if rel.Target == "vbaProject.bin" && rel.Type == SourceRelationshipVBAProject { |
| 569 | ok = true |
| 570 | continue |
| 571 | } |
| 572 | t, _ := strconv.Atoi(strings.TrimPrefix(rel.ID, "rId")) |
| 573 | if t > rID { |
| 574 | rID = t |
| 575 | } |
| 576 | } |
| 577 | rID++ |
| 578 | if !ok { |
| 579 | rels.Relationships = append(rels.Relationships, xlsxRelationship{ |
| 580 | ID: "rId" + strconv.Itoa(rID), |
| 581 | Target: "vbaProject.bin", |
| 582 | Type: SourceRelationshipVBAProject, |
| 583 | }) |
| 584 | } |
| 585 | f.Pkg.Store("xl/vbaProject.bin", file) |
| 586 | return err |
| 587 | } |
| 588 | |
| 589 | // setContentTypePartProjectExtensions provides a function to set the content |
| 590 | // type for relationship parts and the main document part. |