科技股票行情

新立科技股票行情

胜宏 生益科技股票行情

言語環境構築 2020/01/31 松山担当

こんにちは、松山本社のSBです。

 

プログラムからExcelを作成するとき、ExcelがインストールされているPC

では、COMインタフェースを使ってExcel作成することができます。

 

ただ、ExcelがインストールされていないPCでExcel作成する要望が

出てきた場合どうしたらよいか?

その方法について調べてみました。

 

ネットで調べてみたところ、MicrosoftのOpen XML SDKというライブラリを使用して実現できそうです。

今回は「Open XML SDK 2.0 for Microsoft Office」を使って、Excelのワークブック編集できるか調べてみます。

 

【環境】

・Windows 8

・Visual Studio 2017 VB.NET

 

【作成するExcel】

今回はテスト調査のため、以下のような簡単なExcelを作成するプログラムを作成してみたいと思います。

【仕様】

・A1セルに「10」を記載。

・A2セルに「20」を記載。

・A3セルに計算式「=SUM(A1, A2)」を記載。

・A3セルの背景色を灰色に設定。

・B1~F1セルに枠線を引く。

・E6にウィンドウ枠の固定設定。

【前準備】

まずは、.NETのライブラリ「Open XML SDK 2.0 for Microsoft Office」をインストールします。

 

Microsoft ダウンロードセンター(http://www.microsoft.com/ja-jp/download/details.aspx?id=5124)

へアクセスして、「OpenXMLSDKv2.msi」をダウンロードしてきます。

 

ダウンロードしてきた「OpenXMLSDKv2.msi」をダブルクリックして起動、インストールします。

次に、Visual Studio .NETの参照設定で「DocumentFormat.OpenXml」を追加します。

参照先のパスは、「OpenXMLSDKv2.msi」のインストールディレクトリの「DocumentFormat.OpenXml.dll」を指定します。

インストールが完了したら、Visual Studio .NETの参照設定を行います。

[ツール]メニュー → [参照設定] で以下の画面が表示されます。

[参照設定画面]

次にプログラムを作成してみましょう。

【プログラムコードの記載】

プログラムコードは、重要と思われる個所をピックアップして記載します。

①まずは、OpenXmlライブラリを使用するために以下をプログラムの冒頭に記載します。

using DocumentFormat.OpenXml.Packaging;

using Ap = DocumentFormat.OpenXml.ExtendedProperties;

using Vt = DocumentFormat.OpenXml.VariantTypes;

using DocumentFormat.OpenXml;

using DocumentFormat.OpenXml.Spreadsheet;

using X14 = DocumentFormat.OpenXml.Office2010.Excel;

using A = DocumentFormat.OpenXml.Drawing;

そして、以下の記載でExcelファイルを新規作成します。

                SpreadsheetDocument package = SpreadsheetDocument.Create(filePath, SpreadsheetDocumentType.Workbook)

②次に、スタイルシート(背景色、罫線)を準備しておきます。

まず背景色と罫線を定義します。

背景色はId2から。罫線はId1から始まります(作成後のExcelで確認)。

                // Fill Id2 背景色グレーの定義ここから

                Fill fill3 = new Fill();

                PatternFill patternFill3 = new PatternFill() { PatternType = PatternValues.Solid };

                ForegroundColor foregroundColor1 = new ForegroundColor() { Rgb = "FFC0C0C0" };//ここで灰色背景色を指定する。

                BackgroundColor backgroundColor1 = new BackgroundColor() { Indexed = (UInt32Value)64U };

                patternFill3.Append(foregroundColor1);

                patternFill3.Append(backgroundColor1);

                fill3.Append(patternFill3);

                fills1.Append(fill3);

                // Fill Id2 背景色グレーの定義ここまで

                //Fill Id3 背景色白の定義ここから

                Fill fill4 = new Fill();

                PatternFill patternFill4 = new PatternFill() { PatternType = PatternValues.Solid };

                ForegroundColor foregroundColor2 = new ForegroundColor() { Theme = (UInt32Value)0U };

                BackgroundColor backgroundColor2 = new BackgroundColor() { Indexed = (UInt32Value)64U };

                patternFill4.Append(foregroundColor2);

                patternFill4.Append(backgroundColor2);

                fill4.Append(patternFill4);

                fills1.Append(fill4);

                //Fill Id3 背景色白の定義ここまで

               ///border Id1 罫線の定義ここから

               Border border2 = new Border();

               LeftBorder leftBorder2 = new LeftBorder() { Style = BorderStyleValues.Thin };

               Color color1 = new Color() { Indexed = (UInt32Value)64U };

               leftBorder2.Append(color1);

               RightBorder rightBorder2 = new RightBorder() { Style = BorderStyleValues.Thin };

              Color color2 = new Color() { Indexed = (UInt32Value)64U };

               rightBorder2.Append(color2);

              TopBorder topBorder2 = new TopBorder() { Style = BorderStyleValues.Thin };

              Color color3 = new Color() { Indexed = (UInt32Value)64U };

              topBorder2.Append(color3);

              BottomBorder bottomBorder2 = new BottomBorder() { Style = BorderStyleValues.Thin };

              Color color4 = new Color() { Indexed = (UInt32Value)64U };

              bottomBorder2.Append(color4);

              DiagonalBorder diagonalBorder2 = new DiagonalBorder();

              border2.Append(leftBorder2);

              border2.Append(rightBorder2);

              border2.Append(topBorder2);

              border2.Append(bottomBorder2);

              border2.Append(diagonalBorder2);

              borders1.Append(border2);

              //border Id1 罫線の定義ここまで

定義した背景色と罫線から、スタイルを定義します。スタイルの定義は、背景色Idと罫線Idを指定して定義します。

スタイルId1から始まります(作成後のExcelで確認)。

            //style Index1 背景色グレー 罫線あり 設定ここから

              CellFormat cellFormat3 = new CellFormat() { NumberFormatId = (UInt32Value)4U, FontId = (UInt32Value)0U, FillId = (UInt32Value)2U, BorderId = (UInt32Value)1U, FormatId = (UInt32Value)0U, ApplyNumberFormat = true, ApplyFont = true, ApplyFill = true, ApplyBorder = true, ApplyAlignment = true };

            //style Index1 背景グレー 罫線あり 設定ここまで

    

            //style Index2 背景色白 罫線あり 設定ここから

            CellFormat cellFormat4 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)1U, FormatId = (UInt32Value)0U, ApplyBorder = true };

            Alignment alignment3 = new Alignment() { Vertical = VerticalAlignmentValues.Center };

            cellFormat4.Append(alignment3);

            //style Index2 背景色白 罫線あり 設定ここまで

    

            //style Index3 背景色白 罫線なし 設定ここから

            CellFormat cellFormat5 = new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)3U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U, ApplyFill = true };

            Alignment alignment4 = new Alignment() { Vertical = VerticalAlignmentValues.Center };

            cellFormat5.Append(alignment4);

            //style Index3 背景色白 罫線なし 設定ここまで

③定義したスタイルを使用して、セルへの値を記載します。

以下は、「StyleIndex = (UInt32Value)1U」の個所で、スタイルId1:style Index1 背景色グレー 罫線あり を指定して

セルA3に、数式「SUM(A1, A2)」を記載しています。

            // Rowオブジェクトを作る

            Row row3 = new Row() { RowIndex = (UInt32Value)3U, Spans = new ListValue () { InnerText = "1:1" }, DyDescent = 0.15D };

            // Cellオブジェクトを作って挿入する

            Cell cell8 = new Cell() { CellReference = "A3", StyleIndex = (UInt32Value)1U };

            CellFormula cellFormula1 = new CellFormula();

            cellFormula1.Text = "SUM(A1, A2)";

            cell8.Append(cellFormula1);

            row3.Append(cell8); 

また、以下は、「StyleIndex = (UInt32Value)2U」の個所で、style Index2 背景色白 罫線あり を指定して

B1~F1まで罫線を記載しています。

            ////罫線ここから 

            Cell cell2 = new Cell() { CellReference = "B1", StyleIndex = (UInt32Value)2U };

            Cell cell3 = new Cell() { CellReference = "C1", StyleIndex = (UInt32Value)2U };

            Cell cell4 = new Cell() { CellReference = "D1", StyleIndex = (UInt32Value)2U };

            Cell cell5 = new Cell() { CellReference = "E1", StyleIndex = (UInt32Value)2U };

            Cell cell6 = new Cell() { CellReference = "F1", StyleIndex = (UInt32Value)2U };

            row1.Append(cell2); 

            row1.Append(cell3); 

            row1.Append(cell4); 

            row1.Append(cell5); 

            row1.Append(cell6); 

            ////罫線ここまで 

ウィンドウ枠の固定は、以下でできます。E6にウィンドウ枠の固定設定しています。

            //ここが「ウィンドウ枠の固定設定E6」

            Pane pane1 = new Pane() { HorizontalSplit = 4, VerticalSplit = 5, TopLeftCell = "E6", ActivePane = PaneValues.BottomRight, State = PaneStateValues.Frozen };

            sheetView1.Append(pane1);

Excelワークブック編集後は、以下でExcelファイルを保存します。

            // ワークブックを保存する

            workbookPart1.Workbook.Save();

【最後に】   

COMインタフェースのExcel作成と比べると、複雑なプログラムコードになることが分りました。

    

ただ、以下の点でメリットがあると感じています。

・ExcelがインストールされていないPCでもExcel作成できる。

・プログラムから複数同時にExcel作成してもエラーにならない。(COMインタフェースでの複数同時Excel作成はエラーになる)

・関数化した処理は、別のプログラムで引用できる。

・COMインタフェースを比べて処理が軽い気がする。

    

今回OpenXmlを調べてみて、よい勉強になりました。

#参考に今回作成したサンプルプログラムを添付いたします。

エクセルが入っていないサーバなのでエクセル作成に迫られた場合に

参考になさっていただければ幸いです。