为什么我无法删除 Excel 中的行?
Why I can not delete row in Excel?
我使用 EPPlus 使用此代码仅删除索引为 10 的一行:
using (var p = new ExcelPackage(fi))
{
var ws = p.Workbook.Worksheets[1];
ws.DeleteRow(10, 1);
}
当我保存输出文件时,我看到该行存在于文件中:
p.SaveAs(new FileInfo("c:\output.xlsx"));
为什么没有删除行?
我的完整代码是:
using(var p = new ExcelPackage(fi)) {
var ws = p.Workbook.Worksheets[1];
var start = ws.Dimension.Start;
var end = ws.Dimension.End;
for (int row = start.Row + 1; row <= end.Row; row++) {
for (int col = start.Column; col <= end.Column; col++) {
var value = ws.Cells[row, 5].Value ? ? string.Empty;
if (value == null || value == String.Empty || value == "") {
ws.DeleteRow(row, 1);
}
}
}
p.SaveAs(new FileInfo("c:\Projects\excel\output.xlsx"));
}
我尝试删除索引为 5 的列中值为空的所有行
我认为问题在于您是从上到下循环的。当您删除单元格时,excel 将自动向上移动其余行,这将导致从上向下循环时跳过行。
为你的循环试试这个:
for (int row = end.Row; row >= start.Row; row--)
{
var value = ws.Cells[row, 5].Value ?? string.Empty;
if (value.Equals(String.Empty))
{
ws.DeleteRow(row, 1);
}
}
几个旁注:
- 如果您每次都对同一列求值,则无需遍历各列。只需检查每行该单元格的值。
由于 ??
运算符,value
永远不会为 null。您可以简化 if 语句以仅检查 String.Empty
.
String.Empty
和 ""
是相同的值,所以你只需要评估其中之一。
- 评估字符串时,我建议使用
.Equals()
。使用 ==
会导致一些不好的结果。
C# difference between == and Equals()
我使用 EPPlus 使用此代码仅删除索引为 10 的一行:
using (var p = new ExcelPackage(fi))
{
var ws = p.Workbook.Worksheets[1];
ws.DeleteRow(10, 1);
}
当我保存输出文件时,我看到该行存在于文件中:
p.SaveAs(new FileInfo("c:\output.xlsx"));
为什么没有删除行?
我的完整代码是:
using(var p = new ExcelPackage(fi)) {
var ws = p.Workbook.Worksheets[1];
var start = ws.Dimension.Start;
var end = ws.Dimension.End;
for (int row = start.Row + 1; row <= end.Row; row++) {
for (int col = start.Column; col <= end.Column; col++) {
var value = ws.Cells[row, 5].Value ? ? string.Empty;
if (value == null || value == String.Empty || value == "") {
ws.DeleteRow(row, 1);
}
}
}
p.SaveAs(new FileInfo("c:\Projects\excel\output.xlsx"));
}
我尝试删除索引为 5 的列中值为空的所有行
我认为问题在于您是从上到下循环的。当您删除单元格时,excel 将自动向上移动其余行,这将导致从上向下循环时跳过行。
为你的循环试试这个:
for (int row = end.Row; row >= start.Row; row--)
{
var value = ws.Cells[row, 5].Value ?? string.Empty;
if (value.Equals(String.Empty))
{
ws.DeleteRow(row, 1);
}
}
几个旁注:
- 如果您每次都对同一列求值,则无需遍历各列。只需检查每行该单元格的值。 由于
value
永远不会为 null。您可以简化 if 语句以仅检查String.Empty
.String.Empty
和""
是相同的值,所以你只需要评估其中之一。- 评估字符串时,我建议使用
.Equals()
。使用==
会导致一些不好的结果。 C# difference between == and Equals()
??
运算符,