【问题标题】:How to set cells' background?如何设置单元格的背景?
【发布时间】:2012-12-27 08:30:52
【问题描述】:

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

看过几篇文章:

  1. Coloring cells in excel sheet using openXML in C#
  2. Advanced styling in Excel Open XML

我仍然无法让它工作。

我的任务实际上乍一看似乎更容易一些,并且与那些文章中写的有点不同。上面提到的教程主要展示了如何创建一个新文档并设置它的样式。虽然我需要更改现有样式的样式。

也就是说,我有一个现有的 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。或者可能是指向更多连续教程的链接。

【问题讨论】:

    标签: c# excel openxml


    【解决方案1】:

    最后我改变主意使用单元格背景并使用字体。感谢 fosonSO Creating Excel document with OpenXml sdk 2.0 中的回答,我设法添加了一个新的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();
    

    【讨论】:

    • 问题是关于单元格的背景,但代码只是在谈论字体颜色!!
    • 如需更详细和完整的答案,请参阅here
    【解决方案2】:

    您有 3 个选项:

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

    2. 使用闭源库。

    3. 使用 OpenXML。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-11-24
      • 2020-01-20
      • 2012-09-07
      • 2010-11-21
      • 2011-02-23
      • 2017-12-08
      • 2012-03-05
      相关资源
      最近更新 更多