0

我是java新手,试图编写一个程序来访问excel文件中的数据。但是收到消息

线程“main”java.lang.Error 中的异常:未解决的编译问题:无法对非静态字段进行静态引用

编码:

package xl;

import java.io.File;
import java.io.IOException;
import java.util.Date;
import jxl.*;
import jxl.Workbook.*;
import jxl.read.biff.BiffException;

public class xl {

    public String path = "C:/Workbook.xls";
    public File wb = new File(path);

    public static void main(String[] args) throws IOException, BiffException {
        Workbook work;
        work = Workbook.getWorkbook(new java.io.File(wb));

        Sheet sheet1 = work.getSheet(0);
        Cell c1 = sheet1.getCell(0,0);

        String xreader = c1.getContents();
        System.out.println(xreader);
    }
}

任何想法,我错在哪里......

4

3 回答 3

2

主要方法是静态方法。您的实例变量 wb 不能在静态方法中访问。

这是因为实例变量在您创建类的对象之前不存在,但静态方法始终可以在不创建对象的情况下访问。

要修复,请将两个实例变量都声明为静态:

private static String path = "C:/Workbook.xls";
private static File wb = new File(path);

尽管如此,这并不是一个好的设计。但它至少可以编译。

于 2013-08-23T14:26:23.423 回答
2
 public class xl 
 {
     public static void main(String[] args) throws IOException, BiffException {
          String path = "C:/Workbook.xls";
          File wb = new File(path);
          Workbook work;
          work = Workbook.getWorkbook(new java.io.File(wb));

          Sheet sheet1 = work.getSheet(0);

          Cell c1 = sheet1.getCell(0,0);

          String xreader = c1.getContents();
          System.out.println(xreader);
   }

}

于 2013-08-23T14:31:17.040 回答
1

main 方法必须是静态方法,但它不能引用任何实例变量,因为它们不是静态的。您可以通过将实例变量声明为静态变量来将它们更改为类变量,但这不是好的做法,因为在这种情况下,变量对应于工作簿的特定实例。

更好的解决方案是创建一个实例方法来加载工作簿并打印出内容。当前 main 方法中的所有代码都应该进入这个新方法。

然后在主方法中,你只需要创建你的类的一个实例,并调用新方法。

public void printWorkbook() throws IOException, BiffException {
    Workbook work;
    work = Workbook.getWorkbook(new java.io.File(wb));

    Sheet sheet1 = work.getSheet(0);
    Cell c1 = sheet1.getCell(0,0);
    String xreader = c1.getContents();
    System.out.println(xreader);    
}

public static void main(String[] args) throws IOException, BiffException {
    xl instance = new xl();
    instance.printWorkBook();
}

更好的是让printWorkbook接受路径的字符串参数,然后从主方法传入。然后,您将创建该File对象wb作为此方法的局部变量。然后,您可以通过从命令行读取路径作为参数轻松概括您的主要方法以打印出任何文件。

通常给类名称以大写字母开头并定义类的用途。所以xl你可以打电话给你的班级WorkbookPrinter

于 2013-08-23T14:42:29.793 回答