2017-06-21 179 views
0

データテーブルにデータを抽出して、電子メールを送信したいとします。 しかし、私はデータを抽出するとき、抽出されたデータの間に多くの空白があります。 抽出されないデータは空白の行になります。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 
       } 
     } 
    } 

答えて

0

あなたの代わりに、単純に別のファイルを送信するのと異なる内容で再度、同じファイルを再送信する必要がある理由私はわからないんだけど、あなたは、おそらくのためにループ内であなたのシートの作成を移動してみてください、と試みることができます代わりにシート全体を取り除く?例えば。

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

再度ご確認ください。私はそれを編集する。私はそれが問題ではないことを理解しています。 – Scarlett

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

      } 
関連する問題