2009-06-18 9 views
15

Utworzyłem dokument Excel za pomocą SDK 2.0 OpenXml, teraz muszę go stylizować, ale nie mogę.Tworzenie dokumentu Excel za pomocą OpenXML sdk 2.0

Nie wiem, jak pomalować kolor tła lub zmienić rozmiar czcionki w różnych komórkach.

Mój kod do utworzenia komórki to:

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

Odpowiedz

18

Uwaga: OpenXML SDK 2.0 jest obecnie w CTP i nie jest dopuszczony do użytku produkcyjnego aż Office2010.

Moja ogólna metoda radzenia sobie z pakietem OpenXML SDK polega na utworzeniu pustego dokumentu i dokumentu z funkcjami, które chciałbyś nauczyć się implementować (np. Kolor tła) i skorzystania z OpenXmlDiff pakietu SDK, aby zobaczyć, jakie zmiany należy wprowadzić być wykonane w celu wdrożenia funkcji.

Jeśli tworzysz dokument od podstaw, możesz użyć narzędzia DocumentReflector do wygenerowania kodu dla domyślnego obiektu Arkusz stylów, a następnie dodać potrzebne style.

Począwszy domyślnie:

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 }, ... 

Dodałem nową czcionkę o rozmiarze 12 i napełnić nowym czerwonym tle (indeksowane wartości 64) oraz dodano nowe CellFormats odwołujące indeks nowy Czcionka i wypełnienie. (Upewnij się, aby zaktualizować licznik zbyt)

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

Następnie w kodzie, I stosuje indeks CellStyle do komórek Chcę sformatować. (nie było już dane w komórkach A2 i A3 komórka A2 dostaje większy rozmiar, A3 ma czerwone tło)

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 Dziękuję bardzo. Twój wpis naprawdę dał mi dobry początek. – horgh

2

Jak określić styl komórki?

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

Here „11U” to wskaźnik oparty na zero z StylesPart.Stylesheet.CellFormats, w którym każdy CellFormat definiuje kombinację numberFormat, czcionka, Wypełnienie i stylów obramowania.

Nie trzeba dodawać wszystkich stylów według programu, zamiast tego można utworzyć plik szablonu xlsx ze wszystkimi potrzebnymi w nim formatami, a następnie określić indeks stylu w programie.

+0

Witaj Hailaing Wang. Nie jestem pewien z tego, o czym wspomniałeś, jak modyfikować styl komórki. Jak uzyskać StyleIndex = 11U. W moim przypadku potrzebuję mieć granicę komórki. Potrzebuję go również mieć niebieskie tło. Czy możesz odpowiedzieć na http://stackoverflow.com/questions/15791732/openxml-sdk-having-borders-for-cell. Z góry dziękuję –

9

Wielkie dzięki za ten artykuł.

Po wielu walczy (i Googling), ale w końcu udało się stworzyć bardzo łatwy w obsłudze klasy C#, który odbywa DataSet i nazwę pliku i tworzy pakietu Office 2007, .xlsx zawierające dane zbiorze danych za .

Nagle proces dodawania funkcji do aplikacji z „Eksport do Excela” staje się tak proste jak ...

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

CreateExcelFile.CreateExcelDocument(ds, excelFilename); 

Mam opublikował pełny kod źródłowy, a także przykład użycia go , na następującej stronie internetowej.

Jest to aplikacja WinForm programu Visual Studio 2008 C#, ale możesz pozwolić Visual Studio uaktualnić ten projekt, jeśli używasz VS2010.

Ciesz się.

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

+0

Ze swojego bloga: * Nie dodałem licencji, ponieważ jest to darmowy kod, którego można używać zgodnie z własnymi potrzebami. * Rzeczywistość prawna: * brak licencji oznacza, że ​​obowiązują domyślne prawa autorskie * (wyłączenie odpowiedzialności - IANAL - Nie jestem prawnikiem) –

Powiązane problemy