查询受保护的构造函数

时间:2017-05-27 13:51:59

标签: java apache-poi

抱歉这个愚蠢的问题。 以下是我使用Apache POI从电子表格中读取的代码。我感到困惑的是

XSSFWorkbook wb = new XSSFWorkbook(fs);
XSSFSheet sheet = wb.getSheetAt(0);

我创建了一个XSSFSheet对象,它需要wb.getSheetAt(0),我的查询是为什么我应该将wb.getSheetAt(0)传递给工作表对象。 当我尝试创建如下对象时

XSSFSheet sheet = new XSSFSheet(wb);

我收到错误说明

XSSFSheet(org.apache.poi.openxml4j.opc.PackagePart) has protected access in 'org.apache.poi.xssf.usermodel.XSSFSheet'

我查看了XSSFSheet源代码,其构造函数已声明为protected。我的印象是可以使用new关键字创建对象。我错过了什么?

参考源代码

package ReadAndWrite;

import ReadExcelLibrary.ReadExcelSheet;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;


/**
 * Created by Shravya on 11/5/17.
 */
public class ReadExcel {

    public static void main(String[] args) throws Exception {

        File file = new File("//Development//Selenium//ApachePOI//Apache_wb.xlsx");
        FileInputStream fs = new FileInputStream(file);
        XSSFWorkbook wb = new XSSFWorkbook(fs);
        //XSSFSheet sheet = new XSSFSheet(wb);
        XSSFSheet sheet = wb.getSheetAt(0);
        String value = sheet.getRow(0).getCell(0).getStringCellValue();
        System.out.println("The value of cell is " + value);

        ReadExcelSheet excelSheet = new ReadExcelSheet("//Development//Selenium//ApachePOI//Apache_wb.xlsx");
        System.out.println(excelSheet.getData(0,1,1));



    }
}

1 个答案:

答案 0 :(得分:2)

XSSFSheet sheet = new XSSFSheet(wb);

让我们假装你可以做到。它将创建一个尚不存在的新XSSFSheet对象。

XSSFSheet sheet = wb.getSheetAt(0);

根本不做同样的事情。这允许获取工作簿中索引为0的现有工作表。所以那些是完全不同的两件事。基本上,在从车库购车和建造一辆全新的汽车之间存在同样的差异。

所以当你说

XSSFSheet sheet = wb.getSheetAt(0);
     

我创建了一个XSSFSheet对象,它需要wb.getSheetAt(0)

这是不正确的。你还没有创造任何东西。您已获得对工作簿已为您创建的现有XSSFSheet对象的引用。

  

我认为可以使用new关键字创建对象。

是的,这就是构造函数允许做的事情。但是如果构造函数受到保护,则意味着只允许同一个包中的子类或类调用构造函数。

要在工作簿中创建新工作表,可以使用this method,要求工作簿为您创建工作表,并为您提供对已创建工作表的引用。就像获得一辆新车一样,你通常不会自己创造一辆,而是要求汽车制造商为你建造一辆。