0

我对 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 是空的,没有异常和警告。

请记住:所有其他外部 jar 都可以正常工作。

我尝试了很多东西,但没有一个有效。

另外,如果我做类似的事情

                            ExcelObject ex = new ExcelObject(filename);
                            String s = ex.getSheetName();
//                          lblReportRun.setText(s);

                            lblReportRun.setText("Test");
                            lblAnyOtherLabel.setText("Test");

标签中也没有显示任何文本,在编译的 jar 中,在 eclipse 中也很好。

4

1 回答 1

0

这可能是因为如果在打开工作簿时发生一些异常,您会捕获它,打印堆栈跟踪,然后在 finally 块中关闭工作簿。但是由于调用时发生了异常Workbook.getWorkbook,因此该wb变量仍然为空,并且您正在尝试对其进行调用close。所以NullPointerException在 finally 块中发生了一个。

观察你的控制台,你一定会弹出一些异常。

另外,请注意 fileName 应该是您的类的唯一实例变量,Java 变量通常不包含下划线并使用 camelCase,并且 fileName 变量应该是 File 类型,而不是 String :您从文件中获取 File选择器,将其转换为字符串,然后将其转换回文件。

另一种可能性,因为它在 Eclipse 中工作而不是在外部运行时,是您忘记将 jXL jar 放在类路径中,这在尝试使用 ExcelObject 类时会导致一些 ClassNotFoundException。

于 2011-10-18T14:57:47.637 回答