1package fileio23import (4 "context"5 "path/filepath"6 "testing"78 "github.com/xuri/excelize/v2"910 "src.rest/cat/012/internal/sheet"11)1213// A sheet whose name Excel can't take as is (spaces at its ends, or the14// same as another's but for them and case) gets another, and the15// formulas and named ranges naming it name that one.16func TestXLSXRenamedSheets(t *testing.T) {17 src := build(t, map[string]string{"A1": "1", "A2": "=' Plan'!A2+Plan!A1", "A3": "='Q3 '!A1*2",18 "A4": "=SUM('plan '!A1:A2)", "A5": "=SUM(Slash)+Spaced"})19 book := src.Book()20 book.RenameSheet(src, "Plan")21 for _, sh := range []struct {22 name string23 cells map[string]string24 }{25 {" Plan", map[string]string{"A2": "10"}}, {"Q3 ", map[string]string{"A1": "20", "A2": "30"}},26 {"plan ", map[string]string{"A1": "40", "A2": "50"}},27 } {28 name, cells := sh.name, sh.cells29 s, err := book.AddSheet(name, book.Len())30 if err != nil {31 t.Fatal(err)32 }33 for a, in := range cells {34 s.Set(addr(t, a), in)35 }36 }37 book.DefineName("Slash", book.Lookup("Q3 "), sheet.NewRect(addr(t, "A1"), addr(t, "A2")))38 book.DefineName("Spaced", book.Lookup(" Plan"), sheet.NewRect(addr(t, "A2"), addr(t, "A2")))39 want := map[string]string{"A2": "11", "A3": "40", "A4": "90", "A5": "60"}40 for a, v := range want {41 if got := shown(src, addr(t, a)); got != v {42 t.Fatalf("%s = %s before export, want %s", a, got, v)43 }44 }45 name := filepath.Join(t.TempDir(), "renamed.xlsx")46 res, err := Export(context.Background(), name, XLSX, SnapBook(src), ExportOptions{})47 if err != nil {48 t.Fatal(err)49 }50 if len(res.Notes) > 0 {51 t.Errorf("notes %q", res.Notes)52 }53 x, err := excelize.OpenFile(name)54 if err != nil {55 t.Fatal(err)56 }57 defer x.Close()58 if f, _ := x.GetCellFormula("Plan", "A2"); f != "'Plan (2)'!A2+Plan!A1" {59 t.Errorf("Excel formula in A2 = %q", f)60 }61 got, err := Import(context.Background(), name, Options{})62 if err != nil {63 t.Fatal(err)64 }65 s := got.Sheet.Book().Lookup("Plan")66 for a, v := range want {67 if g := shown(s, addr(t, a)); g != v {68 t.Errorf("%s = %s after the round trip (%s), want %s", a, g, input(s, addr(t, a)), v)69 }70 }71 if g := input(s, addr(t, "A4")); g != "=SUM('plan (3)'!A1:A2)" {72 t.Errorf("A4 = %q after the round trip", g)73 }74 for n, ws := range map[string]string{"Slash": "Q3", "Spaced": "Plan (2)"} {75 if nm, ok := got.Sheet.Book().LookupName(n); !ok || nm.Sheet.Name() != ws {76 t.Errorf("name %s: %+v", n, nm)77 }78 }79}