Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/330.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# EPPlus-在DeleteRow之后上移行_C#_.net_Excel_Epplus_Epplus 4 - Fatal编程技术网

C# EPPlus-在DeleteRow之后上移行

C# EPPlus-在DeleteRow之后上移行,c#,.net,excel,epplus,epplus-4,C#,.net,Excel,Epplus,Epplus 4,h3110 3v3ry0n3,尤其是EPPlus团队 我有这样一个Excel模板: _______________________________ | Title 1 | Title 2 | |_______________|_______________| | %Placeholder% | %Placeholder% | |_______________|_______________| | Special cell | Special cell | |____

h3110 3v3ry0n3,尤其是EPPlus团队

我有这样一个Excel模板:

 _______________________________
|    Title 1    |    Title 2    |
|_______________|_______________|
| %Placeholder% | %Placeholder% |
|_______________|_______________|
| Special cell  | Special cell  |
|_______________|_______________|
特殊单元格-带有一些数据验证和数据列表的空单元格

因此,此模板具有双重用途:

  • 以编程方式填充数据(替换占位符%s)或
  • 手动填写(通过选择特殊单元格中的列表)
在第二种情况下,我调用
sheet.DeleteRow(1)
,并期望特殊的第3行变成第2行(上移),但这不会发生。因此,问题是:这是一个bug,我应该发布一个问题,还是有一些解决方法来强制行上移?


这里有一些想法。我想,这可能是由于将特殊细胞视为空细胞所致。可能有一种方法可以将数据验证从第3行复制到第2行?对于更一般的情况,还有另一个类似的问题,删除的行后面似乎没有空行。

似乎是一个已知的问题。如果查看源代码中ExcelWorksheet.cs的当前版本

:

#区域删除行
/// 
///从工作表中删除指定的行。
/// 
///要删除的行
公共void DeleteRow(int行)
{
删除行(第1行);
}
/// 
///从工作表中删除指定的行。
/// 
///起始行
///要删除的行数
公共void DeleteRow(int rowFrom,int rows)
{
CheckSheetType();
if(rowFrom<1 | | rowFrom+rows>ExcelPackage.MaxRows)
{
抛出(新ArgumentException(“行超出范围。范围从1到”+ExcelPackage.MaxRows.ToString(CultureInfo.InvariantCulture));
}
锁(这个)
{
_删除(rowFrom、0、rows、ExcelPackage.MaxColumns);
_Delete(rowFrom、0、rows、ExcelPackage.MaxColumns);
_flags.Delete(rowFrom、0、rows、ExcelPackage.MaxColumns);
_commentsStore.Delete(rowFrom,0,rows,ExcelPackage.MaxColumns);
_删除(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);
调整公式Row(rowFrom,rows);
FixMergedCellsRow(rowFrom、rows、true);
foreach(表中的变量tbl)
{
tbl.Address=tbl.Address.DeleteRow(rowFrom,rows);
}
foreach(数据透视表中的var ptbl)
{
if(ptbl.Address.Start.Row>rowFrom+行)
{
ptbl.Address=ptbl.Address.DeleteRow(rowFrom,rows);
}
}
}
}
没有更新到
公共ExcelDataValidationCollection DataValidations
对象的引用

看看当前的开发分支(现在在github上),似乎下一个版本中会提到它:

其中引用了codeplex上的问题:


因此,您可以尝试重现可能很困难的功能,因为看起来他们必须在几个地方进行更改。或者您尝试从git中获取最新版本并进行编译。

谢谢您的回复!在提出问题之前,我已经尝试引用lib的HEAD版本,但这并不能解决问题
#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);
            }
        }
    }
}