Browse Source

Fix out of range panic when removing formula.
Fix file corruption issue when deleting a sheet containing a formula.

Aplulu 6 năm trước cách đây
mục cha
commit
841ff4a03e
3 tập tin đã thay đổi với 18 bổ sung7 xóa
  1. 16 6
      calcchain.go
  2. 1 1
      cell.go
  3. 1 0
      sheet.go

+ 16 - 6
calcchain.go

@@ -33,14 +33,12 @@ func (f *File) calcChainWriter() {
 
 // deleteCalcChain provides a function to remove cell reference on the
 // calculation chain.
-func (f *File) deleteCalcChain(axis string) {
+func (f *File) deleteCalcChain(index int, axis string) {
 	calc := f.calcChainReader()
 	if calc != nil {
-		for i, c := range calc.C {
-			if c.R == axis {
-				calc.C = append(calc.C[:i], calc.C[i+1:]...)
-			}
-		}
+		calc.C = xlsxCalcChainCollection(calc.C).Filter(func(c xlsxCalcChainC) bool {
+			return !((c.I == index && c.R == axis) || (c.I == index && axis == ""))
+		})
 	}
 	if len(calc.C) == 0 {
 		f.CalcChain = nil
@@ -53,3 +51,15 @@ func (f *File) deleteCalcChain(axis string) {
 		}
 	}
 }
+
+type xlsxCalcChainCollection []xlsxCalcChainC
+
+func (c xlsxCalcChainCollection) Filter(fn func(v xlsxCalcChainC) bool) []xlsxCalcChainC {
+	results := make([]xlsxCalcChainC, 0)
+	for _, v := range c {
+		if fn(v) {
+			results = append(results, v)
+		}
+	}
+	return results
+}

+ 1 - 1
cell.go

@@ -235,7 +235,7 @@ func (f *File) SetCellFormula(sheet, axis, formula string) error {
 	}
 	if formula == "" {
 		cellData.F = nil
-		f.deleteCalcChain(axis)
+		f.deleteCalcChain(f.GetSheetIndex(sheet), axis)
 		return err
 	}
 

+ 1 - 0
sheet.go

@@ -403,6 +403,7 @@ func (f *File) DeleteSheet(name string) {
 			rels := "xl/worksheets/_rels/sheet" + strconv.Itoa(v.SheetID) + ".xml.rels"
 			target := f.deleteSheetFromWorkbookRels(v.ID)
 			f.deleteSheetFromContentTypes(target)
+			f.deleteCalcChain(v.SheetID, "") // Delete CalcChain
 			delete(f.sheetMap, name)
 			delete(f.XLSX, sheet)
 			delete(f.XLSX, rels)