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

гораздо проще просто позвонить

ws.Cells[row, col].Style.Border.BorderAround(ExcelBorderStyle.Thin);

на SpreadsheetDocument построена как сборник WorkbookParts. Один из них WorkbookStylesPart, содержит все стили, используемые в документе. The WorkbookPart содержит листы. Чтобы применить стиль к ячейке или диапазону ячеек, вам нужно установить StyleIndex свойство для соответствующего стиля в WorkbookStylesPart.

этот ответ должен помочь вам вы начали: https://stackoverflow.com/a/11118442/741326