2010-07-13 4 views
2

Мне нужна помощь в изменении ориентации документа Excel 2007 на ландшафт. Я не нашел полезной информации об этом. Для этого я использую OpenXML SDK. Единственное, что я нашел: когда я создаю новый рабочий лист, я должен установить PageSetup() {Orientation = OrientationValue.Landscape}; Но это не помогает. Может ли кто-нибудь помочь в решении этой проблемы? Спасибо.Как изменить ориентацию документа Excel на ландшафт OpenXML sdk

ответ

3

Вы находитесь на правильном пути с OrientationValue.Landscape. Вам просто нужно перебрать все рабочие листы и установить атрибут ориентации на элемент настройки страницы для того, чтобы установить все рабочие листы пейзаж:

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(); 
     } 

Шаблон я использую для управления документами является первым открытым первенствует и создать пустой документ и сохранить его. Затем я использую свой код, чтобы открыть этот документ и выполнить любую работу, которая мне нужна. Таким образом, мне не нужно беспокоиться о создании элементов и обеспечении того, чтобы все было в нужном месте. Код я использую для достижения этой цели здесь:

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(); 
     } 
    } 

Так вот я открываю файл с диска в поток памяти, чтобы я мог выполнять все изменения в памяти. Затем я передаю этот документ в методе SetLandscape, и он установит свойство landscape на всех трех листах (3 листа, поскольку это значение по умолчанию для чистого документа excel 2007). Затем я сохраняю свои изменения и возвращаю поток в виде байтового массива. Я делаю это, чтобы файл можно было загрузить. Я рекомендую вам создать пустой файл и открыть его в памяти, как это, вместо того, чтобы вручную пытаться создать файл с нуля. Это объясняет, почему вы получаете так много нулевых указателей.

+0

Hi amurra! Спасибо за ответ! Я попробовал это, и он падает с NullReferenceException «Ссылка на объект не установлена ​​в экземпляр объекта». на строке pageSetup.Orientation = OrientationValues.Landscape; Почему это произошло? Спасибо. – Paul

+0

Забыл, чтобы добавить чек на null вокруг страницы. Единственное, что я считаю, что элемент PageSetup должен быть потомком Worksheet, поэтому он никогда не должен бросать нулевой указатель, но быть безопасным, если будет добавлена ​​проверка. Я пробовал код в своем проекте и настраивал ориентацию на пейзаж. Если у вас все еще есть проблемы, отправьте код, который вы используете, и я могу посмотреть на него. – amurra

+0

Я пробовал ваше решение, и оно не работает. = (После вызова метода SetLandscape() я не могу открыть свой документ. Он говорит, что этот документ сломан. Почему это происходит? Ошибка с нулевым значением PageSetup Я исправил добавление кода new PageSetup() при создании нового листка. опубликовать полный фрагмент кода для создания документа Excel и изменения ориентации. Спасибо. – Paul

2

решаю с:

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

Я предпочитаю этот вариант. как использовать формат SDK и OpenXML намного лучше, чем строить вещи из шаблона в конечном итоге. – ps2goat

Смежные вопросы