所以我有一个窗口的代码:
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
返回异常)
答案 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(与许多其他属性一样)。