2


1

OpenXML SDKによってExcel 2007のドキュメントの向きをランドスケープに変更する方法

Excel 2007のドキュメントの向きを横向きに変更するためのサポートが必要です。 これに関する有用な情報は見つかりませんでした。 これにはOpenXML SDKを使用しています。 私が見つけた唯一のもの:新しいワークシートを作成するとき、PageSetup()\ {Orientation = OrientationValue.Landscape};を設定する必要があります。しかし、これは役に立ちません。 誰もがこの問題を手伝ってくれる? ありがとうございました。

2 Answer


3


OrientationValue.Landscapeを使用すると、正しい軌道に乗っています。 すべてのワークシートをループし、PageSetup要素でorientation属性を設定するだけで、すべてのワークシートを横長に設定できます。

    public static void SetLandscape(SpreadsheetDocument document)
        {
            WorkbookPart workbookPart = document.WorkbookPart;
            IEnumerable worksheetIds = workbookPart.Workbook.Descendants().Select(w => w.Id.Value);
            WorksheetPart worksheetPart;
            foreach (string worksheetId in worksheetIds)
            {
                worksheetPart = ((WorksheetPart)workbookPart.GetPartById(worksheetId));
                PageSetup pageSetup = worksheetPart.Worksheet.Descendants().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の空白のドキュメントのデフォルトなので3シート)。 次に、変更を保存し、ストリームをバイト配列として返します。 これを行うと、ファイルをダウンロードできます。 最初からファイルを手動で作成しようとする代わりに、空のファイルを作成して、このようにメモリに開くことをお勧めします。 それはなぜあなたが非常に多くのnullポインタを取得しているのかを説明するでしょう。


2


私は解決します:

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