Ich versuche, in eine Excel-Datei zu schreiben, erhalte jedoch weiterhin den Fehler:
Ausnahme im Thread "main" org.Apache.poi.POIXMLException: org.Apache.poi.openxml4j.exceptions.InvalidFormatException: Das Paket muss einen Inhaltstyp-Teil [M1.13] enthalten.
Nach meinem Verständnis fehlt mir eine Jar-Datei.
Kann mir jemand helfen herauszufinden, um welche Datei es sich handelt?
P.S. Ich benutze Netbeans.
import Java.io.FileInputStream;
import Java.io.FileNotFoundException;
import Java.io.FileOutputStream;
import Java.io.IOException;
import javax.swing.JOptionPane;
import org.Apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.Apache.poi.xssf.usermodel.XSSFCell;
import org.Apache.poi.xssf.usermodel.XSSFRow;
import org.Apache.poi.xssf.usermodel.XSSFSheet;
import org.Apache.poi.xssf.usermodel.XSSFWorkbook;
/**
*
* @author nicholaskissaun
*/
public class Tester {
public static void main (String args \[\])throws FileNotFoundException, IOException, InvalidFormatException{
int RowCount = 7, iChoice;
String sChoice;
XSSFSheet s;
XSSFRow row1;
XSSFWorkbook wb;
XSSFCell r1c1, r1c2, r1c8, r1Episodes;
FileInputStream fis = new FileInputStream("/Users/nicholaskissaun/Google Drive/Grade 11_12/Computer Science/Java/Term1/src/IA/Profiles/Becky/ShowDetails.xlsx");
wb = new XSSFWorkbook(fis);
s = wb.getSheetAt(0);
}
}
Verwenden Sie die Dateierweiterung, um WorkSheet
Type zu behandeln
String inputFilename = new File(path).getName();
switch (inputFilename.substring(inputFilename.lastIndexOf(".") + 1,
inputFilename.length())) {
case "xls":
return readXLS(path);
case "xlsx":
return readXLSX(path);
default:
Log.e(TAG, "No XLS file chosen");
return "Please select valid \"Excel\" File\"";
}
Für XLSX-Datei: XSSFWorkbook & XSSFSheet
verwenden
XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(path)));
XSSFSheet sheet = workbook.getSheetAt(0);
Für XLS-Datei: HSSFWorkbook & HSSFSheet
verwenden
HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(path)));
HSSFSheet sheet = workbook.getSheetAt(0);
Dies kann passieren, wenn Sie Ihre XLS/XLSX-Datei über LibreOffice erstellen. Anscheinend geht bei der Konvertierung etwas verloren, und die Datei stimmt nicht mit einer in Microsoft Office erstellten Tabelle überein. Ich hatte den gleichen Fehler und die Lösung für mich bestand darin, die gesamte in LibreOffice Calc geleistete Arbeit in eine MS Excel-Tabelle zu kopieren und dann eine neue Datei zu speichern.
Was Sie haben, ist ein Versionskonflikt zwischen Ihrer Excel-Datei und der Arbeitsmappe, die Sie erstellen möchten. Der beste Weg, dies zu vermeiden, ist: Wählen Sie Schnittstellenimplementierung.
Ich baute auf Hitesh Sahus Lösung auf:
import org.Apache.poi.ss.usermodel.Workbook;
import org.Apache.poi.ss.usermodel.WorkbookFactory;
Workbook workbook = null;
// parse files from request
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
MultipartFile multipartDataPointsFile = multipartRequest.getFile("yourFileHere");
try {
if(multipartDataPointsFile!=null) {
String originalFileName= multipartDataPointsFile.getOriginalFilename();
if(originalFileName!=null && originalFileName.length()>0) {
switch (originalFileName.substring(originalFileName.lastIndexOf(".") + 1,
originalFileName.length())) {
case "xls":
try {
workbook = WorkbookFactory.create(multipartDataPointsFile.getInputStream());
}catch(org.Apache.poi.openxml4j.exceptions.InvalidFormatException ie){
logger.error("Malformed Excel");
throw new IOException();
}
if(workbook!=null) {
// Do something in here
}else{
logger.error("Could not pass along the workbook");
throw new IOException();
}
case "xlsx":
try {
workbook = WorkbookFactory.create(multipartDataPointsFile.getInputStream());
}catch(org.Apache.poi.openxml4j.exceptions.InvalidFormatException ie){
logger.error("Malformed Excel");
throw new IOException();
}
if(workbook!=null) {
// Do something in here
}else{
logger.error("Could not pass along the workbook");
throw new IOException();
}
default:
logger.error("File type is not recognized Excell type");
throw new IOException();
}
}else{
logger.error("Can Not Read File Name");
throw new IOException();
}
}else{
logger.error("Did not select a file");
throw new IOException();
}
} catch (IOException e) {
throw new ApplicationErrorException("Can't parse Excel file");
}
Eine andere mögliche Lösung ist
Workbook workbook = WorkbookFactory.create(source)
WorkbookFactory
sollte von dem von Ihnen verwendeten Apache-POI bereitgestellt werden (falls nicht auf eine neuere Version aktualisiert). Es erkennt das Dateiformat und erstellt eine konkrete Implementierung der Workbook
-Schnittstelle (XSSFWorkbook
oder HSSFWorkbook
). Der source
-Parameter kann Java.io.InputStream
oder Java.io.File
sein.
CHECK Excel FORMAT .... Zuerst habe ich ein Beispiel-Excel mit poi erstellt und die Spalten mit meinem ersten Versuch geändert. Es wird derselbe Fehler ausgegeben. Nach wenigen Versuchen wurde es jedoch erfolgreich gelesen. Ich frage mich, warum es beim ersten Lauf nicht funktioniert hat: (.__ Wenn Sie eine richtige Bibliothek haben, überprüfen Sie bitte das korrekte Excel-Format
Ich habe das gleiche Problem. Wenn Sie eine Excel-Datei öffnen, wird eine Datei wie ~ $ ______. Xlsx .__ generiert. Suchen und löschen Sie alle für mich funktionierenden Dateien.
Die Excel-Datei, auf die Ihre Anwendung zuzugreifen versucht, reagiert aufgrund von Netzwerkproblemen oder beschädigtem Format nicht. Wenn es sich um ein Netzwerkproblem handelt, versuchen Sie, die Anwendung später auszuführen (oder) Wenn die Datei beschädigt ist, versuchen Sie, eine neue Datei einzufügen und Ihre Anwendung zu testen. Viel Glück.
Ich habe das gleiche Problem. Ihr Excel hat nicht das richtige Format. Sie können alle Arbeiten auf ein neues Blatt kopieren oder das Format löschen. Viel Glück.
Ok, in meinem Fall hatte ich es so und Line3 hat diese Ausnahme ausgelöst:
File xlsxFile = new File( "C:\\myWorkbook.xlsx" );
FileInputStream finXLSX = new FileInputStream( xlsxFile ); //line1
FileOutputStream foutXLSX = new FileOutputStream( xlsxFile ); //line2
XSSFWorkbook workSheet = new XSSFWorkbook( finXLSX ); //line3
Ich stellte jedoch fest, dass line3 nicht funktionierte, da ich über Line2 auch einen Ausgabestrom auf meiner xlsx-Datei geöffnet hatte. Line3 schlug dann fehl. Ich habe line2 entfernt, damit es funktioniert.