2009-06-18 176 views
15

我已經使用OpenXml SDK 2.0創建了一個Excel文檔,現在我必須設計它的樣式,但我無法做到。使用OpenXml創建Excel文檔sdk 2.0

我不知道如何繪製背景顏色或更改不同單元格中的字體大小。

我的代碼來創建一個細胞是:

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; 
} 

回答

18

注: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; 
+0

+1非常感謝。你的文章的確給我開了個好頭。 – horgh 2012-12-28 00:37:01

2

如何指定單元格樣式?

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

這裏的「11U」是StylesPart.Stylesheet.CellFormats的基於零的索引,其中每個CellFormat限定的NumberFormat,字體的組合,填充和邊框樣式。

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

+0

你好海拉王。我不確定你提到如何修改單元格樣式。你如何獲得StyleIndex = 11U。我所需要的是讓單元格具有邊界。我也需要它有一個藍色的背景。你能回覆http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell。提前致謝 – 2013-04-03 18:52:12

9

非常感謝這篇文章。

了很多努力(和谷歌搜索)之後,我終於成功地創建一個非常易於使用C#類,這需要一個DataSet和文件名,並創建一個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

相關問題