简体   繁体   English

使用NPOI Excel工具C#删除行

[英]remove the row using NPOI Excel tool c#

I want to extract some data in the datatable, and want to send the email. 我想提取数据表中的一些数据,并希望发送电子邮件。 But when I extract the data, excel has many blanks between the extracted data. 但是当我提取数据时,excel在提取的数据之间有很多空白。 The data which is not extracted make a blank row. 未提取的数据为空白行。

When I try to use RemoveRow() function, it doesn't work and still has a blank row. 当我尝试使用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
                }
        }
    }

I'm not sure why you need to resend the same file again with different contents instead of simply sending a different file, but could you perhaps try moving the creation of your sheet inside the for loop, and try removing the entire sheet instead? 我不确定为什么您需要再次使用不同的内容重新发送同一文件,而不是简单地发送不同的文件,但是您是否可以尝试在for循环内移动工作表的创建,然后尝试删除整个工作表? Eg something like this: 例如这样的事情:

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);
    }
}

I figure it out..I don't need to remove the row. 我知道了..我不需要删除该行。

IRow row = sheet1.CreateRow(i); IRow行= sheet1.CreateRow(i);

This should be changed. 这应该更改。

      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());
                    }
                }

            }

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM