12

私は現在、Apache POIを使用してxlsxファイルを開くためのこのコードを持っています

File existingXlsx = new File("/app/app.xlsx");
System.out.println("File Exists: " + existingXlsx.exists());

Workbook workbook = WorkbookFactory.create(existingXlsx);

これを実行しようとすると、次の出力が得られます

File Exists: true
java.lang.NullPointerException
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:270)
    at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:159)
    at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:186)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:91)

開こうとしているファイルは Excel で開くことができ、データを正しく表示できます。POI に XLSX ファイルを読み取らせるにはどうすればよいですか?

破損するファイルは次のとおりです。

https://mega.co.nz/#!FJMWjQKI!CzihQgMVpxOQDTXzSnb3UFYSKbx4yFTb03-LI3iLmkE

編集

私も試しましたが、これは同じエラーになります。

Workbook workbook = new XSSFWorkbook(new FileInputStream(existingXlsx));

編集

例外をスローしている行を見つけました。

WorkbookDocument doc = WorkbookDocument.Factory.parse(getPackagePart().getInputStream());
this.workbook = doc.getWorkbook();

Map<String, XSSFSheet> shIdMap = new HashMap<String, XSSFSheet>();
for(POIXMLDocumentPart p : getRelations())
{
    if(p instanceof SharedStringsTable) sharedStringSource = (SharedStringsTable)p;
    else if(p instanceof StylesTable) stylesSource = (StylesTable)p;
    else if(p instanceof ThemesTable) theme = (ThemesTable)p;
    else if(p instanceof CalculationChain) calcChain = (CalculationChain)p;
    else if(p instanceof MapInfo) mapInfo = (MapInfo)p;
    else if (p instanceof XSSFSheet) {
        shIdMap.put(p.getPackageRelationship().getId(), (XSSFSheet)p);
    }
}

stylesSource.setTheme(theme); <== BREAKS HERE

編集

いくつかの調査 POI が styles.xml と workbook.xml を見つけることができないように思われる後、アーカイブの構造を示す TextWrangler のような単純なリーダーがスタイル xml を表示するため、これは奇妙だと思います。

これを修正するにはどうすればよいですか? アーカイブに挿入できるデフォルトの styles.xml と workbook.xml はありますか?

4

3 に答える 3

5

今、最新のパッケージをダウンロードしました:

  • poi-src-3.9-20121203.zip (ソースとして)
  • xmlbeans-2.6.0.zip
    • jsr173_1.0_api.jar
    • リゾルバー.jar
    • xbean.jar
    • xbean_xpath.jar
    • xmlbeans-qname.jar
    • xmlpublic.jar
  • ooxml-schemas-1.1.jar
  • dom4j-1.6.1.jar
  • commons-codec-1.8.jar
  • commons-logging-1.1.3.jar
  • ant.jar (アリ 1.7)

そして、あなたのtest2.xlsxは問題なく読み込まれました:

  public static void main(String arg []){
    try {
      //File existingXlsx = new File("/app/app.xlsx");
      File existingXlsx = new File("c:/Java/poi-3.9/test-data/__theproblem/test2.xlsx");
      System.out.println("File Exists: " + existingXlsx.exists());

      Workbook workbook = WorkbookFactory.create(existingXlsx);

    } catch (Exception e) {
      e.printStackTrace();
    }
  }

POI ドキュメントで推奨されているooxml-schemas-1.1.jarを使用していますか?

編集

うーん。jarからも仕事です。

  1. http://poi.apache.org/download.htmlから poi-bin-3.9-20121203.tar.gzをダウンロードしました。

  2. Eclipse で新しいプロジェクトを作成し、zip からすべての jar ファイルを抽出しました。

    • lib/commons-codec-1.5.jar
    • lib/commons-logging-1.1.jar
    • lib/dom4j-1.6.1.jar
    • lib/junit-3.8.1.jar
    • lib/log4j-1.2.13.jar
    • lib/poi-3.9-20121203.jar
    • lib/poi-examples-3.9-20121203.jar
    • lib/poi-excelant-3.9-20121203.jar
    • lib/poi-ooxml-3.9-20121203.jar
    • lib/poi-ooxml-schemas-3.9-20121203.jar
    • lib/poi-scratchpad-3.9-20121203.jar
    • lib/stax-api-1.0.1.jar
    • lib/xmlbeans-2.3.0.jar
  3. テスト xlsx を追加します。
    • テストデータ/test2.xlsx
  4. テスト Java:
    • src/XlsxReadTest1.java

ソース:

    import java.io.File;
    import org.apache.poi.ss.usermodel.Workbook;
    import org.apache.poi.ss.usermodel.WorkbookFactory;

    public class XlsxReadTest1 {
      public static void main(String arg []){
        try {

          File existingXlsx = new File("c:/Java/__Work/apache_POI/poi-3.9-bin/test-data/test2.xlsx");
          System.out.println("File Exists: " + existingXlsx.exists());

          Workbook workbook = WorkbookFactory.create(existingXlsx);

          System.out.println("A1: " + workbook.getSheetAt(0).getRow(0).getCell(0).getStringCellValue());

        } catch (Exception e) {
          e.printStackTrace();
        }
      }
    }
  1. 走る。(jdk1.7.0_07、jdk1.6.0_31で試行)

  2. 結果:

    File Exists: true
    A1: Testing Edit
    

" Testing Edit " は、ファイルの最初のシートの最初のセルの内容です。

私は、あなたはこれを最初から試してみてもよいと思います。

(プロジェクトに他の jar を使用している可能性があります。クラス ローダーでこの jar を妨害するのは誰ですか? クラス ローダーは狡猾な男です...)

于 2013-08-20T12:39:13.050 に答える
4

間違った poi パッケージを使用しただけだと思います。以下をダウンロードするか、ページから最新バージョンを確認してください。

以下は、Eclipse 開発でテストしたものです。

http://www.apache.org/dyn/closer.cgi/poi/release/bin/poi-bin-3.9-20121203.zip を解凍し、すべての jar を Eclipse ライブラリに含めます。

日食構造

私はuser1234の答えと私自身のアプローチを組み合わせています。どちらもあなたのtest2.xlsxに取り組んでいます

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

            import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
            import org.apache.poi.openxml4j.opc.OPCPackage;
            import org.apache.poi.ss.usermodel.Cell;
            import org.apache.poi.ss.usermodel.Row;
            import org.apache.poi.ss.usermodel.Sheet;
            import org.apache.poi.ss.usermodel.Workbook;
            import org.apache.poi.xssf.extractor.XSSFExcelExtractor;
            import org.apache.poi.xssf.usermodel.XSSFWorkbook;
            import org.apache.xmlbeans.XmlException;


            public class Main {

                /**
                 * @param args
                 */
                public static void main(String[] args) {
                    //      File existingXlsx = new File("app.xlsx");

                    File file = new File("test2.xlsx");
                    FileInputStream fs;
                    try {
                        fs = new FileInputStream(file);

                        OPCPackage xlsx = OPCPackage.open(fs);
                        XSSFExcelExtractor xe = new XSSFExcelExtractor(xlsx);
                        System.out.println(xe.getText());


                    } catch (FileNotFoundException e1) {
                        e1.printStackTrace();
                    } catch (XmlException e) {
                        e.printStackTrace();
                    } catch (OpenXML4JException e) {
                        e.printStackTrace();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                    /// -------------- Another approach

                    File existingXlsx = new File("test2.xlsx");
                    System.out.println("File Exists: " + existingXlsx.exists());

                    try {
                        Workbook workbook = new XSSFWorkbook(new FileInputStream(
                            existingXlsx));

                        Sheet worksheet = workbook.getSheet("Filter criteria");
                        Row row1 = worksheet.getRow(0);
                        Cell cellA1 = row1.getCell((short) 0);
                        String a1Val = cellA1.getStringCellValue();


                        System.out.println("A1: " + a1Val);

                    } catch (IOException e) {
                        e.printStackTrace();
                    }

                }

            }

最後に私は結果を得ました:

ここに画像の説明を入力

于 2013-08-21T23:06:35.137 に答える