2015-12-04 16 views
12

私はEPPlusを使用してdatableするために、Excelからデータを読んでいます。Epplusを使用して修正されたExcelの実際の使用範囲を取得するにはどうすればよいですか?

10行のレコードでExcelシートを読み取った後、既存のデータを削除してExcelシートを修正し、1行だけのデータを保持しました。 しかし、私は修飾を読んでいるが、まだデータテーブルに10行(値と残りとしてヌルフィールドを持つ1)を読み出す優れ。これを制限することができますどのように

? 私はExcelを読むために次のコードを使用しています。 EpplusオープンXMLで、このための任意の等価は、私はExcelを読み取るために相互運用Excelを使用していた場合は

using (var pck = new OfficeOpenXml.ExcelPackage()) 
{ 
    using (var stream = File.OpenRead(FilePath)) 
    { 
     pck.Load(stream); 
    } 
    var ws = pck.Workbook.Worksheets.First();     
    bool hasHeader = true; // adjust it accordingly(this is a simple approach) 
    foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) 
    { 
     DSClientTransmittal.Tables[0].Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); 
    } 
    var startRow = hasHeader ? 2 : 1; 
    for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) 
    { 
     //var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; 
     var wsRow = ws.Cells[rowNum, 1, rowNum, DSClientTransmittal.Tables[0].Columns.Count]; 
     var row = DSClientTransmittal.Tables[0].NewRow(); 
     foreach (var cell in wsRow) 
     { 
      try 
      { 
       object cellValue = cell.Value; 
       //row[cell.Start.Column - 1] = cell.Text; 
       row[cell.Start.Column - 1] = cellValue.ToString().Trim(); 
       //cell.Style.Numberformat.Format = "@"; 
       //row[cell.Start.Column - 1] = cell.Text; 
      } 
      catch (Exception ex) { } 
     } 
     DSClientTransmittal.Tables[0].Rows.Add(row); 
    } 
    pck.Dispose(); 
} 

、同じ問題が

ws.Columns.ClearFormats(); 
xlColCount = ws.UsedRange.Columns.Count; 

よう clearformat()方法で克服してありますか? 変更されたExcelの実際の使用範囲を取得するにはどうすればよいですか?

+0

どのようにデータを削除していますか? – Ernie

+0

寸法はすべてのテストで正しい範囲を返すようです。行を削除して再インポートした後でも。削除後、状況によって寸法が10行表示されますか? –

+0

@PhilipBijker、@ Ernie:削除する必要があるすべてのセルを選択し、行全体ではなく削除キーを押す – Athul

答えて

5

一部のセルでのみデータを削除するときに、行を考慮しないことを示す組み込みの方法はありません。

Dimensionは、あなたが得ることができるように近いですが、行がDimensionに含まれているがあれば列にはデータが含まれているかあれば任意の行の上または下にはデータが含まれています。

あなたはしかし、あなたがforループ内の行をスキップする必要があるかどうかを確認しようとすることができます。説明が行をスキップするための基準を示していない

if(!ws.Cells[rowNum, 1, rowNum, 4].All(c => c.Value == null)) 
{ 
    //Continue adding the row to the table 
} 

が、あなたのアイデアを得る:あなたは、常に最初の4列のデータを削除した場合 たとえば、あなたは試みることができます。

+0

削除する行を指定することはできません。代わりに、4つのws.Dimension.End.Rowを配置する代わりに、削除しますか? – Athul

+0

次のように指定します。「既存のデータを削除して1行だけのデータを保持してExcelシートを修正しました。どのデータが正確に削除されますか?これらは削除された行を処理してforループでスキップする基準でなければなりません。 –

+0

これはランダムテストのようなものでした。セルデータを削除するための事前基準はありませんでした。大量インポートのサンプルデータを含むExcelテンプレートがあります。クライアントの多くは、既存のテンプレートを送信して(一部の行を削除して)編集します。 – Athul

3

まず、私はC#プログラマーではありませんが、Excel VBAスクリプトを使用して動作するソリューションがあると思います。このExcel VBAコードをCで実行したり、C +で同じことを達成する方法を理解することができます。

あなたが持っている問題は、Excelワークシートの加工寸法を処理する方法に関連しています。 100万行目のデータを入力してそのセルを削除すると、Excelはワークシートに100万行を表示します。

このExcel VBAコードをテストし、完全に空のすべての行を正常に削除してから、ワークシートのサイズをリセットしました。

Sub DelEmptyRowsResizeWorksheet() 
    Dim i As Long, iLimit As Long 
    iLimit = ActiveSheet.UsedRange.Rows.Count 
    For i = iLimit To 1 Step -1 
    If Application.CountA(Cells(i, 1).EntireRow) = 0 Then 
     Cells(i, 1).EntireRow.Delete 
    End If 
    Next i 
    iLimit = ActiveSheet.UsedRange.Rows.Count ' resize the worksheet based on the last row with data 
End Sub 

は、まず近く、それを保存して、ブックを再度開き、ワークシートの(右側または列)すべての空の下で行を削除、手動でスクリプトせずにこれを行うにしてください。私はこれもExcelのブックのサイズをリセットすることがわかりました。

関連する問題