2010-07-13 4 views
2

J'ai besoin d'aide pour modifier l'orientation des documents Excel 2007 en paysage. Je n'ai trouvé aucune information utile à ce sujet. J'utilise OpenXML SDK pour cela. La seule chose que j'ai trouvé: quand je crée une nouvelle feuille de travail, je devrais définir PageSetup() {Orientation = OrientationValue.Landscape}; Mais cela n'aide pas. Quelqu'un peut-il aider avec ce problème? Merci.Comment modifier l'orientation du document Excel vers le paysage par OpenXML sdk

Répondre

3

Vous êtes sur la bonne voie avec OrientationValue.Landscape. Vous avez juste besoin de boucle à travers toutes les feuilles de calcul et définissez l'attribut d'orientation sur l'élément PageSetup afin de mettre toutes les feuilles de paysage:

public static void SetLandscape(SpreadsheetDocument document) 
     { 
      WorkbookPart workbookPart = document.WorkbookPart; 
      IEnumerable<string> worksheetIds = workbookPart.Workbook.Descendants<Sheet>().Select(w => w.Id.Value); 
      WorksheetPart worksheetPart; 
      foreach (string worksheetId in worksheetIds) 
      { 
       worksheetPart = ((WorksheetPart)workbookPart.GetPartById(worksheetId)); 
       PageSetup pageSetup = worksheetPart.Worksheet.Descendants<PageSetup>().FirstOrDefault(); 
       if (pageSetup != null) 
       { 
        pageSetup.Orientation = OrientationValues.Landscape; 
       } 
       worksheetPart.Worksheet.Save(); 
      } 
      workbookPart.Workbook.Save(); 
     } 

Le modèle que j'utilise pour manipuler des documents est d'abord Excel ouvert et créer un document vierge et enregistrez-le. J'utilise ensuite mon code pour ouvrir ce document et faire le travail dont j'ai besoin. De cette façon, je ne dois pas être dérangé avec la création des éléments et s'assurer que les choses sont au bon endroit. Le code que j'utilise pour y parvenir est ici:

public byte[] Export(string pathToExcelFile) 
    { 
     // Open the file from the drive 
     byte[] byteArray = File.ReadAllBytes(pathToExcelFile) 
     using (MemoryStream stream = new MemoryStream()) 
     { 
      stream.Write(byteArray, 0, (int)byteArray.Length); 
      using (SpreadsheetDocument spreadsheetDoc = SpreadsheetDocument.Open(stream, true)) 
      { 
       // Do all work on excel doc here 
       SetLandscape(spreadsheetDoc); 

       // Save all the changes 
      } 

      return stream.ToArray(); 
     } 
    } 

J'ouvre donc ici le fichier du lecteur dans un flux de mémoire je peux effectuer toutes les modifications dans la mémoire. Je passe ensuite ce document dans la méthode SetLandscape et il définit la propriété landscape sur les trois feuilles (3 feuilles étant donné que c'est le document par défaut d'un document excel 2007). Je puis enregistrer mes modifications et retourner le flux en tant que tableau d'octets. Je fais cela pour que le fichier puisse être téléchargé. Je vous recommande de créer un fichier vide et l'ouvrir dans la mémoire comme ceci au lieu d'essayer manuellement de construire le fichier à partir de zéro. Cela expliquerait pourquoi vous obtenez tant de pointeurs NULL.

+0

Salut amurra! Merci pour votre réponse! Je l'ai essayé et il tombe avec NullReferenceException "La référence d'objet n'est pas définie sur une instance d'un objet." sur la ligne pageSetup.Orientation = OrientationValues.Landscape; Pourquoi est-ce arrivé? Merci. – Paul

+0

Ajout d'un chèque pour null autour de la page Configuration. La seule chose est que je crois que l'élément PageSetup est requis pour être un descendant de Worksheet donc il ne devrait jamais jeter un pointeur nul, mais pour être sûr le cas si la vérification est ajoutée. J'ai essayé le code dans mon projet et il a mis l'orientation au paysage. Si vous avez toujours des problèmes, postez le code que vous utilisez et je peux le regarder. – amurra

+0

J'ai essayé votre solution et cela ne fonctionne pas. = (Après l'appel de la méthode SetLandscape() je ne peux pas ouvrir mon document, il dit que le document est cassé, pourquoi ça arrive Bug avec le PageSetup nul J'ai corrigé en ajoutant le code new PageSetup() lors de la création d'une nouvelle feuille de calcul. afficher l'extrait de code complet pour la création d'un document Excel et le changement d'orientation Merci – Paul

2

je résous avec:

PageSetup pageSetup = worksheetPart.Worksheet.Descendants<PageSetup>().FirstOrDefault(); 
if (pageSetup == null) 
{ 
    pageSetup = new PageSetup(); 
    pageSetup.Orientation = OrientationValues.Landscape; 
    worksheetPart.Worksheet.AppendChild(pageSetup); 
} 
+0

Je préfère de loin cette option. comment utiliser le format SDK et OpenXML est beaucoup mieux que de construire des choses à partir d'un modèle, à long terme. – ps2goat

Questions connexes