Skip to content

Commit 18cd63a

Browse files
authored
This is a breaking change closes qax-os#1332 (qax-os#1333)
This use `InsertRows` instead of `InsertRow`, and using `InsertCols` instead of `InsertCol`
1 parent bef49e4 commit 18cd63a

File tree

6 files changed

+73
-35
lines changed

6 files changed

+73
-35
lines changed

adjust.go

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -42,9 +42,12 @@ func (f *File) adjustHelper(sheet string, dir adjustDirection, num, offset int)
4242
}
4343
sheetID := f.getSheetID(sheet)
4444
if dir == rows {
45-
f.adjustRowDimensions(ws, num, offset)
45+
err = f.adjustRowDimensions(ws, num, offset)
4646
} else {
47-
f.adjustColDimensions(ws, num, offset)
47+
err = f.adjustColDimensions(ws, num, offset)
48+
}
49+
if err != nil {
50+
return err
4851
}
4952
f.adjustHyperlinks(ws, sheet, dir, num, offset)
5053
f.adjustTable(ws, sheet, dir, num, offset)
@@ -69,28 +72,36 @@ func (f *File) adjustHelper(sheet string, dir adjustDirection, num, offset int)
6972

7073
// adjustColDimensions provides a function to update column dimensions when
7174
// inserting or deleting rows or columns.
72-
func (f *File) adjustColDimensions(ws *xlsxWorksheet, col, offset int) {
75+
func (f *File) adjustColDimensions(ws *xlsxWorksheet, col, offset int) error {
7376
for rowIdx := range ws.SheetData.Row {
7477
for colIdx, v := range ws.SheetData.Row[rowIdx].C {
7578
cellCol, cellRow, _ := CellNameToCoordinates(v.R)
7679
if col <= cellCol {
7780
if newCol := cellCol + offset; newCol > 0 {
81+
if newCol > MaxColumns {
82+
return ErrColumnNumber
83+
}
7884
ws.SheetData.Row[rowIdx].C[colIdx].R, _ = CoordinatesToCellName(newCol, cellRow)
7985
}
8086
}
8187
}
8288
}
89+
return nil
8390
}
8491

8592
// adjustRowDimensions provides a function to update row dimensions when
8693
// inserting or deleting rows or columns.
87-
func (f *File) adjustRowDimensions(ws *xlsxWorksheet, row, offset int) {
94+
func (f *File) adjustRowDimensions(ws *xlsxWorksheet, row, offset int) error {
8895
for i := range ws.SheetData.Row {
8996
r := &ws.SheetData.Row[i]
9097
if newRow := r.R + offset; r.R >= row && newRow > 0 {
98+
if newRow >= TotalRows {
99+
return ErrMaxRows
100+
}
91101
f.adjustSingleRowDimensions(r, newRow)
92102
}
93103
}
104+
return nil
94105
}
95106

96107
// adjustSingleRowDimensions provides a function to adjust single row dimensions.

adjust_test.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -349,11 +349,11 @@ func TestAdjustCalcChain(t *testing.T) {
349349
{R: "B2", I: 2}, {R: "B2", I: 1},
350350
},
351351
}
352-
assert.NoError(t, f.InsertCol("Sheet1", "A"))
353-
assert.NoError(t, f.InsertRow("Sheet1", 1))
352+
assert.NoError(t, f.InsertCols("Sheet1", "A", 1))
353+
assert.NoError(t, f.InsertRows("Sheet1", 1, 1))
354354

355355
f.CalcChain.C[1].R = "invalid coordinates"
356-
assert.EqualError(t, f.InsertCol("Sheet1", "A"), newCellNameToCoordinatesError("invalid coordinates", newInvalidCellNameError("invalid coordinates")).Error())
356+
assert.EqualError(t, f.InsertCols("Sheet1", "A", 1), newCellNameToCoordinatesError("invalid coordinates", newInvalidCellNameError("invalid coordinates")).Error())
357357
f.CalcChain = nil
358-
assert.NoError(t, f.InsertCol("Sheet1", "A"))
358+
assert.NoError(t, f.InsertCols("Sheet1", "A", 1))
359359
}

col.go

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -657,16 +657,25 @@ func (f *File) GetColWidth(sheet, col string) (float64, error) {
657657
return defaultColWidth, err
658658
}
659659

660-
// InsertCol provides a function to insert a new column before given column
661-
// index. For example, create a new column before column C in Sheet1:
660+
// InsertCols provides a function to insert new columns before the given column
661+
// name and number of columns. For example, create two columns before column
662+
// C in Sheet1:
662663
//
663-
// err := f.InsertCol("Sheet1", "C")
664-
func (f *File) InsertCol(sheet, col string) error {
664+
// err := f.InsertCols("Sheet1", "C", 2)
665+
//
666+
// Use this method with caution, which will affect changes in references such
667+
// as formulas, charts, and so on. If there is any referenced value of the
668+
// worksheet, it will cause a file error when you open it. The excelize only
669+
// partially updates these references currently.
670+
func (f *File) InsertCols(sheet, col string, n int) error {
665671
num, err := ColumnNameToNumber(col)
666672
if err != nil {
667673
return err
668674
}
669-
return f.adjustHelper(sheet, columns, num, 1)
675+
if n < 1 || n > MaxColumns {
676+
return ErrColumnNumber
677+
}
678+
return f.adjustHelper(sheet, columns, num, n)
670679
}
671680

672681
// RemoveCol provides a function to remove single column by given worksheet

col_test.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -339,7 +339,7 @@ func TestColWidth(t *testing.T) {
339339
convertRowHeightToPixels(0)
340340
}
341341

342-
func TestInsertCol(t *testing.T) {
342+
func TestInsertCols(t *testing.T) {
343343
f := NewFile()
344344
sheet1 := f.GetSheetName(0)
345345

@@ -349,12 +349,16 @@ func TestInsertCol(t *testing.T) {
349349
assert.NoError(t, f.MergeCell(sheet1, "A1", "C3"))
350350

351351
assert.NoError(t, f.AutoFilter(sheet1, "A2", "B2", `{"column":"B","expression":"x != blanks"}`))
352-
assert.NoError(t, f.InsertCol(sheet1, "A"))
352+
assert.NoError(t, f.InsertCols(sheet1, "A", 1))
353353

354354
// Test insert column with illegal cell coordinates.
355-
assert.EqualError(t, f.InsertCol("Sheet1", "*"), newInvalidColumnNameError("*").Error())
355+
assert.EqualError(t, f.InsertCols(sheet1, "*", 1), newInvalidColumnNameError("*").Error())
356356

357-
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertCol.xlsx")))
357+
assert.EqualError(t, f.InsertCols(sheet1, "A", 0), ErrColumnNumber.Error())
358+
assert.EqualError(t, f.InsertCols(sheet1, "A", MaxColumns), ErrColumnNumber.Error())
359+
assert.EqualError(t, f.InsertCols(sheet1, "A", MaxColumns-10), ErrColumnNumber.Error())
360+
361+
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertCols.xlsx")))
358362
}
359363

360364
func TestRemoveCol(t *testing.T) {

rows.go

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -622,21 +622,27 @@ func (f *File) RemoveRow(sheet string, row int) error {
622622
return f.adjustHelper(sheet, rows, row, -1)
623623
}
624624

625-
// InsertRow provides a function to insert a new row after given Excel row
626-
// number starting from 1. For example, create a new row before row 3 in
627-
// Sheet1:
625+
// InsertRows provides a function to insert new rows after the given Excel row
626+
// number starting from 1 and number of rows. For example, create two rows
627+
// before row 3 in Sheet1:
628628
//
629-
// err := f.InsertRow("Sheet1", 3)
629+
// err := f.InsertRows("Sheet1", 3, 2)
630630
//
631631
// Use this method with caution, which will affect changes in references such
632632
// as formulas, charts, and so on. If there is any referenced value of the
633633
// worksheet, it will cause a file error when you open it. The excelize only
634634
// partially updates these references currently.
635-
func (f *File) InsertRow(sheet string, row int) error {
635+
func (f *File) InsertRows(sheet string, row, n int) error {
636636
if row < 1 {
637637
return newInvalidRowNumberError(row)
638638
}
639-
return f.adjustHelper(sheet, rows, row, 1)
639+
if row >= TotalRows || n >= TotalRows {
640+
return ErrMaxRows
641+
}
642+
if n < 1 {
643+
return ErrParameterInvalid
644+
}
645+
return f.adjustHelper(sheet, rows, row, n)
640646
}
641647

642648
// DuplicateRow inserts a copy of specified row (by its Excel row number) below

rows_test.go

Lines changed: 20 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -318,7 +318,7 @@ func TestRemoveRow(t *testing.T) {
318318
assert.EqualError(t, f.RemoveRow("SheetN", 1), `sheet SheetN does not exist`)
319319
}
320320

321-
func TestInsertRow(t *testing.T) {
321+
func TestInsertRows(t *testing.T) {
322322
f := NewFile()
323323
sheet1 := f.GetSheetName(0)
324324
r, err := f.workSheetReader(sheet1)
@@ -331,36 +331,44 @@ func TestInsertRow(t *testing.T) {
331331

332332
assert.NoError(t, f.SetCellHyperLink(sheet1, "A5", "https://github.com/xuri/excelize", "External"))
333333

334-
assert.EqualError(t, f.InsertRow(sheet1, -1), newInvalidRowNumberError(-1).Error())
335-
336-
assert.EqualError(t, f.InsertRow(sheet1, 0), newInvalidRowNumberError(0).Error())
337-
338-
assert.NoError(t, f.InsertRow(sheet1, 1))
334+
assert.NoError(t, f.InsertRows(sheet1, 1, 1))
339335
if !assert.Len(t, r.SheetData.Row, rowCount+1) {
340336
t.FailNow()
341337
}
342338

343-
assert.NoError(t, f.InsertRow(sheet1, 4))
339+
assert.NoError(t, f.InsertRows(sheet1, 4, 1))
344340
if !assert.Len(t, r.SheetData.Row, rowCount+2) {
345341
t.FailNow()
346342
}
347343

348-
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertRow.xlsx")))
344+
assert.NoError(t, f.InsertRows(sheet1, 4, 2))
345+
if !assert.Len(t, r.SheetData.Row, rowCount+4) {
346+
t.FailNow()
347+
}
348+
349+
assert.EqualError(t, f.InsertRows(sheet1, -1, 1), newInvalidRowNumberError(-1).Error())
350+
assert.EqualError(t, f.InsertRows(sheet1, 0, 1), newInvalidRowNumberError(0).Error())
351+
assert.EqualError(t, f.InsertRows(sheet1, 4, 0), ErrParameterInvalid.Error())
352+
assert.EqualError(t, f.InsertRows(sheet1, 4, TotalRows), ErrMaxRows.Error())
353+
assert.EqualError(t, f.InsertRows(sheet1, 4, TotalRows-5), ErrMaxRows.Error())
354+
assert.EqualError(t, f.InsertRows(sheet1, TotalRows, 1), ErrMaxRows.Error())
355+
356+
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertRows.xlsx")))
349357
}
350358

351359
// Test internal structure state after insert operations. It is important
352360
// for insert workflow to be constant to avoid side effect with functions
353361
// related to internal structure.
354-
func TestInsertRowInEmptyFile(t *testing.T) {
362+
func TestInsertRowsInEmptyFile(t *testing.T) {
355363
f := NewFile()
356364
sheet1 := f.GetSheetName(0)
357365
r, err := f.workSheetReader(sheet1)
358366
assert.NoError(t, err)
359-
assert.NoError(t, f.InsertRow(sheet1, 1))
367+
assert.NoError(t, f.InsertRows(sheet1, 1, 1))
360368
assert.Len(t, r.SheetData.Row, 0)
361-
assert.NoError(t, f.InsertRow(sheet1, 2))
369+
assert.NoError(t, f.InsertRows(sheet1, 2, 1))
362370
assert.Len(t, r.SheetData.Row, 0)
363-
assert.NoError(t, f.InsertRow(sheet1, 99))
371+
assert.NoError(t, f.InsertRows(sheet1, 99, 1))
364372
assert.Len(t, r.SheetData.Row, 0)
365373
assert.NoError(t, f.SaveAs(filepath.Join("test", "TestInsertRowInEmptyFile.xlsx")))
366374
}

0 commit comments

Comments
 (0)