Подтвердить что ты не робот

Создание документа Excel с помощью OpenXml sdk 2.0

Я создал документ Excel с использованием OpenXML 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;
} 
4b9b3361

Ответ 1

Примечание. SDK OpenXML 2.0 в настоящее время находится в 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 и новый Fill с красным фоном (индексированное значение 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. Cell 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;

Ответ 2

Большое спасибо за эту статью.

После многих проблем (и Googling) мне удалось создать очень простой в использовании класс С#, который принимает DataSet и имя файла, и создает файл Office.xlsx, содержащий данные DataSet.

Внезапно процесс добавления функции в ваше приложение в "Экспорт в Excel" становится таким же простым, как...

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

CreateExcelFile.CreateExcelDocument(ds, excelFilename);

Я разместил полный исходный код, а также пример его использования на следующем веб-сайте.

Это приложение Visual Studio 2008 С# WinForms, но вы можете позволить Visual Studio обновить этот проект, если вы используете VS2010.

Enjoy.

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

Ответ 3

Как указать стиль ячейки?

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

Здесь "11U" представляет собой индекс на основе нуля StylesPart.Stylesheet.CellFormats, в котором каждый CellFormat определяет комбинацию стилей NumberFormat, Font, Fill и Border.

Вам не нужно добавлять все стили по программе, вместо этого вы можете создать файл шаблона xlsx со всеми необходимыми форматами, а затем указать индекс стиля в своей программе.