Java가 Apache POI 라이브러리를 사용하여 Excel 테이블 문서를 읽는 예
프로젝트 다운로드 페이지:http://poi.apache.org/download.html
Apache POI는 Office Open XML(OOXML) 표준과 마이크로소프트의 OLE2 복합 문서 형식(OLE2)에 맞는 다양한 작업을 만들고 유지하는 Java API입니다.Java를 사용하여 MS Excel 파일을 읽고 작성할 수 있습니다.또한 Java를 사용하여 MS Word 및 MSPowerPoint 파일을 읽고 작성할 수도 있습니다.Apache POI는 Java Operation Excel 솔루션을 제공합니다.
POI의 HSSFWorkbook을 사용하여 Excel 데이터를 읽습니다.
public void test(File file) throws IOException {
InputStream inp = new FileInputStream(file);
HSSFWorkbook workbook = new HSSFWorkbook(inp);
// workbook...
}
위 코드, Excel 2003(xls)의 파일을 읽는 것은 문제없지만, Excel 2007(xlsx)의 파일을 읽으면 "The supplied data appears to be in the Office 2007 + XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call different part of POI to processthis data(eg XSSF instead of HSSF)"Excel 2007 버전의 Excel 파일은 다음과 같이 XSSFWorkbook을 사용하여 읽어야 합니다.
public void test(File file) throws IOException {
InputStream inp = new FileInputStream(file);
XSSFWorkbook workbook = new XSSFWorkbook(inp);
// workbook...
}
참고: XSSFWorkbook은 poi-ooxml-3.9 소스를 추가로 가져와야 합니다.jar와poi-ooxml-schemas-3.9.jar.이렇게 하면 Excel 2007을 가져오는 데 문제가 없지만 Excel 2003을 가져오면 이상이 발생합니다.
따라서 Excel을 가져올 때 Excel을 가져올 버전을 판단하고 다른 방법을 사용할 수 있습니다.
나는 파일 접두사 이름을 사용하여 유형을 판단할 생각을 했지만, 만약 누군가가 xlsx의 접두사를 xls로 바꿀 때, xlsx의 함수를 사용하여 읽으면 결과는 오류입니다.접두사 이름이 맞지만 파일 내용 인코딩 등이 맞지 않습니다.
마지막으로 poi-ooxml의 WorkbookFactory를 사용하는 것을 추천합니다.HSSFWorkbook과 XSSFWorkbook이 모두 Workbook 인터페이스를 실현하기 때문에 create(inputStream)를 사용하여 Workbook을 만듭니다.코드는 다음과 같습니다.
Workbook wb = WorkbookFactory.create(is);
WorkbookFactory에서create () 함수에서 파일 형식에 대한 판단이 있었을 것입니다. 원본 코드가 어떻게 판단되었는지 함께 보십시오.
/**
* Creates the appropriate HSSFWorkbook / XSSFWorkbook from
* the given InputStream.
* Your input stream MUST either support mark/reset, or
* be wrapped as a {@link PushbackInputStream}!
*/
public static Workbook create(InputStream inp) throws IOException, InvalidFormatException {
// If clearly doesn't do mark/reset, wrap up
if(! inp.markSupported()) {
inp = new PushbackInputStream(inp, 8);
}
if(POIFSFileSystem.hasPOIFSHeader(inp)) {
return new HSSFWorkbook(inp);
}
if(POIXMLDocument.hasOOXMLHeader(inp)) {
return new XSSFWorkbook(OPCPackage.open(inp));
}
throw new IllegalArgumentException("Your InputStream was neither an OLE2 stream, nor an OOXML stream");
}
파일 유형에 따라 적절한 Workbook 객체를 작성할 수 있습니다.파일의 머리 정보에 따라 비교하여 판단하는 것인데, 이때 접두사 이름을 바꾸어도 여전히 통할 수 없다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JPA + QueryDSL 계층형 댓글, 대댓글 구현(2)이번엔 전편에 이어서 계층형 댓글, 대댓글을 다시 리팩토링해볼 예정이다. 이전 게시글에서는 계층형 댓글, 대댓글을 구현은 되었지만 N+1 문제가 있었다. 이번에는 그 N+1 문제를 해결해 볼 것이다. 위의 로직은 이...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.