ClosedXML预定义样式

时间:2017-04-19 08:47:38

标签: c# closedxml

是否可以在ClosedXML中创建和存储预定义样式,以便稍后将其应用到某个范围?Just like Excel can。例如,通过静态类:

public static class ReportStyle
{ 
    public static XLStyle Default {
        get {
           XLStyle style = new XLStyle(); //or something like that, I want a different XLStyle object
           style.Font. //etc, all the changes
           return style;
        }
    }
}

后来我想做类似的事情:

range.Style = ReportStyle.Default;

我想预先定义其中的一些,因为每个文档可以在文档的不同部分中使用多次,例如在不同的工作表中。现在我创建了一个原始的解决方法,隐藏在委托下的方法,所以我可以将它们存储到我的模块中(太多无法解释 - 我只需要将样式存储为对象 - 因为我需要能够复制它):

public delegate bool StyleDelegate(IXLRange range);

然后我可以在里面存储我的样式更改方法,并在样式应用阶段之后调用它:

public static void SetStyleDefault(IXLRange range){
    //do some style changes for this range
}

public StyleDelegate Style { get; set; } = ReportStyle.SetStyleDefault;

它的工作方式和它是某种方式来做到这一点,但我发现它相当复杂,对未来的用户来说有点反直觉,最好只存储一些不同的静态XLStyle对象并将其应用到某些范围,我想拥有这种风格。

我想创建一些用于简化xlsx文档创建的“框架”(具有可立即使用的预定义块,可以在以后用作谜题) - 所以我想保持简单直观使用。

2 个答案:

答案 0 :(得分:1)

我不能肯定地说0.93之前的版本(那是发布问题的时间),但是在0.93中重新设计了样式管理以减少内存消耗,现在肯定可以。

采用默认样式,以所需的方式对其进行调整,然后将其存储在任意位置:在变量,静态字段或字典中:

var myCustomStyle = XLWorkbook.DefaultStyle;
myCustomStyle.Fill.SetBackgroundColor(XLColor.Red);
myCustomStyle.Font.SetBold(true);
myCustomStyle.Font.SetFontSize(20);

之后,您可以在所需的任何工作簿中自由使用此样式:

using (var wb = new XLWorkbook())
{
    var ws = wb.AddWorksheet();
    ws.Range("A1:A3").Style = myCustomStyle;
    wb.SaveAs(...);
}

Voila!

enter image description here

答案 1 :(得分:0)

我使用反射来创建空样式。使用这种东西不好,但总比没有好

    static IXLStyle CreateEmptyStyle()
    {
        var t = typeof(ClosedXML.Excel.XLConstants).Assembly.GetType("ClosedXML.Excel.XLStyle");                        
        MethodInfo m = t?.GetMethod("CreateEmptyStyle", BindingFlags.Static | BindingFlags.NonPublic);
        var o = m?.Invoke(null, null);
        return o as IXLStyle;
    }