如何设置单元格的背景?

时间:2012-12-27 08:30:53

标签: c# excel openxml

如何在OpenXml中设置一行(或整行)中几个单元格的背景?

阅读了几篇文章:

  1. Coloring cells in excel sheet using openXML in C#
  2. Advanced styling in Excel Open XML
  3. 我仍然无法使其发挥作用。

    我的任务实际上乍一看似乎有点容易,与这些文章中的内容略有不同。上述教程主要展示了如何创建新文档并对其进行样式化。虽然我需要改变现有的样式。

    也就是说,我有一个现有的 xlsx 文档(报告模板)。我使用必要的值填充报告(由于SO open xml excel read cell valueMSDN Working with sheets (Open XML SDK)而设法执行此操作)。但接下来我需要用红色背景标记几行。

    我既不确定是否使用CellStyle,也不会使用CellFormat或其他内容......这就是我现在所做的事情:

    SpreadsheetDocument doc = SpreadsheetDocument.Open("ole.xlsx", true);
    
    Sheet sheet = (Sheet)doc.WorkbookPart
                            .Workbook
                            .Sheets
                            .FirstOrDefault();
    
    WorksheetPart worksheetPart = (WorksheetPart)doc.WorkbookPart
                                                    .GetPartById(sheet.Id);
    Worksheet worksheet = worksheetPart.Worksheet;
    
    
    CellStyle cs = new CellStyle();
    cs.Name = StringValue.FromString("Normal");
    cs.FormatId = 0;
    cs.BuiltinId = 0;
    //where are the style values?
    
    WorkbookStylesPart wbsp = doc.WorkbookPart
                                    .GetPartsOfType<WorkbookStylesPart>()
                                    .FirstOrDefault();
    wbsp.Stylesheet.CellStyles.Append(cs);
    wbsp.Stylesheet.Save();
    
    
    
    Cell cell = GetCell(worksheet, "A", 20);
    cell.StyleIndex = 1U;//get the new cellstyle index somehow
    
    doc.Close();
    

    实际上,我非常欣赏一个更轻量级的简单示例,例如单元格A20或从A20J20的范围。或者可能是一些连续教程的链接。

2 个答案:

答案 0 :(得分:8)

最后我改变主意使用单元格背景并使用了字体。感谢SO Creating Excel document with OpenXml sdk 2.0 foson 的回答,我设法添加了新的Font和新的CellFormat,保留了原始单元格的格式(即更改了字体)只有颜色):

SpreadsheetDocument doc = SpreadsheetDocument.Open("1.xlsx", true);
Sheet sheet = (Sheet)doc.WorkbookPart.Workbook.Sheets.FirstOrDefault();
WorksheetPart worksheetPart = (WorksheetPart)doc.WorkbookPart
                                                .GetPartById(sheet.Id);
Worksheet worksheet = worksheetPart.Worksheet;

WorkbookStylesPart styles = doc.WorkbookPart.WorkbookStylesPart;
Stylesheet stylesheet = styles.Stylesheet;
CellFormats cellformats = stylesheet.CellFormats;
Fonts fonts = stylesheet.Fonts;

UInt32 fontIndex = fonts.Count;
UInt32 formatIndex = cellformats.Count;

Cell cell = GetCell(worksheet, "A", 19);
cell.CellValue = new CellValue(DateTime.Now.ToLongTimeString());
cell.DataType = new EnumValue<CellValues>(CellValues.String);

CellFormat f = (CellFormat)cellformats.ElementAt((int)cell.StyleIndex.Value);

var font = (Font)fonts.ElementAt((int)f.FontId.Value);
var newfont = (Font)font.Clone();
newfont.Color = new Color() { Rgb = new HexBinaryValue("ff0000") };
fonts.Append(newfont);

CellFormat newformat = (CellFormat)f.Clone();
newformat.FontId = fontIndex;
cellformats.Append(newformat);

stylesheet.Save();

cell.StyleIndex = formatIndex;
doc.Close();

答案 1 :(得分:1)

您有3个选择:

  1. 使用MS lib ExcelDataReader,这需要您的服务器安装Office,并且如果您的程序在IIS中运行,则通常无法正常工作。

  2. 使用封闭源代码库。

  3. 使用OpenXML。

使用纯OpenXML尝试我的代码: https://stackoverflow.com/a/59806422/6782249