programing

손상된 파일 처리

starjava 2023. 5. 17. 22:19
반응형

손상된 파일 처리

아파치 POI로 손상된 파일을 처리하는 것에 대한 조언이 있는 사람이 있는지 알고 싶습니다.

파일을 열려고 하면 다음 메시지가 표시됩니다.

Exception in thread "main" org.apache.poi.hssf.record.RecordInputStream$LeftoverDataException: Initialisation of record 0x1C left 2 bytes remaining still to be read.
    at org.apache.poi.hssf.record.RecordInputStream.hasNextRecord(RecordInputStream.java:156)
    at org.apache.poi.hssf.record.RecordFactoryInputStream.nextRecord(RecordFactoryInputStream.java:231)
    at org.apache.poi.hssf.record.RecordFactory.createRecords(RecordFactory.java:480)
    at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:301)
    at org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:95)
    at ExcelImporter.EditFileImportDialog.main(EditFileImportDialog.java:409)

여기 SSCCE가 있습니다.

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class EditFileImportDialog {

    /* Omitted irrelevent code */

    public static void main(String[] args) {
        File file = new File("Z:\\Path\\To\\File_causing_the_trouble.xls");
        try {
            Workbook wb = WorkbookFactory.create(file);  // Line 409 for ref to the exception stack trace
            System.out.println(wb);
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이 문제는 이 파일에서만 발생하며, 엑셀에서 파일을 열고 저장한 후 다음으로 열려고 하면 예외가 발생하지 않습니다.POI이 일을 어떻게 처리할 것인지에 대한 제안이 있습니까?

편집:

참고로, 제 문제는 이 질문과 관련이 있을 수 있지만 업그레이드 중입니다.POI문제를 해결하지 못했으며 설명된 파일과 다른 점이 있습니다.비슷한 답을 찾아봤지만 엑셀 파일 자체에 무슨 문제가 있는지 아는 사람이 있다면 파일을 패치할 수 있는 글을 쓸 수 있을 것 같습니다.

편집 2

파일 생성이 내 제어 범위 내에 없습니다.Excel은 파일을 열고 다시 저장하기만 하면 파일 자체를 수정합니다.하지만 제 질문은 누가 이 손상된 파일을 Excel이 문제를 해결할 수 있는 것과 같은 방식으로 POI를 조정/증강할 수 있는 방법을 생각해 낼 수 있는지에 대한 것입니다.

EDIT 3

여러 의견/답변에 대한 답변:

저의 최종 목표는 엑셀을 전혀 사용하지 않는 것입니다.

  1. 파일이 전송됩니다.
  2. 프로그램이 실행됩니다.
  3. 오류를 처리합니다.
  4. 데이터를 처리합니다.

HSSF Workbook을 사용하여 .xls 파일을 열어볼 수 있습니다.

다음 코드를 사용하여 POI가 xls 형식을 결정하는 방법을 확인할 수 있습니다.

private boolean isExcel(InputStream i) throws IOException {
return (POIFSFileSystem.hasPOIFSHeader(i) || POIXMLDocument.hasOOXMLHeader(i));
}

다음을 사용합니다.

InputStream input = new FileInputStream(fileName);

다음 대신:

File file = new File("Z:\\Path\\To\\File_causing_the_trouble.xls");

당신의 파일에 있는 셀 0x1C에 무슨 문제가 있는지 확인했습니까?

가장 좋은 방법은 새 파일을 만들고 프로그램을 실행하기 전에 파일을 닫아야 한다는 것을 기억하는 것입니다.그것이 가장 간단한 해결책이 될 것입니다.

스레드 메인의 예외는 코딩 문제가 아닙니다.Excel-Workbook에서 잘못된 셀 참조를 교체해야 합니다!

main org.apache.poi.hssf.record 스레드에서 예외가 발생했습니다.RecordInputStream$LeftoverDataException:레코드 0x23을 초기화하면 12바이트가 여전히 읽혀집니다.

DDE 셀 참조가 포함된 POI HSSF로 Excel-Workbook을 열려고 할 때 이 예외가 발생합니다.셀 참조 유형인 'Excel'에 문제가 있습니다.유형.12'(예: =개요).Sheet.12|'\servername\pathname\워크북.xlsx'!시트명!Z23S22'

해결 방법:참조를 예: ='Drive:\pathname[Workbook.xlsx]Sheetname' 유형의 참조로 대체합니다.$V$23

워크북을 저장하고 다시 시도합니다.

파일 입력 스트림에서 대신 XSSF 워크북을 만들어 보십시오.

변경된 샘플은 다음과 같습니다.

import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.usermodel.WorkbookFactory;

public class EditFileImportDialog {

    /* Omitted irrelevent code */

    public static void main(String[] args) {
        String file = "Z:\\Path\\To\\File_causing_the_trouble.xls";
        try {
            InputStream databaseFile = new FileInputStream(file);
            XSSFWorkbook  wb = new XSSFWorkbook(databaseFile);  
            System.out.println(wb);
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

이미 확인했을 수도 있지만, 확인하지 않은 경우 도움이 된다면 https://bz.apache.org/bugzilla/show_bug.cgi?id=47251 을 참조하십시오.유사한 문제가 있으며 해결 방법에 대한 답을 찾을 수 있습니다.

언급URL : https://stackoverflow.com/questions/22786968/damaged-file-handling

반응형