2016-06-18 6 views
1

最近、私はExcelファイルのテーブルの内容をフィルタリングする必要がある小さなプロジェクトに着手しました。私はこのプロジェクトにC#とEPPLUSを使い、入力されたExcelテーブルをDatatableに変換して、すべてのデータを処理します。C#でExcelファイルを解釈する

しかし、私がクライアントから受け取ったExcelファイルは、フィラーの説明とその間に空白が入った表の上にテーブルが配置されているという不思議なフォーマットです。私はいくつかのExcelのテーブルを変換の実験を行ってきた

enter image description here

:各Excelファイルは、私がこれまで見てきたものの一例である以下、あまりにもデータを配置する独自の方法を持っているようです私はこれまで見てきたことから、システムは基本的にセルA1から始まるシート上の行ごとのデータを繰り返します。この反復処理中にテーブルを検出し、タイトル/説明/空の行からそれらを分離する方法はありますか?私はテーブルの有無を判断するためにテーブルの境界線を調べることを考えましたが、シナリオDではExcelファイルの中にはテーブルの境界線を設定しないものもありました。

Excelファイルの標準フォーマットに同意することができるようにクライアントに知らせる予定ですが、これはExcelファイルを解釈するための最初のプロジェクトで、小さなメタ質問もあります。やるべき事?私はこれらの異なるExcelフォーマットがビジネスの選択(すなわち、異なる部門からのもの)に起因する可能性があると仮定しているので、クライアントが現在の方法を変更することを納得させることは、この種の問題に過去に遭遇したまたは私は彼らが現在働いているものと一緒に行くべきですか?

+0

私は顧客がその回答を受け入れるとは思わない。私はテーブルをCSVにエクスポートして、CSVをC#にインポートします。テーブルをCSVに保存するために、VBAマクロを記述することができます。 – jdweng

+0

C#からExcelオブジェクトモデルにアクセスすることができますので、期待していたものと妥当な量の偏差しかない場合(たとえば、IsNumeric(Range( "A1")が必要な場合など)、さまざまなタイプのテーブルを識別するロジックを記述できます。テーブルセルではないヘッダーなど)、それをオンラインで検索してください。ただし、クライアントには、文書を解析可能な形式にすることが非常に重要です( – Absinthe

答えて

0

コメントに記載されているように、「テーブル」がばらばらになったセルのクラスタである場合、それは本当に混乱します。可能なさまざまなシナリオを検出しようとすると、非常に精巧なAIを考え出す必要があります。

クライアントに自分の練習を変更させるようなものではないが、ちょっと調整したいと思っているのであれば、私は本当にExcelTablesを使用することをお勧めします。これにより、エクセルはクライアントまたはあなたがテーブルを適用することによって、あなたのために仕事をしました。例えば、ここでは、ワークシートの2つのランダムなテーブルです:私はちょうどコピー

enter image description here

注意/同じセルを貼り付けるには、しかし、私はその後、右上のボタンを経由して、テーブルの両方としてフォーマットされています。これはもっと美しく見せてくれます。実際にはEPPlusで直接参照できるExcelTableオブジェクトが作成されます。 、だから今あなたが参照としてデータを取得することに使用できる行/ COLアドレスを持っていることを

{Name: 'Table1', Address: 'G10:I20', Columns: 3} 
{Name: 'Table2', Address: 'A1:C11', Columns: 3} 

public void Detect_Tables_Test() 
{ 
    //http://stackoverflow.com/questions/37901408/interpreting-an-excel-file-in-c-sharp 
    var fileInfo = new FileInfo(@"c:\temp\DetectTablesTest.xlsx"); 
    using (var pck = new ExcelPackage(fileInfo)) 
    { 
     var workbook = pck.Workbook; 
     var worksheet = workbook.Worksheets.First(); 
     var tables = worksheet.Tables; 

     tables.ToList().ForEach(table => 
     { 
      Console.WriteLine($"{{Name: {table.Name}, Address: {table.Address}, Columns: {table.Columns.Count}}}"); 
     }); 
    } 
} 

出力でこれを与える:ここではそれをデモしますものですその上の説明行を探します。

+0

クライアントは合意しました実際に標準フォーマットを設定することができますこれは興味深いですが、私はEPPlusがこれらのフォーマットされたテーブルを検出して、後でクライアントに示唆するのに便利なことを認識できませんでした。ありがとう! – porkpork