16

我已经使用 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;
} 
4

3 回答 3

20

注意:OpenXML 2.0 SDK 目前在 CTP 中,直到 Office2010 才获得生产使用许可。

我处理 OpenXML SDK 的一般方法是创建一个空白文档和一个仅包含您想学习如何实现的功能(如背景颜色)的文档,并使用 SDK 的 OpenXmlDiff 来查看需要进行哪些更改才能实现该功能。

如果您从头开始创建文档,则可以使用 DocumentReflector 为默认 Stylesheet 对象生成代码,然后添加您需要的样式。

从默认开始:

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;
于 2009-06-29T21:12:29.800 回答
10

非常感谢这篇文章。

经过一番挣扎(和谷歌搜索),我终于设法创建了一个非常易于使用的 C# 类,它接受一个数据集和一个文件名,并创建一个包含数据集数据的 Office 2007 .xlsx。

突然间,将功能添加到您的应用程序以“导出到 Excel”的过程变得像...

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

CreateExcelFile.CreateExcelDocument(ds, excelFilename);

我已经在以下网站上发布了完整的源代码以及使用它的示例。

这是一个 Visual Studio 2008 C# WinForms 应用程序,但如果你运行的是 VS2010,你可以让 Visual Studio 升级这个项目。

享受。

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

于 2011-10-27T12:16:50.747 回答
2

如何指定单元格样式?

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

这里的“11U”是 StylesPart.Stylesheet.CellFormats 的从零开始的索引,其中每个 CellFormat 定义了 NumberFormat、Font、Fill 和 Border 样式的组合。

您不必按程序添加所有样式,而是可以创建一个模板 xlsx 文件,其中包含您需要的所有格式,然后在程序中指定样式索引。

于 2009-08-18T05:44:33.043 回答