Мне нужна помощь в изменении ориентации документа Excel 2007 на ландшафт. Я не нашел полезной информации об этом. Для этого я использую OpenXML SDK. Единственное, что я нашел: когда я создаю новый рабочий лист, я должен установить PageSetup() {Orientation = OrientationValue.Landscape}; Но это не помогает. Может ли кто-нибудь помочь в решении этой проблемы? Спасибо.Как изменить ориентацию документа Excel на ландшафт OpenXML sdk
ответ
Вы находитесь на правильном пути с 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). Затем я сохраняю свои изменения и возвращаю поток в виде байтового массива. Я делаю это, чтобы файл можно было загрузить. Я рекомендую вам создать пустой файл и открыть его в памяти, как это, вместо того, чтобы вручную пытаться создать файл с нуля. Это объясняет, почему вы получаете так много нулевых указателей.
решаю с:
PageSetup pageSetup = worksheetPart.Worksheet.Descendants<PageSetup>().FirstOrDefault();
if (pageSetup == null)
{
pageSetup = new PageSetup();
pageSetup.Orientation = OrientationValues.Landscape;
worksheetPart.Worksheet.AppendChild(pageSetup);
}
Я предпочитаю этот вариант. как использовать формат SDK и OpenXML намного лучше, чем строить вещи из шаблона в конечном итоге. – ps2goat
Hi amurra! Спасибо за ответ! Я попробовал это, и он падает с NullReferenceException «Ссылка на объект не установлена в экземпляр объекта». на строке pageSetup.Orientation = OrientationValues.Landscape; Почему это произошло? Спасибо. – Paul
Забыл, чтобы добавить чек на null вокруг страницы. Единственное, что я считаю, что элемент PageSetup должен быть потомком Worksheet, поэтому он никогда не должен бросать нулевой указатель, но быть безопасным, если будет добавлена проверка. Я пробовал код в своем проекте и настраивал ориентацию на пейзаж. Если у вас все еще есть проблемы, отправьте код, который вы используете, и я могу посмотреть на него. – amurra
Я пробовал ваше решение, и оно не работает. = (После вызова метода SetLandscape() я не могу открыть свой документ. Он говорит, что этот документ сломан. Почему это происходит? Ошибка с нулевым значением PageSetup Я исправил добавление кода new PageSetup() при создании нового листка. опубликовать полный фрагмент кода для создания документа Excel и изменения ориентации. Спасибо. – Paul