web-dev-qa-db-ja.com

「パッケージにはコンテンツタイプパーツを含める必要があります[M1.13]」

私はExcelファイルに書き込もうとしていますが、エラーが発生し続けます:

スレッド「メイン」の例外org.Apache.poi.POIXMLException:org.Apache.poi.openxml4j.exceptions.InvalidFormatException:パッケージにはコンテンツタイプパーツが含まれている必要があります

私が理解していることから、jarファイルが欠落しています。

誰がどのファイルであるかを特定するのを手伝ってくれますか?

追伸Netbeansを使用しています。

my current files

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);

    }      

}
7
Tephrite

ファイル拡張子を使用してWorkSheetタイプを処理します

  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\"";
                    }

XLSXファイルの場合:XSSFWorkbook & XSSFSheetを使用します

    XSSFWorkbook workbook = new XSSFWorkbook(new FileInputStream(new File(path)));

    XSSFSheet sheet = workbook.getSheetAt(0);

XLSファイルの場合:HSSFWorkbook & HSSFSheetを使用します

    HSSFWorkbook workbook = new HSSFWorkbook(new FileInputStream(new File(path)));

    HSSFSheet sheet = workbook.getSheetAt(0);
10
Hitesh Sahu

これは、LibreOfficeを使用してXLS/XLSXファイルを作成するときに発生する可能性があります。どうやら変換で何かが失われ、ファイルはMicrosoft Officeで作成されたスプレッドシートと同じではないようです。同じエラーが発生しましたが、解決策は、LibreOffice Calcで行ったすべての作業をMS Excelスプレッドシートにコピーしてから、新しいファイルを保存することでした。

5
Gabriel Ullmann

持っているのは、作成しようとしているExcelファイルとブックのバージョンの不一致です。回避する最善の方法は、インターフェースの実装を選択することです。

Hitesh Sahuのソリューションの上に構築しました。

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");
}
2
mike oganyan

別の可能な解決策は

Workbook workbook = WorkbookFactory.create(source)

WorkbookFactoryは、使用しているApache POIによって提供される必要があります(新しいバージョンにアップグレードしない場合)。ファイル形式を認識し、Workbookインターフェイス(XSSFWorkbookまたはHSSFWorkbook)の具体的な実装を作成します。 sourceパラメーターには、Java.io.InputStreamまたはJava.io.Fileを指定できます。

0

Excelのフォーマットを確認してください...最初にpoiでサンプルExcelを作成し、同じエラーを与える最初の試みで列を変更しましたが、数回試した後、正常に読み取りました。なぜ最初に実行されなかったのでしょうか?適切なライブラリがあり、正しいExcel形式を確認してください

0
TAYFUN ÇELİK

私は同じ問題を抱えています。 Excelファイルを開くと、〜$ ______。xlsxのようなファイルが生成されます。すべてのファイルを見つけて削除してください。

0
Long Nguyen

ネットワークの問題またはフォーマットの破損が原因で、アプリケーションがアクセスしようとしているExcelファイルが応答しないため、このエラーが発生します。ネットワークの問題が原因である場合は、後でアプリケーションを実行してみてください(または)ファイルが破損している場合は、新しいファイルを入れてアプリケーションをテストしてください。幸運を。

0
ChiNtu

同じ問題が発生しました。 Excelの形式が正しくありません。すべての作業を新しいシートにコピーするか、フォーマットをクリアできます。幸運を。

0
Pham Hung

私の場合、これは私が持っていた方法であり、line3はこの例外を投げていました:

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

しかし、line2を介してxlsxファイルの出力ストリームも開いたため、line3が機能していなかったことがわかりました。 line2を削除して機能させました。

0
UzumakiL