Сценарий заключается в создании отчета Excel, который содержит ~ 150 столбцов данных. Теперь мне нужно управлять свойствами столбца, такими как Width, BackgroundColor, Font и т. Д.
Подход, который я использую, основан на рефлексии. У меня есть класс, который имеет ~ 150 констант для текста заголовка столбца. Еще один класс пользовательских атрибутов для хранения свойств столбца. Эти атрибуты применяются к константам.
Во время создания столбца с использованием отражения, я получаю доступ ко всем константам для создания текста заголовка (Порядок констант в классе определяет порядок столбцов) и атрибута свойств столбцов.
private void CreateHeader(Excel.Worksheet xl_WorkSheet, FieldInfo[] fi_Header)
{
ColumnProperties c;
System.Attribute[] customAttributes;
for (int i = 0; i < fi_Header.GetLength(0); i++)
{
xl_WorkSheet.get_Range(xl_WorkSheet.Cells[1, i+1], xl_WorkSheet.Cells[2, i+1]).Merge(false);
//Set the header text.
xl_WorkSheet.get_Range(xl_WorkSheet.Cells[1, i + 1], xl_WorkSheet.Cells[2, i + 1]).FormulaR1C1 =
fi_Header[i].GetValue(null).ToString();
//Set cell border.
xl_WorkSheet.get_Range(xl_WorkSheet.Cells[1, i + 1],
xl_WorkSheet.Cells[2, i + 1]).BorderAround(Excel.XlLineStyle.xlContinuous,
Excel.XlBorderWeight.xlThin, Excel.XlColorIndex.xlColorIndexAutomatic, Missing.Value);
//Get custom attribute ~ Column attribute.
customAttributes = (System.Attribute[])fi_Header[i].GetCustomAttributes(typeof(ColumnProperties), false);
if (customAttributes.Length > 0)
{
c = (ColumnProperties)customAttributes[0];
//Set column properties.
xl_WorkSheet.get_Range(xl_WorkSheet.Cells[1, i + 1],
xl_WorkSheet.Cells[2, i + 1]).Interior.Color =
System.Drawing.ColorTranslator.ToOle(System.Drawing.Color.FromName(c.Color));
xl_WorkSheet.get_Range(xl_WorkSheet.Cells[1, i + 1],
xl_WorkSheet.Cells[2, i + 1]).ColumnWidth = c.Width;
}
}
}
РЕДАКТИРОВАТЬ: код для получения констант
private FieldInfo[] GetHeaderConstants(System.Type type)
{
ArrayList constants = new ArrayList();
FieldInfo[] fieldInfos = type.GetFields(BindingFlags.Public | BindingFlags.Static | BindingFlags.FlattenHierarchy);
foreach (FieldInfo fi in fieldInfos)
{
if (fi.IsLiteral && !fi.IsInitOnly)
constants.Add(fi);
}
return (FieldInfo[])constants.ToArray(typeof(FieldInfo));
}
Основная цель - сделать генерацию файлов Excel общей / менее обслуживаемой. Подход хорошо или есть другие лучшие альтернативы.
РЕДАКТИРОВАТЬ 2: класс констант
public class ExcelHeaders
{
[ColumnProperties(Width=10, Color="LemonChiffon")]
public const string S_NO = "S.No";
[ColumnProperties(Width = 20, Color = "WhiteSmoke")]
public const string COLUMN_HEADER = "Header Text";
}