web-dev-qa-db-ja.com

OpenXml sdk2.0を使用したExcelドキュメントの作成

OpenXml SDK 2.0を使用してExcelドキュメントを作成しましたが、スタイルを設定する必要がありますが、できません。

背景色をペイントする方法や、別のセルのフォントサイズを変更する方法がわかりません。

セルを作成するための私のコードは次のとおりです。

private static Cell CreateTextCell(string header, string text, UInt32Value index)
{
    Cell c = new Cell();
    c.DataType = CellValues.InlineString;
    c.CellReference = header + index;
    InlineString inlineString = new InlineString();
    DocumentFormat.OpenXml.Spreadsheet.Text t = new DocumentFormat.OpenXml.Spreadsheet.Text();
    t.Text = text;
    inlineString.AppendChild(t);
    c.AppendChild(inlineString);
    return c;
} 
16
JAiro

注:OpenXML 2.0 SDKは現在CTPにあり、Office2010まで本番環境での使用が許可されていません。

OpenXML SDKを処理するための私の一般的な方法は、空白のドキュメントと、実装方法(背景色など)を学習したい機能だけを含むドキュメントを作成し、SDKのOpenXmlDiffを使用して、実装するために必要な変更を確認することです。機能。

ドキュメントを最初から作成する場合は、DocumentReflectorを使用してデフォルトのスタイルシートオブジェクトのコードを生成してから、必要なスタイルを追加できます。

デフォルトから開始:

new Stylesheet(
new Fonts(
    new Font(
        new FontSize() { Val = 10D },
        new Color() { Theme = (UInt32Value)1U },
        new FontName() { Val = "Arial" },
        new FontFamilyNumbering() { Val = 2 })
) { Count = (UInt32Value)1U },
new Fills(
    new Fill(
        new PatternFill() { PatternType = PatternValues.None }),
    new Fill(
        new PatternFill() { PatternType = PatternValues.Gray125 })
) { Count = (UInt32Value)2U },
new Borders(...
...
...
new CellFormats(
new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U }) { Count = (UInt32Value)1U }, ...

サイズ12の新しいフォントと赤い背景の新しい塗りつぶし(インデックス値64)を追加し、新しいフォントと塗りつぶしのインデックスを参照する新しいCellFormatsを追加しました。 (カウントも更新してください)

new Stylesheet(
    new Fonts(
        new Font(
            new FontSize() { Val = 10D },
            new Color() { Theme = (UInt32Value)1U },
            new FontName() { Val = "Arial" },
            new FontFamilyNumbering() { Val = 2 }),
        new Font(
            new FontSize() { Val = 12D },
            new Color() { Theme = (UInt32Value)1U },
            new FontName() { Val = "Arial" },
            new FontFamilyNumbering() { Val = 2 })
            ) { Count = (UInt32Value)2U },
    new Fills(
        new Fill(
            new PatternFill() { PatternType = PatternValues.None }),
        new Fill(
            new PatternFill() { PatternType = PatternValues.Gray125 }),
        new Fill(
            new PatternFill() { PatternType = PatternValues.Solid, ForegroundColor = new ForegroundColor() { Rgb = "FFFF0000" }, BackgroundColor = new BackgroundColor() { Indexed = 64 } })
            ) { Count = (UInt32Value)3U },
    new Borders(
        new Border(
            new LeftBorder(), new RightBorder(), new TopBorder(), new BottomBorder(), new DiagonalBorder())
    ) { Count = (UInt32Value)1U },
    new CellStyleFormats(
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U }
    ) { Count = (UInt32Value)1U },
    new CellFormats(
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U },
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)1U, FillId = (UInt32Value)0U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U },
        new CellFormat() { NumberFormatId = (UInt32Value)0U, FontId = (UInt32Value)0U, FillId = (UInt32Value)2U, BorderId = (UInt32Value)0U, FormatId = (UInt32Value)0U }
    ) { Count = (UInt32Value)3U },
    new CellStyles(
        new CellStyle() { Name = "Normal", FormatId = (UInt32Value)0U, BuiltinId = (UInt32Value)0U }
    ) { Count = (UInt32Value)1U },
    new DifferentialFormats() { Count = (UInt32Value)0U },
    new TableStyles() { Count = (UInt32Value)0U, DefaultTableStyle = "TableStyleMedium9", DefaultPivotStyle = "PivotStyleLight16" });

次に、コードで、フォーマットするセルにCellStyleインデックスを適用します:(セルA2とA3にはすでにデータがあります。セルA2はより大きなサイズになり、A3は赤い背景になります)

SheetData sheetData = worksheetPart.Worksheet.GetFirstChild<SheetData>();
sheetData.Descendants<Row>().Where(r => r.RowIndex == 2U).First().Descendants<Cell>().First().StyleIndex = 1U;
sheetData.Descendants<Row>().Where(r => r.RowIndex == 3U).First().Descendants<Cell>().First().StyleIndex = 2U;
19
foson

この記事に感謝します。

多くの苦労(そしてグーグル)の後、私はついにveryの使いやすいC#クラスを作成することができました。これはDataSetとファイル名を取ります、およびDataSetのデータを含むOffice 2007.xlsxを作成します。

突然、アプリケーションに関数を「Excelにエクスポート」に追加するプロセスは次のように簡単になります...

DataSet ds = CreateSampleData();                  //  Your code here !
string excelFilename = "C:\\Sample.xlsx";

CreateExcelFile.CreateExcelDocument(ds, excelFilename);

完全なソースコードとその使用例を次のWebサイトに掲載しました。

これはVisualStudio 2008 C#WinFormsアプリケーションですが、VS2010を実行している場合は、VisualStudioにこのプロジェクトをアップグレードさせることができます。

楽しい。

http://www.mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm

10
Mike Gledhill

セルスタイルを指定するにはどうすればよいですか?

new Cell() { CellReference = "B6", StyleIndex = 11U }

ここで、「11U」は、StylesPart.Stylesheet.CellFormatsのゼロベースのインデックスであり、各CellFormatは、NumberFormat、Font、Fill、およびBorderスタイルの組み合わせを定義します。

プログラムごとにすべてのスタイルを追加する必要はありません。代わりに、必要なすべての形式を含むテンプレートxlsxファイルを作成し、プログラムでスタイルインデックスを指定できます。

2
Hailiang Wang