C# EPPlus-在DeleteRow之后上移行
h3110 3v3ry0n3,尤其是EPPlus团队 我有这样一个Excel模板: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 | |____
_______________________________
| 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);
}
}
}
}