void GenerateCustomPropertiesWorksheet()
        {
            if (!ShouldGenerateCustomPropertiesWorksheet())
            {
                return;
            }

            IWorkbook workbook  = spreadsheetControl1.Document;
            Worksheet worksheet = workbook.Worksheets[1];

            DevExpress.Spreadsheet.DocumentProperties properties = workbook.DocumentProperties;
            workbook.BeginUpdate();
            try {
                int rowIndex = 3;
                Cleanup(worksheet, rowIndex);
                foreach (string propertyName in properties.Custom.Names)
                {
                    CellValue propertyValue = properties.Custom[propertyName];
                    worksheet[rowIndex, 1].Value   = propertyName;
                    worksheet[rowIndex, 2].Formula = string.Format("=DOCPROP(\"{0}\")", propertyName);
                    if (rowIndex % 2 != 0)
                    {
                        worksheet[rowIndex, 1].Style = workbook.Styles["PropName1"];
                        worksheet[rowIndex, 2].Style = workbook.Styles["PropValue1"];
                    }
                    else
                    {
                        worksheet[rowIndex, 1].Style = workbook.Styles["PropName2"];
                        worksheet[rowIndex, 2].Style = workbook.Styles["PropValue2"];
                    }
                    worksheet[rowIndex, 2].NumberFormat = propertyValue.IsDateTime ? "m/d/yyyy" : string.Empty;
                    worksheet.Rows[rowIndex].Height     = 21;
                    rowIndex++;
                }
                SetLastRowBorder(worksheet, rowIndex);
            }
            finally {
                workbook.EndUpdate();
            }
        }
        ParameterValue IFunction.Evaluate(IList <ParameterValue> parameters, EvaluationContext context)
        {
            ParameterValue propertyNameParam = parameters[0];

            if (propertyNameParam.IsError)
            {
                return(propertyNameParam);
            }
            if (propertyNameParam.IsText)
            {
                string propertyName = propertyNameParam.TextValue;
                DevExpress.Spreadsheet.DocumentProperties properties = context.Sheet.Workbook.DocumentProperties;
                if (propertyName.Equals("Application", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Application);
                }
                if (propertyName.Equals("Manager", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Manager);
                }
                if (propertyName.Equals("Company", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Company);
                }
                if (propertyName.Equals("Version", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Version);
                }
                if (propertyName.Equals("Security", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Security.ToString());
                }
                if (propertyName.Equals("Title", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Title);
                }
                if (propertyName.Equals("Subject", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Subject);
                }
                if (propertyName.Equals("Author", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Author);
                }
                if (propertyName.Equals("Keywords", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Keywords);
                }
                if (propertyName.Equals("Description", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Description);
                }
                if (propertyName.Equals("LastModifiedBy", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.LastModifiedBy);
                }
                if (propertyName.Equals("Category", StringComparison.InvariantCultureIgnoreCase))
                {
                    return(properties.Category);
                }
                if (propertyName.Equals("Created", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (properties.Created != DateTime.MinValue)
                    {
                        return(properties.Created);
                    }
                    return(string.Empty);
                }
                if (propertyName.Equals("Modified", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (properties.Modified != DateTime.MinValue)
                    {
                        return(properties.Modified);
                    }
                    return(string.Empty);
                }
                if (propertyName.Equals("Printed", StringComparison.InvariantCultureIgnoreCase))
                {
                    if (properties.Printed != DateTime.MinValue)
                    {
                        return(properties.Printed);
                    }
                    return(string.Empty);
                }
                return(properties.Custom[propertyName]);
            }
            return(ParameterValue.ErrorInvalidValueInFunction);
        }