具有现有背景颜色的单元格中的SetColor问题

时间:2016-08-04 19:41:52

标签: c# excel colors excel-2013 epplus

背景

我们的业务团队最近将用于从我们的Web应用程序导出数据的空白Excel文件的背景颜色从“No Fill”更改为灰色(RGB:217,217,217)颜色。目标是将所有未写入数据的单元格作为导出的一部分写入灰色而不是白色/无填充。奇怪的是,在此更改中,作为导出过程的一部分分配给各个单元格的颜色不再反映分配的实际颜色。导出过程使用EPPLUS 4.1.0(与版本4.0.5,4.0.4相同的结果)和以下代码来设置单元格颜色:

worksheet.Cells["A1:H10"].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
worksheet.Cells["A1:H10"].Style.Fill.BackgroundColor.SetColor(
            System.Drawing.ColorTranslator.FromHtml("#DDEBF7"));

问题

当我在灰色背景上将HTML颜色设置为#DDEBF7(RGB:221,235,247)时,生成的颜色为#A4CAEA(RGB:164,202,234)。如果没有填充背景,则颜色会正确更改(RGB:221,235,247)。

为什么会这样?这个灰色背景是否以某种方式修改了“setcolor”结果,这看起来确实如此,我该如何绕过/避免这种行为?

其他注释

  1. 我们可以将一个单元格块设置为灰色背景颜色,作为导出过程的一部分,但这会对导出的性能产生负面影响。

  2. 我们可以在源文件中保留NO FILL背景,但我们希望业务团队能够控制外观。

  3. 代码

    下面是重现问题所需的代码(假设您在网站目录中有一个名为:EPPlusColorTest.xlsx的Excel文件,其中包含两个名为“NoFillSheet”和“GraySheet”的空白页.GraySheet工作表应该具有背景颜色设置为RGB:217,217,217。

    EPPLUS_ColorTest.aspx

    <%@ Page Language="C#" AutoEventWireup="true" CodeFile="EPPLUS_ColorTest.aspx.cs" Inherits="EPPLUS_ColorTest" %>
    <!DOCTYPE html>
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head runat="server">
    <title></title>
    </head>
    <body>
        <form id="form1" runat="server">
        <div>
            <p>Testing color issues with XLSX Files verses XLSM Files</p>
            <p>Input the HTML Color to test (e.g. #DDEBF7)
                <asp:TextBox runat="server" id="tbxHTMLColor">#DDEBF7</asp:TextBox>
            </p>
            <asp:Button runat="server" id="btnXLSXTest" text="XLSX Test" OnClick="btnXLSXTest_OnClick"/>        
        </div>
        </form>
    </body>
    </html>
    

    EPPLUS_ColorTest.aspx.cs

    using System;
    using System.Web;
    using OfficeOpenXml;
    using System.IO;
    
    public partial class EPPLUS_ColorTest : System.Web.UI.Page
    {   
        protected void btnXLSXTest_OnClick(object sender, EventArgs e)
        {
            string fileName = "EPPlusColorTest.xlsx";
            string filePathAndName = HttpContext.Current.Request.MapPath(HttpContext.Current.Request.ApplicationPath + "\\" + fileName);
            FileInfo fiNew = new FileInfo(filePathAndName);
    
            using (ExcelPackage xlPackage = new ExcelPackage(fiNew))
            {
                ExcelWorksheet worksheet = null;
    
                //No Fill Sheet - set background color
                worksheet = xlPackage.Workbook.Worksheets.Count < 1 ? xlPackage.Workbook.Worksheets.Add("NoFillSheet") : xlPackage.Workbook.Worksheets["NoFillSheet"];                   
                worksheet.Cells["A1:H10"].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                worksheet.Cells["A1:H10"].Style.Fill.BackgroundColor.SetColor( System.Drawing.ColorTranslator.FromHtml(tbxHTMLColor.Text));
    
                //Gray Sheet - set background color
                worksheet = xlPackage.Workbook.Worksheets.Count < 1 ?    xlPackage.Workbook.Worksheets.Add("GraySheet") : xlPackage.Workbook.Worksheets["GraySheet"];
                worksheet.Cells["A1:H10"].Style.Fill.PatternType = OfficeOpenXml.Style.ExcelFillStyle.Solid;
                worksheet.Cells["A1:H10"].Style.Fill.BackgroundColor.SetColor(System.Drawing.ColorTranslator.FromHtml(tbxHTMLColor.Text));
    
                xlPackage.Save(); 
            }    
            Response.Clear();        
            Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
            Response.AppendHeader("Content-Disposition", "attachment; filename=" + fileName);
            Response.TransmitFile(filePathAndName);
            Response.Flush();
            Response.End();
        }    
    }
    

0 个答案:

没有答案