如题,要实现的功能描述比较绕口,如图如示:
我们在将汇总的面积填入准备好的Excel表模板后,某些行因为没有面积值(这里预先输入为0,方便计算),需要将行删除再进行输出。
更复杂一点,比如需要根据【现状面积】和【规划面积】2列一起判断,当2者都为0时,则删除当前行。
实现结果如下:
【茶园】行现状用地为0,但规划用地不为0,所以没有被删除。
方法及输入参数
// 删除Excel表中的0值行【指定多个列】
public static void Delete0Row(string excel_path, List<int> init_cols, int start_row = 1)
{
try
{
// 建立 Excel 应用程序对象
Application excelApp = new Application();
// 获取Excel文件名和表名
List<string> files = DecomposeExcel(excel_path);
string excel_name = files[0];
string sheet_name = files[1];
// 打开 Excel 文件
Workbook workbook = excelApp.Workbooks.Open(excel_name);
// 获取工作表
Worksheet worksheet = workbook.Worksheets[sheet_name];
// 打开Excel表格,从下往上进行判断
for (int row = worksheet.UsedRange.Rows.Count; row >= start_row; row--)
{
bool flag = true; // 设定flag,是否都为0
// 获取指定列的值
for (int i = 0; i < init_cols.Count; i++)
{
double in_value = double.Parse(worksheet.Cells[row, init_cols[i]].Value.ToString());
if (in_value != 0)
{
flag = false; // 输入列中,只要有一个不为零,则不删除
}
}
// 如果全为0,则删除行
if (flag)
{
worksheet.Rows[row].Delete();
}
}
// 保存并关闭 Excel 文件和应用程序对象
workbook.Close(true);
excelApp.Quit();
}
catch (Exception ee)
{
MessageBox.Show(ee.Message + ee.StackTrace);
throw;
}
}
// 方法调用
Delete0Row(exl_path, new List<int>() { 6, 8 }, 5);
参数说明:
【init_cols】是选择列的列表,【start_row】是考虑到一般都有表头,标题等,所以不从第1行开始计算起,而是指定从某1行起开始计算。
核心代码说明:
流程比较简单,打开Excel表格,找到指定的列,当所有列的值都为0时,则删除当前行。
这些内容在之前的文章中都有提到,不过这里有一个地方需要注意,因为流程中涉及到对行的删除,删除当前行后,后面的行会发生变化。比如,删除第5行,则第7行会变成第6行,在这个过程中,不断有行被删除,后面获取的当前会发生变化。
这个影响是很麻烦的,因为我们删除行:
worksheet.Rows[row].Delete();
就是通过获取当前行进行的,因此会产生错误。
所以这里采取了倒置的方式,就是从最后一行开始算起,从下往上删,完美的避免了以上问题,机智。
for (int row = worksheet.UsedRange.Rows.Count; row >= start_row; row--)