h3110 3v3ry0n3,尤其是EPPlus团队!
我有一个像这样的 Excel 模板:
_______________________________
| Title 1 | Title 2 |
|_______________|_______________|
| %Placeholder% | %Placeholder% |
|_______________|_______________|
| Special cell | Special cell |
|_______________|_______________|
特殊单元格 - 带有一些数据验证和数据列表的空单元格。
所以,这个模板有双重目的:
- 以编程方式填充数据(替换
%placeholder%s
)或 - 手动填写(通过选择特殊单元格中的列表)
在第二种情况下,我调用 sheet.DeleteRow(1)
并期望特殊行#3 成为行#2(向上移动),但这不会发生。所以,问题是:这是一个错误吗?我应该发布一个问题,或者有一些解决方法可以强制行向上移动?
这里有一些想法。我猜想,这可能是由于将特殊单元格视为空而引起的。可能有一种方法可以将数据验证从第 3 行复制到第 2 行?还有另一个类似的问题C# ExcelPackage (EPPlus) DeleteRow does not change sheet dimension?对于更一般的情况,似乎删除的行后面没有空行。
最佳答案
似乎是一个已知问题。如果查看源代码中当前版本的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
因此,您可以尝试重现该功能,这可能很困难,因为看起来他们必须在多个地方进行更改。或者你尝试从 git 中提取最新版本并编译。
关于c# - EPPlus - 在删除行后向上移动行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46455450/