使用NPOI Excel工具c#删除行

时间:2017-06-21 16:37:15

标签: c# excel apache-poi npoi

我想在数据表中提取一些数据,并希望发送电子邮件。 但是当我提取数据时,excel在提取的数据之间有很多空白。 未提取的数据会产生空行。

当我尝试使用RemoveRow()函数时,它不起作用并且仍然有一个空行。

    private void Email()
    {
        //get the data from database
        DataTable data = GetData();

        int maxLavel = Convert.ToInt32(data.Compute("max([AssignedID])", string.Empty));
        IWorkbook workbook;
        workbook = new HSSFWorkbook();

        for (int Emp = 0; Emp < maxLavel; Emp++)
        {
        ISheet sheet1 = workbook.CreateSheet("Sheet 1");
            int num = 0;

            //make a header row  
            IRow row1 = sheet1.CreateRow(0);
            for (int j = 0; j < data.Columns.Count; j++)
            {

                ICell cell = row1.CreateCell(j);

                String columnName = data.Columns[j].ToString();
                cell.SetCellValue(columnName);
            }
                //loops through data  
                for (int i = 0; i < data.Rows.Count; i++)
                {
                    IRow row = sheet1.CreateRow(i + 1);

                    if (Emp == Convert.ToInt32(data.Rows[i][0]))
                    {
                        num++;
                        ICell cell = row.CreateCell(j);
                        for (int j = 0; j < data.Columns.Count; j++)
                        {

                            sheet1.AutoSizeColumn(j); //control cell width
                            String columnName = data.Columns[j].ToString();
                            cell.SetCellValue(data.Rows[i][columnName].ToString());
                        }
                    }

                    else ///here has problems
                    {
                            var row = sheet1.GetRow(i);
                            //sheet1.RemoveRow(row);
                            sheet1.ShiftRows(i + 1, sheet1.LastRowNum + 1, -1);
                    }

                }

                if (num != 0)
                {
                //send email
                }
        }
    }

2 个答案:

答案 0 :(得分:0)

我不确定为什么你需要用不同的内容重新发送同一个文件,而不是简单地发送一个不同的文件,但是你可以尝试在for循环中移动你的工作表的创建,并尝试删除整个工作表代替?例如。像这样的东西:

private void Email()
{
    //get the data from database
    DataTable data = GetData();

    int maxLavel = Convert.ToInt32(data.Compute("max([AssignedID])", string.Empty));
    IWorkbook workbook;
    workbook = new HSSFWorkbook();


    for (int Emp = 0; Emp < maxLavel; Emp++)
    {
        ISheet sheet1 = workbook.CreateSheet("Sheet 1");
        int num = 0;

        //make a header row  
        IRow row1 = sheet1.CreateRow(0);
        for (int j = 0; j < data.Columns.Count; j++)
        {

            ICell cell = row1.CreateCell(j);

            String columnName = data.Columns[j].ToString();
            cell.SetCellValue(columnName);
        }
            //loops through data  
            for (int i = 0; i < data.Rows.Count; i++)
            {
                IRow row = sheet1.CreateRow(i + 1);

                if (Emp == Convert.ToInt32(data.Rows[i][0]))
                {
                    num++;
                    for (int j = 0; j < data.Columns.Count; j++)
                    {
                        ICell cell = row.CreateCell(j);
                        sheet1.AutoSizeColumn(j); //control cell width
                        String columnName = data.Columns[j].ToString();
                        cell.SetCellValue(data.Rows[i][columnName].ToString());
                    }
                }

            }

            if (num != 0)
            {
            //send email
            }

        workbook.remove(sheet1);
    }
}

答案 1 :(得分:0)

我弄明白了......我不需要删除该行。

IRow row = sheet1.CreateRow(i);

这应该改变。

      for (int i = 0; i < data.Rows.Count; i++)
            {
                if (Emp == Convert.ToInt32(data.Rows[i][0]))
                {
                    IRow row = sheet1.CreateRow(row_num);
                    num++; row_num++;
                    for (int j = 0; j < data.Columns.Count; j++)
                    {
                        ICell cell = row.CreateCell(j);
                        sheet1.AutoSizeColumn(j); //control cell width
                        String columnName = data.Columns[j].ToString();
                        cell.SetCellValue(data.Rows[i][columnName].ToString());
                    }
                }

            }