OpenXML SDK, имеющий границы для ячейки
у меня есть следующий код, который добавляет ячейку со значениями и типом данных для этой ячейки в OpenXML SDK:
Cell cell = InsertCellInWorksheet(column, row, worksheetPart);
cell.CellValue = new CellValue(index.ToString());
cell.DataType = new EnumValue<CellValues>(CellValues.SharedString);
для этой ячейки, как добавить границу с каждой стороны? Я также хотел бы добавить цвет фона в ячейке, а также.
у меня есть следующее, но не уверен, как добавить границу в ячейку:
Borders borders1 = new Borders() { Count = (UInt32Value)1U };
Border border1 = new Border();
LeftBorder leftBorder1 = new LeftBorder();
RightBorder rightBorder1 = new RightBorder();
TopBorder topBorder1 = new TopBorder();
BottomBorder bottomBorder1 = new BottomBorder();
border1.Append(leftBorder1);
border1.Append(rightBorder1);
border1.Append(topBorder1);
border1.Append(bottomBorder1);
borders1.Append(border1);
спасибо заранее
3 ответов
я рекомендую установка инструмент производительности Open XML 2.0. Затем создайте пустой документ Excel, содержащий желаемую границу и цвет. Откройте этот файл в средстве производительности и нажмите кнопку отразить код. Затем он даст вам код C#, который требуется для создания этой границы и цвета фона. Код немного длинноват для публикации, но если вы выполните эти шаги, вы сможете его использовать.
**редактировать**
границы и свойства заливки хранятся в отдельной части под названием WookbookStylesPart
. В этой части вы вставляете тип границы, заливки, шрифта и т. д., который вы хотите применить к ячейке в книге. Эти свойства хранятся в структуре типа массива, где вы получаете доступ к стилю, вставленному с помощью индекса. Поскольку к ячейке может быть применено несколько стилей, a CellFormat
объект, где хранятся все индексы для различных стилей. Как только у вас есть CellFormat
для ячейки, ее индекс должен быть ссылка на фактическую ячейку через StlyeIndex
собственность. Именно так ячейка знает, как применять различные стили к себе.
вот код для создания границы:
public Border GenerateBorder()
{
Border border2 = new Border();
LeftBorder leftBorder2 = new LeftBorder(){ Style = BorderStyleValues.Thin };
Color color1 = new Color(){ Indexed = (UInt32Value)64U };
leftBorder2.Append(color1);
RightBorder rightBorder2 = new RightBorder(){ Style = BorderStyleValues.Thin };
Color color2 = new Color(){ Indexed = (UInt32Value)64U };
rightBorder2.Append(color2);
TopBorder topBorder2 = new TopBorder(){ Style = BorderStyleValues.Thin };
Color color3 = new Color(){ Indexed = (UInt32Value)64U };
topBorder2.Append(color3);
BottomBorder bottomBorder2 = new BottomBorder(){ Style = BorderStyleValues.Thin };
Color color4 = new Color(){ Indexed = (UInt32Value)64U };
bottomBorder2.Append(color4);
DiagonalBorder diagonalBorder2 = new DiagonalBorder();
border2.Append(leftBorder2);
border2.Append(rightBorder2);
border2.Append(topBorder2);
border2.Append(bottomBorder2);
border2.Append(diagonalBorder2);
return borders2;
}
вот код для добавления заливки:
public Fill GenerateFill()
{
Fill fill = new Fill();
PatternFill patternFill = new PatternFill(){ PatternType = PatternValues.Solid };
ForegroundColor foregroundColor1 = new ForegroundColor(){ Rgb = "FFFFFF00" };
BackgroundColor backgroundColor1 = new BackgroundColor(){ Indexed = (UInt32Value)64U };
patternFill.Append(foregroundColor1);
patternFill.Append(backgroundColor1);
fill.Append(patternFill);
return fill;
}
вам понадобится этот код, чтобы вставить границу и заполнить часть стиля:
public uint InsertBorder(WorkbookPart workbookPart, Border border)
{
Borders borders = workbookPart.WorkbookStylesPart.Stylesheet.Elements<Borders>().First();
borders.Append(border);
return (uint)borders.Count++;
}
public uint InsertFill(WorkbookPart workbookPart, Fill fill)
{
Fills fills = workbookPart.WorkbookStylesPart.Stylesheet.Elements<Fills>().First();
fills.Append(fill);
return (uint)fills.Count++;
}
сначала вам нужно будет получить ссылку на ячейку, в которую вы хотите добавить заливку и границу, где находится cellAddress форма "B2":
public Cell GetCell(WorksheetPart workSheetPart, string cellAddress)
{
return workSheetPart.Worksheet.Descendants<Cell>()
.SingleOrDefault(c => cellAddress.Equals(c.CellReference));
}
затем, как только вы получите свой сотовый, вам нужно получить CellFormat
, которые принадлежат к ячейке, а также добавить новый CellFormat
:
public CellFormat GetCellFormat(WorkbookPart workbookPart, uint styleIndex)
{
return workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First().Elements<CellFormat>().ElementAt((int)styleIndex);
}
public uint InsertCellFormat(WorkbookPart workbookPart, CellFormat cellFormat)
{
CellFormats cellFormats = workbookPart.WorkbookStylesPart.Stylesheet.Elements<CellFormats>().First();
cellFormats.Append(cellFormat);
return (uint)cellFormats.Count++;
}
после CellFormat
теперь вы можете изменить свойства заливки и границы. Как только они будут изменены, вам нужно вставить новый CellFormat
а затем укажите индекс этого CellFormat
до StyleIndex
на сотовый. Вот как ячейка будет знать, какие стили применять к себе.
public void SetBorderAndFill(WorkbookPart workbookPart, WorksheetPart workSheetPart)
{
Cell cell = GetCell(workSheetPart, "B2");
CellFormat cellFormat = cell.StyleIndex != null ? GetCellFormat(workbookPart, cell.StyleIndex).CloneNode(true) as CellFormat : new CellFormat();
cellFormat.FillId = InsertFill(workbookPart, GenerateFill());
cellFormat.BorderId = InsertBorder(workbookPart, GenerateBorder());
cell.StyleIndex = InsertCellFormat(workbookPart, cellFormat);
}
на SpreadsheetDocument построена как сборник WorkbookParts. Один из них WorkbookStylesPart, содержит все стили, используемые в документе. The WorkbookPart содержит листы. Чтобы применить стиль к ячейке или диапазону ячеек, вам нужно установить StyleIndex свойство для соответствующего стиля в WorkbookStylesPart.
этот ответ должен помочь вам вы начали: https://stackoverflow.com/a/11118442/741326