diff options
Diffstat (limited to 'excelize.go')
-rw-r--r-- | excelize.go | 229 |
1 files changed, 5 insertions, 224 deletions
diff --git a/excelize.go b/excelize.go index feb41cb..7a50460 100644 --- a/excelize.go +++ b/excelize.go @@ -206,235 +206,16 @@ func (f *File) UpdateLinkedValue() { } } -// adjustHelper provides a function to adjust rows and columns dimensions, -// hyperlinks, merged cells and auto filter when inserting or deleting rows or -// columns. -// -// sheet: Worksheet name that we're editing -// column: Index number of the column we're inserting/deleting before -// row: Index number of the row we're inserting/deleting before -// offset: Number of rows/column to insert/delete negative values indicate deletion -// -// TODO: adjustCalcChain, adjustPageBreaks, adjustComments, -// adjustDataValidations, adjustProtectedCells -// -func (f *File) adjustHelper(sheet string, column, row, offset int) { - xlsx := f.workSheetReader(sheet) - f.adjustRowDimensions(xlsx, row, offset) - f.adjustColDimensions(xlsx, column, offset) - f.adjustHyperlinks(sheet, column, row, offset) - f.adjustMergeCells(xlsx, column, row, offset) - f.adjustAutoFilter(xlsx, column, row, offset) - checkSheet(xlsx) - checkRow(xlsx) -} - -// adjustColDimensions provides a function to update column dimensions when -// inserting or deleting rows or columns. -func (f *File) adjustColDimensions(xlsx *xlsxWorksheet, column, offset int) { - for i, r := range xlsx.SheetData.Row { - for k, v := range r.C { - axis := v.R - col := string(strings.Map(letterOnlyMapF, axis)) - row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis)) - yAxis := TitleToNumber(col) - if yAxis >= column && column != -1 { - xlsx.SheetData.Row[i].C[k].R = ToAlphaString(yAxis+offset) + strconv.Itoa(row) - } - } - } -} - -// adjustRowDimensions provides a function to update row dimensions when -// inserting or deleting rows or columns. -func (f *File) adjustRowDimensions(xlsx *xlsxWorksheet, rowIndex, offset int) { - if rowIndex == -1 { - return - } - for i, r := range xlsx.SheetData.Row { - if r.R >= rowIndex { - f.ajustSingleRowDimensions(&xlsx.SheetData.Row[i], r.R+offset) - } - } -} - -// ajustSingleRowDimensions provides a function to ajust single row dimensions. -func (f *File) ajustSingleRowDimensions(r *xlsxRow, row int) { - r.R = row - for i, col := range r.C { - r.C[i].R = string(strings.Map(letterOnlyMapF, col.R)) + strconv.Itoa(r.R) - } -} - -// adjustHyperlinks provides a function to update hyperlinks when inserting or -// deleting rows or columns. -func (f *File) adjustHyperlinks(sheet string, column, rowIndex, offset int) { +// GetMergeCells provides a function to get all merged cells from a worksheet currently. +func (f *File) GetMergeCells(sheet string) []MergeCell { xlsx := f.workSheetReader(sheet) - // order is important - if xlsx.Hyperlinks != nil && offset < 0 { - for i, v := range xlsx.Hyperlinks.Hyperlink { - axis := v.Ref - col := string(strings.Map(letterOnlyMapF, axis)) - row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis)) - yAxis := TitleToNumber(col) - if row == rowIndex || yAxis == column { - f.deleteSheetRelationships(sheet, v.RID) - if len(xlsx.Hyperlinks.Hyperlink) > 1 { - xlsx.Hyperlinks.Hyperlink = append(xlsx.Hyperlinks.Hyperlink[:i], xlsx.Hyperlinks.Hyperlink[i+1:]...) - } else { - xlsx.Hyperlinks = nil - } - } - } - } + var mergeCells []MergeCell - if xlsx.Hyperlinks != nil { - for i, v := range xlsx.Hyperlinks.Hyperlink { - axis := v.Ref - col := string(strings.Map(letterOnlyMapF, axis)) - row, _ := strconv.Atoi(strings.Map(intOnlyMapF, axis)) - xAxis := row + offset - yAxis := TitleToNumber(col) - if rowIndex != -1 && row >= rowIndex { - xlsx.Hyperlinks.Hyperlink[i].Ref = col + strconv.Itoa(xAxis) - } - if column != -1 && yAxis >= column { - xlsx.Hyperlinks.Hyperlink[i].Ref = ToAlphaString(yAxis+offset) + strconv.Itoa(row) - } - } - } -} - -// adjustMergeCellsHelper provides a function to update merged cells when -// inserting or deleting rows or columns. -func (f *File) adjustMergeCellsHelper(xlsx *xlsxWorksheet, column, rowIndex, offset int) { if xlsx.MergeCells != nil { - for k, v := range xlsx.MergeCells.Cells { - beg := strings.Split(v.Ref, ":")[0] - end := strings.Split(v.Ref, ":")[1] - - begcol := string(strings.Map(letterOnlyMapF, beg)) - begrow, _ := strconv.Atoi(strings.Map(intOnlyMapF, beg)) - begxAxis := begrow + offset - begyAxis := TitleToNumber(begcol) - - endcol := string(strings.Map(letterOnlyMapF, end)) - endrow, _ := strconv.Atoi(strings.Map(intOnlyMapF, end)) - endxAxis := endrow + offset - endyAxis := TitleToNumber(endcol) - - if rowIndex != -1 { - if begrow > 1 && begrow >= rowIndex { - beg = begcol + strconv.Itoa(begxAxis) - } - if endrow > 1 && endrow >= rowIndex { - end = endcol + strconv.Itoa(endxAxis) - } - } - - if column != -1 { - if begyAxis >= column { - beg = ToAlphaString(begyAxis+offset) + strconv.Itoa(endrow) - } - if endyAxis >= column { - end = ToAlphaString(endyAxis+offset) + strconv.Itoa(endrow) - } - } - - xlsx.MergeCells.Cells[k].Ref = beg + ":" + end - } - } -} - -// adjustMergeCells provides a function to update merged cells when inserting -// or deleting rows or columns. -func (f *File) adjustMergeCells(xlsx *xlsxWorksheet, column, rowIndex, offset int) { - f.adjustMergeCellsHelper(xlsx, column, rowIndex, offset) - - if xlsx.MergeCells != nil && offset < 0 { - for k, v := range xlsx.MergeCells.Cells { - beg := strings.Split(v.Ref, ":")[0] - end := strings.Split(v.Ref, ":")[1] - if beg == end { - xlsx.MergeCells.Count += offset - if len(xlsx.MergeCells.Cells) > 1 { - xlsx.MergeCells.Cells = append(xlsx.MergeCells.Cells[:k], xlsx.MergeCells.Cells[k+1:]...) - } else { - xlsx.MergeCells = nil - } - } - } - } -} - -// adjustAutoFilter provides a function to update the auto filter when -// inserting or deleting rows or columns. -func (f *File) adjustAutoFilter(xlsx *xlsxWorksheet, column, rowIndex, offset int) { - f.adjustAutoFilterHelper(xlsx, column, rowIndex, offset) - - if xlsx.AutoFilter != nil { - beg := strings.Split(xlsx.AutoFilter.Ref, ":")[0] - end := strings.Split(xlsx.AutoFilter.Ref, ":")[1] + mergeCells = make([]MergeCell, 0, len(xlsx.MergeCells.Cells)) - begcol := string(strings.Map(letterOnlyMapF, beg)) - begrow, _ := strconv.Atoi(strings.Map(intOnlyMapF, beg)) - begxAxis := begrow + offset - - endcol := string(strings.Map(letterOnlyMapF, end)) - endrow, _ := strconv.Atoi(strings.Map(intOnlyMapF, end)) - endxAxis := endrow + offset - endyAxis := TitleToNumber(endcol) - - if rowIndex != -1 { - if begrow >= rowIndex { - beg = begcol + strconv.Itoa(begxAxis) - } - if endrow >= rowIndex { - end = endcol + strconv.Itoa(endxAxis) - } - } - - if column != -1 && endyAxis >= column { - end = ToAlphaString(endyAxis+offset) + strconv.Itoa(endrow) - } - xlsx.AutoFilter.Ref = beg + ":" + end - } -} - -// adjustAutoFilterHelper provides a function to update the auto filter when -// inserting or deleting rows or columns. -func (f *File) adjustAutoFilterHelper(xlsx *xlsxWorksheet, column, rowIndex, offset int) { - if xlsx.AutoFilter != nil { - beg := strings.Split(xlsx.AutoFilter.Ref, ":")[0] - end := strings.Split(xlsx.AutoFilter.Ref, ":")[1] - - begcol := string(strings.Map(letterOnlyMapF, beg)) - begrow, _ := strconv.Atoi(strings.Map(intOnlyMapF, beg)) - begyAxis := TitleToNumber(begcol) - - endcol := string(strings.Map(letterOnlyMapF, end)) - endyAxis := TitleToNumber(endcol) - endrow, _ := strconv.Atoi(strings.Map(intOnlyMapF, end)) - - if (begrow == rowIndex && offset < 0) || (column == begyAxis && column == endyAxis) { - xlsx.AutoFilter = nil - for i, r := range xlsx.SheetData.Row { - if begrow < r.R && r.R <= endrow { - xlsx.SheetData.Row[i].Hidden = false - } - } - } - } -} - -// 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++ { + for i := range xlsx.MergeCells.Cells { ref := xlsx.MergeCells.Cells[i].Ref axis := strings.Split(ref, ":")[0] mergeCells = append(mergeCells, []string{ref, f.GetCellValue(sheet, axis)}) |