Как изменить ориентацию документа Excel 2007 на альбомную ориентацию с помощью OpenXML SDK - PullRequest
2 голосов
/ 13 июля 2010

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

Ответы [ 2 ]

3 голосов
/ 13 июля 2010

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

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

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

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, и он устанавливает свойство ландшафта на всех трех листах (3 листа, поскольку это значение по умолчанию для пустого документа Excel 2007).Затем я сохраняю свои изменения и возвращаю поток в виде байтового массива.Я делаю это, чтобы файл мог быть загружен.Я рекомендую вам создать пустой файл и открыть его в памяти, как это, вместо того, чтобы вручную пытаться создать файл с нуля.Это объясняет, почему вы получаете столько нулевых указателей.

2 голосов
/ 28 марта 2014

Я решаю с помощью:

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