我正在尝试将文本文件转换为Excel .......
在执行此操作时,会发生以下异常:
Exception in thread "main" java.lang.NoSuchMethodError:
org.apache.poi.poifs.filesystem.POIFSFileSystem.hasPOIFSHeader(Ljava/io/InputStream;)Z
at org.apache.poi.ss.usermodel.WorkbookFactory.create()
我怎能避免这个?我正在提供我的片段。
public void convertCSV(String textfile) throws Exception {
FileInputStream inputStr = new FileInputStream(new File("/home/directory/Desktop/HI/excel.xls"));
Workbook HssfWork = WorkbookFactory.create(inputStr);
Sheet sheet= HssfWork.getSheetAt(0);
int rowNo = 0;
int columnNo = 0;
Cell cell = null;
// Loop through the files.
//for(File file : csvFiles) {
Scanner scanner = new Scanner(textfile);
while(scanner.hasNextLine()) {
String line = scanner.nextLine();
// Gets the row and if it doesn't exist it will create it.
Row Row = sheet.getRow(rowNo);
if(Row == null)
Row = sheet.createRow(rowNo);
Scanner lineScanner = new Scanner(line);
lineScanner.useDelimiter("\t");
// While there is more text to get it will loop.
while(lineScanner.hasNext()) {
// Gets the cell in that row and if it is null then it will be created.
org.apache.poi.ss.usermodel.Cell tempCell =Row.getCell(columnNo,org.apache.poi.ss.usermodel.Row.CREATE_NULL_AS_BLANK);
String output = lineScanner.next();
// Write the output to that cell.
tempCell.setCellValue(output);
columnNo++;
}
// Resets the column count for the new row.
columnNo = 0;
rowNo++;
}
// Writes the file and closes everything.
FileOutputStream out = new FileOutputStream(excelFile);
HssfWork.write(out);
inputStr.close();
out.close();
}
答案 0 :(得分:0)
首先猜测是:你的JAR版本错误了。我猜你的类路径中至少有2个JARS,WorkbookFactory
在一个中,POIFSFileSystem
在另一个中。检查第二个JAR的版本。
NoSuchMethodException
表示它所说的内容:被调用的方法(WorkbookFactory
)不存在。所以如果你得到它,就意味着类POIFSFileSystem
确实存在 - 否则你就会遇到可怕的NoClassDefFoundError
。所以你必须拥有合适的库,但是它的版本不同,但尚未添加hasPOIFSHeader()
...或者已被删除...
答案 1 :(得分:0)
正如安德鲁在his answer中指出的那样,你得到了这个例外,因为你没有一套匹配的POI罐正在使用中。这有两个常见的原因。一个是你以某种方式挑选了一组不匹配的罐子,例如poi-ooxml-3.10-beta1-20130204.jar
和poi-3.8-final.jar
- 这些都不起作用。或者,您已将匹配集放置在类路径中,但已存在较旧的jar,并且您的类加载器已选择随机集。
无论哪种方式,我建议你按照instructions in this Apache POI FAQ Entry on the topic,找出你实际使用的POI Jars。然后,一直工作,直到你有匹配的集合。 POI与大多数应用程序一样,要求所有使用的Jars都来自相同的版本!