2017-04-26 1 views
1

J'ajoute un nouvel objet ListObject sur la feuille de calcul à partir de la cellule D3, puis crée des colonnes et les lie avec XMLMap. Voici mon code:ListObject contient des en-têtes supplémentaires après l'ajout

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

Et méthode SetColumn:

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

Ce travail de code comme prévu sur la feuille de vide, mais s'il y a des données tableau ci-dessus (par exemple la cellule D2 a une valeur), la la table de liste est déplacée vers le haut et D2 devient le coin supérieur gauche de la table! De plus, si les cellules D1, D2 et E2 ont des valeurs, une colonne supplémentaire pour la table est générée, appelée "Colonne2". Semble Excel essayer d'inclure toutes les données de la plage au-dessus d'une table dans ListObject. Comment l'éviter?

Répondre

0

Ici, il sera probablement nécessaire de dire explicitement où se trouve le Source, sinon Excel choisit lui-même les cellules les plus proches comme source. Dans le code suivant, le Source est défini sur Range[D3]. J'espère que cela fonctionnera correctement avec vos données XML.

La méthode Add a un autre paramètre Destination qui semble être utilisé pour spécifier la cellule supérieure gauche de la table mais je n'ai pas réussi à la faire fonctionner avec le type source xlSrcXml.

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

Il est avéré que je dois spécifier les paramètres Destination et Source ont souligné la même gamme.

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