EPPlus – 在DeleteRow后移动
h3110 3v3ry0n3,特别是EPPlus团队!
我有这样的Excel模板:
_______________________________ | Title 1 | Title 2 | |_______________|_______________| | %Placeholder% | %Placeholder% | |_______________|_______________| | Special cell | Special cell | |_______________|_______________|
特殊单元格 – 包含一些数据validation和数据列表的空单元格。
所以这个模板有两个目的:
- 以编程方式填充数据(replace
%placeholder%s
)或 - 手动填充(通过select特殊单元格中的列表)
在第二种情况下,我调用sheet.DeleteRow(1)
并期望特殊的行#3成为行2(向上移动),但是这不会发生。 所以,问题是: 这是一个错误,我应该发布一个问题或有一些解决方法,强制行向上移动?
这里有一些想法。 我想,这可能是由于特殊的细胞是空的。 可能是,有一种方法可以将数据validation从第3行复制到第2行? 另外还有另一个类似的问题C#ExcelPackage(EPPlus)DeleteRow不会更改表单维度? 对于更一般的情况,似乎没有删除的行后面是空行。
似乎是一个已知的问题。 如果您查看源代码中的ExcelWorksheet.cs的当前版本
https://epplus.codeplex.com/SourceControl/latest#EPPlus/ExcelWorkbook.cs :
#region DeleteRow /// <summary> /// Delete the specified row from the worksheet. /// </summary> /// <param name="row">A row to be deleted</param> public void DeleteRow(int row) { DeleteRow(row, 1); } /// <summary> /// Delete the specified row from the worksheet. /// </summary> /// <param name="rowFrom">The start row</param> /// <param name="rows">Number of rows to delete</param> public void DeleteRow(int rowFrom, int rows) { CheckSheetType(); if (rowFrom < 1 || rowFrom + rows > ExcelPackage.MaxRows) { throw(new ArgumentException("Row out of range. Spans from 1 to " + ExcelPackage.MaxRows.ToString(CultureInfo.InvariantCulture))); } lock (this) { _values.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns); _formulas.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns); _flags.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns); _commentsStore.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns); _hyperLinks.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns); _names.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns); Comments.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns); Workbook.Names.Delete(rowFrom, 0, rows, ExcelPackage.MaxColumns, n => n.Worksheet == this); AdjustFormulasRow(rowFrom, rows); FixMergedCellsRow(rowFrom, rows, true); foreach (var tbl in Tables) { tbl.Address = tbl.Address.DeleteRow(rowFrom, rows); } foreach (var ptbl in PivotTables) { if (ptbl.Address.Start.Row > rowFrom + rows) { ptbl.Address = ptbl.Address.DeleteRow(rowFrom, rows); } } } }
没有更新到public ExcelDataValidationCollection DataValidations
对象的引用。
看看当前的开发分支(现在在github上)似乎将在下一个版本中解决:
https://github.com/JanKallman/EPPlus/blob/master/EPPlus/ExcelWorksheet.cs#L2551
哪些引用了codeplex上的问题:
https://epplus.codeplex.com/workitem/15573
所以你可以尝试重现function,这可能是困难的,因为它看起来像他们不得不在几个地方做出改变。 或者你试着从git中取出最新的东西并编译。