C # Excel - Управление свойствами столбца - PullRequest
0 голосов
/ 28 января 2010

Сценарий заключается в создании отчета 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";
}

Ответы [ 2 ]

1 голос
/ 28 января 2010

Одной из характеристик вашего подхода является то, что вам нужно будет изменить источник, если вы хотите изменить внешний вид столбца. Я бы предпочел хранить данные о внешнем виде в какой-то конфигурации XML. Вы можете загрузить конфигурацию из внешнего файла конфигурации, если он доступен, или из конфигурации по умолчанию, встроенной в исполняемый файл как ресурс. Это дает вам возможность изменять конфигурацию во время выполнения, просто добавляя файл конфигурации.

Ваш XML-документ может выглядеть следующим образом:

  <Appearance>
    <!-- Defaults to use for attributes not explicitly specified -->
    <Defaults HeaderText="" Width="10" Color="White" />
    <Columns>
      <Column HeaderText="S.No" Width="10" Color="LemonChiffon" />
      <Column HeaderText="Header Text" Width="20" Color="WhiteSmoke" />
    </Columns>
  </Appearance>
1 голос
/ 28 января 2010
  1. Где возникает необходимость в рефлексии?
  2. Я не думаю, что вы можете полагаться на рефлексию, чтобы вернуть свои константы в том порядке, в котором вы объявили их в своем исходном коде.

Edit:

Ну, я, должно быть, что-то упускаю - я действительно не понимаю, о чем ты думаешь, если не о чем-то, что ты создал сам, и о котором ты можешь легко получить ссылку.

Похоже, вы можете создать класс следующим образом:

public class ColumnProperties
{
   readonly string m_HeaderText;
   public ColumnProperties(string headerText, Color color, int width) { ... }
   public string HeaderText { get { return m_HeaderText; }
   public Color FontColor { get; set; }
   public int Width { get; set; }
   ...
}

Тогда, если у вас есть 150 точек данных, создайте 150 ColumnProperties объектов. Передайте их коллекцию в свой метод CreateHeader() и забудьте о всех этих бесполезных отражениях и этих пользовательских атрибутах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...