c# - EPPlus - 在删除行后向上移动行

标签 c# .net excel epplus epplus-4

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/

相关文章:

.net - 从 USB 内存棒、.net 进行编程

java - 如何使用 API 导出跑道中的评论部分

excel - VBA 400 错误 - 无法调试搜索/复制功能

excel - 如何创建看起来像Excel "From Other Sources"的VSTO功能区库?

c# - 多用户嵌入式数据库

c# - 获取数据集的单元格

c# - 无法将参数传递给存储过程: parameters not supplied

c# - 在没有构造函数的情况下通过反射完全实例化一个对象

c# - 是否有类似 boost::asio for .NET (Mono) 的东西?

c# - 员工 ID 的标准正则表达式