손상된 파일 처리
아파치 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
여러 의견/답변에 대한 답변:
저의 최종 목표는 엑셀을 전혀 사용하지 않는 것입니다.
- 파일이 전송됩니다.
- 프로그램이 실행됩니다.
- 오류를 처리합니다.
- 데이터를 처리합니다.
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
'programing' 카테고리의 다른 글
MongoDB - 오류: 잘못된 스키마, mongodb가 필요합니다. (0) | 2023.05.22 |
---|---|
String.Format - 작동 방법 및 사용자 정의 형식 문자열 구현 방법 (0) | 2023.05.17 |
Azure 큐 저장소에서 개체 메시지 전달 (0) | 2023.05.17 |
임의의 길이의 목록 요소의 가능한 모든 (2^N) 조합 가져오기 (0) | 2023.05.17 |
상위 양식의 중앙 MessageBox (0) | 2023.05.17 |