Загрузка отчета по электронной почте, где существует только 1 или 2 из 3 пользовательских свойств - PullRequest
1 голос
/ 03 мая 2019

У меня всего 3 пользовательских свойства, но не у всех писем есть все три свойства.Иногда электронная почта может иметь только 2 из 3 пользовательских свойств.Теперь проблема в том, что когда я пытаюсь загрузить все электронные письма в Excel, я получаю следующую ошибку, потому что в некоторых электронных письмах отсутствуют эти пользовательские свойства.

Object reference not set to an instance of an object.

Как обойти эту ошибку и оставить пустую ячейку в Excel, где отсутствует пользовательское свойство.

Вот мой код.

private void Export_Click(object sender, RibbonControlEventArgs e)
        {

            Outlook.UserProperties MailUserProperties = null;
            Outlook.UserProperty MailUserProperty = null;

            Excel.Application oApp = null;
            Excel.Workbook oWB = null;
            Excel.Worksheet oSheet = null;

            oApp = new Excel.Application();
            oWB = oApp.Workbooks.Add();
            oSheet = (Excel.Worksheet)oWB.Worksheets.get_Item(1);


            try
            {
                for (int i = 2; i <= selectedFolder.Items.Count; i++)
                {
                    Outlook.MailItem mail = (Outlook.MailItem)selectedFolder.Items[i];

                    MailUserProperties = mail.UserProperties;

                    oSheet.Cells[i, 1] = i.ToString();
                    oSheet.Cells[i, 2] = mail.Sender;
                    oSheet.Cells[i, 3] = mail.Subject;
                    oSheet.Cells[i, 4] = mail.ReceivedTime.ToLongDateString();

                    for (int j = 1; j <= MailUserProperties.Count; j++)
                    {
                        MailUserProperty = MailUserProperties[j];
                        if (MailUserProperty != null)
                        {
                            try
                            {
                                oSheet.Cells[i, 5] = mail.UserProperties["Ownership"].Value;
                                oSheet.Cells[i, 6] = mail.UserProperties["CompletedTime"].Value;
                                oSheet.Cells[i, 7] = mail.UserProperties["TimeSpent"].Value;
                            }
                            catch(Exception ex)
                            {
                                MessageBox.Show("The following error occured." + ex.Message);
                            }
                        }
                    }
                }
                oSheet.UsedRange.Columns.AutoFit();
            }

            catch (System.Runtime.InteropServices.COMException ex)
            {
                Console.WriteLine(ex.ToString());
            }
            finally
            {
                    // Code to save in Excel
            }
        }

Спасибо.

1 Ответ

1 голос
/ 06 мая 2019

Я бы создал раздел try / catch для каждого объекта.

Затем, если одно из свойств отсутствует, вы можете вставить нулевую строку.


private void Export_Click(object sender, RibbonControlEventArgs e)
{
    Outlook.UserProperties MailUserProperties = null;
    Outlook.UserProperty MailUserProperty = null;

    Excel.Application oApp = new Excel.Application();
    Excel.Workbook oWB = oApp.Workbooks.Add();
    Excel.Worksheet oSheet = (Excel.Worksheet)oWB.Worksheets.get_Item(1);

    try
    {
        for (int i = 2; i <= selectedFolder.Items.Count; i++)
        {
            Outlook.MailItem mail = (Outlook.MailItem)selectedFolder.Items[i];

            MailUserProperties = mail.UserProperties;

            oSheet.Cells[i, 1] = i.ToString();
            oSheet.Cells[i, 2] = mail.Sender;
            oSheet.Cells[i, 3] = mail.Subject;
            oSheet.Cells[i, 4] = mail.ReceivedTime.ToLongDateString();

            for (int j = 1; j <= MailUserProperties.Count; j++)
            {
                MailUserProperty = MailUserProperties[j];
                if (MailUserProperty != null)
                {
                    var ownership = string.Empty;
                    var completedTime = string.Empty;
                    var timeSpent = string.Empty;

                    try
                    {
                        ownership = mail.UserProperties["Ownership"].Value;
                    }
                    catch (Exception)
                    {
                        ownership = string.Empty; //or you can pass a string like <MISSING>
                    }
                    finally
                    {
                        oSheet.Cells[i, 5] = ownership;
                    }

                    try
                    {
                        completedTime = mail.UserProperties["CompletedTime"].Value;
                    }
                    catch (Exception)
                    {
                        completedTime = string.Empty;
                    }
                    finally
                    {
                        oSheet.Cells[i, 6] = completedTime;
                    }

                    try
                    {
                        timeSpent = mail.UserProperties["TimeSpent"].Value;
                    }
                    catch (Exception)
                    {
                        timeSpent = string.Empty;
                    }
                    finally
                    {
                        oSheet.Cells[i, 7] = timeSpent;
                    }

                }
            }
        }
        oSheet.UsedRange.Columns.AutoFit();
    }

    catch (System.Runtime.InteropServices.COMException ex)
    {
        Console.WriteLine(ex.ToString());
    }
    finally
    {
        // Code to save in Excel
    }
}
...