Ver código fonte

Merge pull request #313 from sairoutine/feature/get_merge_cells

Add GetMergeCells
xuri 7 anos atrás
pai
commit
3ca3156d45
3 arquivos alterados com 93 adições e 0 exclusões
  1. 40 0
      excelize.go
  2. 53 0
      excelize_test.go
  3. BIN
      test/MergeCell.xlsx

+ 40 - 0
excelize.go

@@ -411,3 +411,43 @@ func (f *File) adjustAutoFilterHelper(xlsx *xlsxWorksheet, column, rowIndex, off
 		}
 	}
 }
+
+// GetMergeCells provides a function to get all merged cells from a worksheet currently.
+func (f *File) GetMergeCells(sheet string) []MergeCell {
+	mergeCells := []MergeCell{}
+
+	xlsx := f.workSheetReader(sheet)
+	if xlsx.MergeCells != nil {
+		for i := 0; i < len(xlsx.MergeCells.Cells); i++ {
+			ref := xlsx.MergeCells.Cells[i].Ref
+			axis := strings.Split(ref, ":")[0]
+			mergeCells = append(mergeCells, []string{ref, f.GetCellValue(sheet, axis)})
+		}
+	}
+
+	return mergeCells
+}
+
+// MergeCell define a merged cell data.
+// It consists of the following structure.
+// example: []string{"D4:E10", "cell value"}
+type MergeCell []string
+
+// GetCellValue returns merged cell value.
+func (m *MergeCell) GetCellValue() string {
+	return (*m)[1]
+}
+
+// GetStartAxis returns the merge start axis.
+// example: "C2"
+func (m *MergeCell) GetStartAxis() string {
+	axis := strings.Split((*m)[0], ":")
+	return axis[0]
+}
+
+// GetEndAxis returns the merge end axis.
+// example: "D4"
+func (m *MergeCell) GetEndAxis() string {
+	axis := strings.Split((*m)[0], ":")
+	return axis[1]
+}

+ 53 - 0
excelize_test.go

@@ -374,6 +374,59 @@ func TestMergeCell(t *testing.T) {
 	}
 }
 
+func TestGetMergeCells(t *testing.T) {
+	wants := []struct {
+		value string
+		start string
+		end   string
+	}{
+		{
+			value: "A1",
+			start: "A1",
+			end:   "B1",
+		},
+		{
+			value: "A2",
+			start: "A2",
+			end:   "A3",
+		},
+		{
+			value: "A4",
+			start: "A4",
+			end:   "B5",
+		},
+		{
+			value: "A7",
+			start: "A7",
+			end:   "C10",
+		},
+	}
+
+	xlsx, err := OpenFile("./test/MergeCell.xlsx")
+	if err != nil {
+		t.Error(err)
+	}
+
+	mergeCells := xlsx.GetMergeCells("Sheet1")
+	if len(mergeCells) != len(wants) {
+		t.Fatalf("Expected count of merge cells %d, but got %d\n", len(wants), len(mergeCells))
+	}
+
+	for i, m := range mergeCells {
+		if wants[i].value != m.GetCellValue() {
+			t.Fatalf("Expected merged cell value %s, but got %s\n", wants[i].value, m.GetCellValue())
+		}
+
+		if wants[i].start != m.GetStartAxis() {
+			t.Fatalf("Expected merged cell value %s, but got %s\n", wants[i].start, m.GetStartAxis())
+		}
+
+		if wants[i].end != m.GetEndAxis() {
+			t.Fatalf("Expected merged cell value %s, but got %s\n", wants[i].end, m.GetEndAxis())
+		}
+	}
+}
+
 func TestSetCellStyleAlignment(t *testing.T) {
 	xlsx, err := OpenFile("./test/Book2.xlsx")
 	if err != nil {

BIN
test/MergeCell.xlsx