Создание документа 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;
}
3 ответов
Примечание: OpenXML 2.0 SDK в настоящее время находится в CTP и не лицензируется для использования в производстве до Office2010.
мой общий метод для работы с OpenXML SDK заключается в создании пустого документа и документа только с функциями, которые вы хотели бы узнать, как реализовать (например, цвет фона) и использовать OpenXmlDiff SDK, чтобы увидеть, какие изменения необходимо внести для реализации этой функции.
Если вы создаете документ с нуля, вы можете использовать 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 и А3. Ячейка 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;
большое спасибо за эту статью.
после многих усилий (и Googling), мне, наконец, удалось создать очень простой в использовании класс 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, но вы можете позволить Visual Studio обновить этот проект, если вы используете VS2010.
наслаждайтесь.
http://www.mikesknowledgebase.com/pages/CSharp/ExportToExcel.htm
Как указать стиль ячейки?
new Cell() { CellReference = "B6", StyleIndex = 11U }
здесь "11U"является нулевым индексом StylesPart.Таблица стилей.CellFormats, в котором каждый CellFormat определяет комбинацию стилей NumberFormat, Font, Fill и Border.
вам не нужно добавлять все стили по программе, вместо этого вы можете создать файл шаблона xlsx со всеми форматами, которые вам нужны в нем, а затем указать индекс стиля в вашей программе.