C# 如何在ClosedXML中使用渐变填充(GradientFill)

C# 如何在ClosedXML中使用渐变填充(GradientFill),c#,openxml-sdk,closedxml,C#,Openxml Sdk,Closedxml,我正在做一个C#/ASP.NET网站,想做一个Excel导出。首先,我发现了OpenXML,迈出了一些第一步,但它确实很难使用。现在,我正在使用ClosedXML,到目前为止,这让我松了一口气 我提出了一个问题,在表格单元格上有一个渐变填充。。。正常填充没有问题,例如 worksheet.Cell(1,1).Style.Fill.SetBackgroundColor(XLColor.Red); 或者有这样的图案 worksheet.Cell(1,1).Style.Fill.PatternTyp

我正在做一个C#/ASP.NET网站,想做一个Excel导出。首先,我发现了OpenXML,迈出了一些第一步,但它确实很难使用。现在,我正在使用ClosedXML,到目前为止,这让我松了一口气

我提出了一个问题,在表格单元格上有一个渐变填充。。。正常填充没有问题,例如

worksheet.Cell(1,1).Style.Fill.SetBackgroundColor(XLColor.Red);
或者有这样的图案

worksheet.Cell(1,1).Style.Fill.PatternType = XLFillPatternValues.LightHorizontal;
worksheet.Cell(1,1).Style.Fill.PatternColor = XLColor.Green;
worksheet.Cell(1,1).Style.Fill.PatternBackgroundColor = XLColor.White;
但是如何进行渐变填充呢?据我所知,ClosedXML是在OpenXMLSDK上构建的,因此应该可以进行GradientFill—类似(我还不能测试)

GradientFill gFillEx=新的GradientFill();
GradientStop gStop1st=新的GradientStop();
gStop1st.位置=0;
gStop1st.Color=newcolor{Rgb=HexBinaryValue.FromString(“00FF00”)};
GradientStop gStop2nd=新的GradientStop();
gStop2nd.位置=1;
gStop2nd.Color=newcolor{Rgb=HexBinaryValue.FromString(“FFFFFF”)};
gFillEx.InsertAt(gStop1st,0);
gFillEx.插入(gStop2nd,1);
但如何继续-如何将此gFillEx设置为单元格的填充样式?我也不介意直接在这里的某个地方使用styles.xml文件中的xml——如果我知道放在哪里的话


有什么提示或有用的想法吗?谢谢。

在ClosedXML不知道GradientFill之后,由于我没有找到在ClosedXML中操作OpenXML的WorkbookstypeSpart的方法,我最终采用了以下解决方法

首先在内存流中生成.xlsx

public ActionResult XLSX()
{
  System.IO.Stream spreadsheetStream = new System.IO.MemoryStream();
  XLWorkbook workbook = new XLWorkbook();
  IXLWorksheet worksheet = workbook.Worksheets.Add("GradientFillExample");
  worksheet.Cell(1, 1).SetValue("example").Style.Fill.SetBackgroundColor(XLColor.FromHtml("#08F47B")); // use some unique color
  workbook.SaveAs(spreadsheetStream);
这个想法是使用一种独特的填充颜色-我们将用我们想要的渐变填充替换WorkbookStylesPart中的填充。。。因此,我们再次使用OpenXML打开内存流(使用内存流,我们不必关心临时文件),并导航到样式表

  SpreadsheetDocument package = SpreadsheetDocument.Open(spreadsheetStream, true);
  WorkbookPart wbPart = package.GetPartsOfType<WorkbookPart>().FirstOrDefault();
  WorkbookStylesPart wbStylePart = wbPart.GetPartsOfType<WorkbookStylesPart>().FirstOrDefault();
  Stylesheet stylesheet = wbStylePart.Stylesheet; // all three are not null - check if you want
最后,我们可以关闭内存流并将其提供给下载

  spreadsheetStream.Position = 0;
  return new FileStreamResult(spreadsheetStream, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") { FileDownloadName = "gradfillexample.xlsx" };
}
对于测试,只需将该操作放入控制器。别忘了你需要一些用法:

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using ClosedXML.Excel;
有趣的是:你也可以使用除0、90、180、270度以外的其他度数(会产生某种对角线渐变),你甚至可以使用多点渐变,所以类似的东西也是可能的

    GradientFill gradientFill = new GradientFill() { Degree = 354 };
    gradientFill.Append(new GradientStop() { Position = 0D, Color = new Color() { Rgb = "FF00FF00" } });
    gradientFill.Append(new GradientStop() { Position = 0.49D, Color = new Color() { Rgb = "FF00FF00" } });
    gradientFill.Append(new GradientStop() { Position = 0.51D, Color = new Color() { Rgb = "FFFFFFFF" } });
    gradientFill.Append(new GradientStop() { Position = 1D, Color = new Color() { Rgb = "FFFFFFFF" } });
虽然Excel(和Excel Viewer)正确地显示了这一点(度值对应于一个方形单元格,以便可以拉伸其中一个单元格),但您不能在Excel中编辑度值或多点渐变,不过,对于生成的图纸来说,这很好

using DocumentFormat.OpenXml;
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;
using ClosedXML.Excel;
    GradientFill gradientFill = new GradientFill() { Degree = 354 };
    gradientFill.Append(new GradientStop() { Position = 0D, Color = new Color() { Rgb = "FF00FF00" } });
    gradientFill.Append(new GradientStop() { Position = 0.49D, Color = new Color() { Rgb = "FF00FF00" } });
    gradientFill.Append(new GradientStop() { Position = 0.51D, Color = new Color() { Rgb = "FFFFFFFF" } });
    gradientFill.Append(new GradientStop() { Position = 1D, Color = new Color() { Rgb = "FFFFFFFF" } });