2017-04-26 12 views
1

D3セルから開始してワークシートに新しいListObjectを追加し、列を作成してXMLMapでバインドします。ここに私のコードは次のとおりです。ListObjectに追加後に余分なヘッダーが含まれています

  Excel.Worksheet sheet = _workbook.Sheets["Data1"]; 
      sheet.Activate(); 
      sheet.get_Range("D3").Select(); 

      var xmlMap = _workbook 
       .XmlMaps 
       .Add(collectionDatablock.GetSchema(), NetworkTree.RootName); 
      xmlMap.Name = collectionDatablock.Name; 

      var listObject = sheet 
       .ListObjects 
       .Cast<Excel.ListObject>() 
       .SingleOrDefault(l => l.Name == "ListName"); 

      listObject?.Delete(); 
      listObject = sheet.ListObjects.Add(); 

      listObject.Name = "ListName"; 

      var column = listObject 
       .ListColumns 
       .Cast<Excel.ListColumn>() 
       .First(); 

      SetColumn(column, xmlMap, "Col1", "/Root/Region/@UniqueName"); 
      var newColumn = listObject.ListColumns.Add(); 
      SetColumn(newColumn, xmlMap, f, solution, "Col2", "/Root/Region/@Code"); 

そして、SetColumn関数方法:

private void SetColumn(Excel.ListColumn column, Excel.XmlMap map, string header, string path) 
    { 
     column.Name = GetColumnCaption(header); 
     column.XPath.SetValue(map, path); 
    } 

このコードの仕事は、空のワークシートではなく、テーブルの上のすべてのデータがある場合に予想されるとして(例えばD2セルに値を持っている)、その後リストテーブルが上に移動し、D2がテーブルの左上隅になります!さらに、D1、D2、およびE2セルに値がある場合、「Column2」と呼ばれるテーブル用の余分な列が生成されます。 Excelがテーブルの上の範囲からのすべてのデータをListObjectに含めるように見えます。それを防ぐ方法は?

答えて

0

ここでは、Sourceがどこにあるかを明示的に言う必要があります。それ以外の場合、Excelは最も近いセルをソースとして自分で選択します。次のコードでは、SourceRange[D3]に設定されています。これはあなたのXMLデータで正しく動作することを願っています。

Addメソッドには、テーブルの左上のセルを指定するために使用されているようだが、source-Type xlSrcXmlで動作させることができなかったその他のパラメータDestinationがあります。

listObject?.Delete(); 
listObject = sheet.ListObjects.Add(Source: ((Worksheet)sheet).Range["D3"]); 
1

それは私が同じ範囲に指摘両方DestinationSourceパラメータを指定する必要があることが判明しました。

var tableCell = sheet.get_Range("D3"); 
listObject = sheet.ListObjects.Add(SourceType: Excel.XlListObjectSourceType.xlSrcRange, Source: tableCell, Destination: tableCell, XlListObjectHasHeaders: Excel.XlYesNoGuess.xlNo); 
関連する問題