2

我需要帮助将 excel 2007 文档方向更改为横向。我没有找到任何有用的信息。我为此使用 OpenXML SDK。我发现的唯一一件事:当我创建一个新的工作表时,我应该设置 PageSetup() { Orientation = OrientationValue.Landscape}; 但这无济于事。任何人都可以帮助解决这个问题吗?谢谢你。

4

2 回答 2

3

我解决了:

PageSetup pageSetup = worksheetPart.Worksheet.Descendants<PageSetup>().FirstOrDefault();
if (pageSetup == null)
{
    pageSetup = new PageSetup();
    pageSetup.Orientation = OrientationValues.Landscape;
    worksheetPart.Worksheet.AppendChild(pageSetup);
}
于 2014-03-27T20:43:38.500 回答
3

您在 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 文档的默认设置)。然后我保存我的更改并将流作为字节数组返回。我这样做是为了可以下载文件。我建议您创建一个空白文件并将其打开到内存中,而不是手动尝试从头开始构建文件。这可以解释为什么你会得到这么多空指针。

于 2010-07-13T13:44:57.750 回答