ExcelWorksheet Dimension NullReferenceException

时间:2017-07-16 16:45:17

标签: c# wpf nullreferenceexception epplus

所以我有一个窗口的代码:

public partial class List : Window
{
    DataTable table = null;
    ExcelWorksheet ws = null;
    string user = System.Environment.UserName;

    public void Initialize()
    {
        string path = "Log.xlsx";
        FileInfo file = new FileInfo(path);

        try
        {
            if (File.Exists(path))
            {
                using (ExcelPackage pack = new ExcelPackage(file))
                {
                    bool sheetfound = false;

                    //runs through each sheet to find a specific one
                    foreach (ExcelWorksheet sheet in pack.Workbook.Worksheets)
                    {
                        if (sheet.Name.Equals(user))
                        {
                            sheetfound = true;
                            ws = pack.Workbook.Worksheets[user];
                            break;
                        }
                    }

                    //Creates new sheet if it hasn't found the specific one
                    if (!(sheetfound))
                    {
                        ws = MainWindow.Create_Worksheet(pack);
                        pack.Save();
                    }
                }
            }
            else
            {
                using (ExcelPackage pack = new ExcelPackage(file))
                {
                        ExcelWorksheet ws = MainWindow.Create_Worksheet(pack);
                        pack.Save();
                }
            }
        }
        catch (Exception ex)
        {
            MessageBox.Show("Exception caught:\n\n" + ex as string, "Error", MessageBoxButton.OK, MessageBoxImage.Error);
        }

        fUpdate(new Object, new RoutedEventArgs);
    }

    public void fUpdate(object sender, RoutedEventArgs e)
    {
        table.Rows.Clear();

        MessageBox.Show(ws.Dimension.End.Row.ToString());
    }
}

这个来自主窗口:

public partial class MainWindow : Window
{
    public static ExcelWorksheet Create_Worksheet(ExcelPackage pack)
    {
        ExcelWorksheet ws = pack.Workbook.Worksheets.Add(System.Environment.UserName);

        ws.Cells[1, 1].Value = "Date";
        ws.Cells[1, 2].Value = "Time";

        ws.View.FreezePanes(2, 1);

        return ws;
    }
}

现在应该做的是,当第二个窗口启动时,它会设置Excel文件和工作表。我使用Quickwatch查看它是否有效并且确实有效, ws 设置为我想要的特定工作表,ws.Dimension.End.Row返回1.然而,在它离开try-catch之后part(一旦达到fUpdate),ws.Dimension.End.Row突然抛出NullReferenceException。我检查过并且ws仍然是相同的ExcelWorksheet对象,它没有经历任何会改变其价值的东西(我知道)。是什么导致这个错误?谢谢!

ws返回ExcelWorksheet对象,但ws.Dimensions返回异常)

3 个答案:

答案 0 :(得分:1)

如果工作表刚刚初始化且为空,则Dimension的{​​{1}}对象将为null。

例如:

ExcelWorksheet

此代码将抛出NullReferenceException,因为ExcelWorksheet worksheet = new ExcelPackage().Workbook.Worksheets.Add("Sheet1"); Console.WriteLine(worksheet.Dimension.End.Row); 对象为null。

另一方面:

Dimension

此代码不会抛出异常,因为通过向工作表添加内容来初始化Dimension对象。

如果加载的ExcelWorksheet worksheet = new ExcelPackage().Workbook.Worksheets.Add("Sheet1"); worksheet.Cells[1, 1].Value = "Some text value"; Console.WriteLine(worksheet.Dimension.End.Row); 已包含数据,则不会遇到此问题。

答案 1 :(得分:0)

如果您的文件不存在,您可能会收到NullReferenceException。在这种情况下,您将进入using (ExcelPackage pack = new ExcelPackage(file)) { // ExcelWorksheet ws = MainWindow.Create_Worksheet(pack); // wrong ws = MainWindow.Create_Worksheet(pack); // right pack.Save(); } 块并将创建的WorkSheet分配给本地方法变量而不是类变量。

repldict

答案 2 :(得分:0)

对于多年后像我一样遇到这个问题的人。如果 ExcelPackage 被释放,这种情况也会发生。

特别是我有一个方法

using ExcelPackage excelPackage = new ExcelPackage(fi);
return excelPackage.Workbook.Worksheets.First();

这将返回一个工作表,但由于 ExcelPackage 在退出该方法时被释放,因此 Dimensions 属性为 null(与许多其他属性一样)。