我对java几乎不熟悉(以前总是在c#上)并且需要创建一个swing应用程序,我需要从xls文件中读取数据。所以我使用jXL。
我有一个类,它返回excel文件中第一张表的名称,在jFileChooser中选择。这是代码:
import java.io.File;
import jxl.Sheet;
import jxl.Workbook;
public class ExcelObject
{
private String filename = null;
private Workbook wb = null;
private Sheet sheet = null;
public ExcelObject(String f)
{
filename = f;
}
public String getSheetName()
{
String sheet_name = null;
try
{
wb = Workbook.getWorkbook(new File(filename));
sheet = wb.getSheet(0);
sheet_name = sheet.getName();
}
catch (Exception e)
{
e.printStackTrace();
}
finally
{
wb.close();
}
return sheet_name;
}
}
程序调用中的看起来像:
ExcelObject ex = new ExcelObject(filename);
String s = ex.getSheetName();
lblReport.setText(s);
所以问题是:当在eclipse(3.4.2)中运行时,我得到一个正确的值,当编译jar时,没有返回值!我的意思是lblReport是空的,没有例外和警告。
请记住:所有其他外部罐子都可以正常工作。
我尝试了很多东西,但没有一个在起作用。
另外,如果我这样做
ExcelObject ex = new ExcelObject(filename);
String s = ex.getSheetName();
// lblReportRun.setText(s);
lblReportRun.setText("Test");
lblAnyOtherLabel.setText("Test");
标签中没有文字显示,在编译的jar中,在eclipse中也没有。
答案 0 :(得分:0)
这可能是因为如果在打开工作簿时发生某些异常,则会捕获它,打印堆栈跟踪,然后在finally块中关闭工作簿。但是,由于调用Workbook.getWorkbook
时发生异常,wb
变量仍然为空,并且您尝试在其上调用close
。所以在finally块中发生NullPointerException
。
注意你的控制台,你必须弹出一些异常。
另外,请注意fileName应该是类的唯一实例变量,Java变量通常不包含下划线并使用camelCase,而fileName变量应该是File类型,而不是String:你得到一个文件从文件选择器中,将其转换为字符串,然后将其转换回文件。
另一种可能性,因为它在Eclipse中运行而不是在外部运行时,您忘记将jXL jar放在类路径中,这会在尝试使用ExcelObject类时导致一些ClassNotFoundException。