فهرست منبع

Merge pull request #155 from dolmen-go/deepcopy-with-reflect

CopySheet() using reflect instead of encoding/gob
xuri 7 سال پیش
والد
کامیت
5db716d849
3فایلهای تغییر یافته به همراه7 افزوده شده و 22 حذف شده
  1. 0 1
      excelize_test.go
  2. 0 12
      lib.go
  3. 7 9
      sheet.go

+ 0 - 1
excelize_test.go

@@ -88,7 +88,6 @@ func TestOpenFile(t *testing.T) {
 	xlsx.SetCellValue("Sheet2", "F16", true)
 	xlsx.SetCellValue("Sheet2", "F17", complex64(5+10i))
 	t.Log(letterOnlyMapF('x'))
-	t.Log(deepCopy(nil, nil))
 	shiftJulianToNoon(1, -0.6)
 	timeFromExcelTime(61, true)
 	timeFromExcelTime(62, true)

+ 0 - 12
lib.go

@@ -3,7 +3,6 @@ package excelize
 import (
 	"archive/zip"
 	"bytes"
-	"encoding/gob"
 	"io"
 	"log"
 	"math"
@@ -115,17 +114,6 @@ func intOnlyMapF(rune rune) rune {
 	return -1
 }
 
-// deepCopy provides method to creates a deep copy of whatever is passed to it
-// and returns the copy in an interface. The returned value will need to be
-// asserted to the correct type.
-func deepCopy(dst, src interface{}) error {
-	var buf bytes.Buffer
-	if err := gob.NewEncoder(&buf).Encode(src); err != nil {
-		return err
-	}
-	return gob.NewDecoder(bytes.NewBuffer(buf.Bytes())).Decode(dst)
-}
-
 // boolPtr returns a pointer to a bool with the given value.
 func boolPtr(b bool) *bool { return &b }
 

+ 7 - 9
sheet.go

@@ -10,6 +10,8 @@ import (
 	"strconv"
 	"strings"
 	"unicode/utf8"
+
+	"github.com/mohae/deepcopy"
 )
 
 // NewSheet provides function to create a new sheet by given worksheet name,
@@ -433,18 +435,15 @@ func (f *File) CopySheet(from, to int) error {
 	if from < 1 || to < 1 || from == to || f.GetSheetName(from) == "" || f.GetSheetName(to) == "" {
 		return errors.New("Invalid worksheet index")
 	}
-	return f.copySheet(from, to)
+	f.copySheet(from, to)
+	return nil
 }
 
 // copySheet provides function to duplicate a worksheet by gave source and
 // target worksheet name.
-func (f *File) copySheet(from, to int) error {
+func (f *File) copySheet(from, to int) {
 	sheet := f.workSheetReader("sheet" + strconv.Itoa(from))
-	worksheet := xlsxWorksheet{}
-	err := deepCopy(&worksheet, &sheet)
-	if err != nil {
-		return err
-	}
+	worksheet := deepcopy.Copy(sheet).(*xlsxWorksheet)
 	path := "xl/worksheets/sheet" + strconv.Itoa(to) + ".xml"
 	if len(worksheet.SheetViews.SheetView) > 0 {
 		worksheet.SheetViews.SheetView[0].TabSelected = false
@@ -452,14 +451,13 @@ func (f *File) copySheet(from, to int) error {
 	worksheet.Drawing = nil
 	worksheet.TableParts = nil
 	worksheet.PageSetUp = nil
-	f.Sheet[path] = &worksheet
+	f.Sheet[path] = worksheet
 	toRels := "xl/worksheets/_rels/sheet" + strconv.Itoa(to) + ".xml.rels"
 	fromRels := "xl/worksheets/_rels/sheet" + strconv.Itoa(from) + ".xml.rels"
 	_, ok := f.XLSX[fromRels]
 	if ok {
 		f.XLSX[toRels] = f.XLSX[fromRels]
 	}
-	return err
 }
 
 // SetSheetVisible provides function to set worksheet visible by given worksheet