web developer๐Ÿ‘ฉ๐Ÿป‍๐Ÿ’ป

POI SAX XSSFReader ๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ ํŒŒ์ผ ์ฝ๊ธฐ OOME(Out of Memory Error) ๋ฐฉ์ง€ ๋ณธ๋ฌธ

Spring

POI SAX XSSFReader ๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ ํŒŒ์ผ ์ฝ๊ธฐ OOME(Out of Memory Error) ๋ฐฉ์ง€

natrue 2024. 5. 23. 16:23
728x90

* ์ผ๋‹จ ์‹œ์ž‘ ์ „์— ๋Œ€์šฉ๋Ÿ‰ ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•œ  eclipse Heap ์˜์—ญ ๋Š˜๋ฆฌ๊ธฐ

eclipse .ini ํŒŒ์ผ์„ ์—ด๊ธฐ Xms (์‹œ์ž‘ํฌ๊ธฐ) / Xmx (์ตœ๋Œ€ํฌ๊ธฐ) ์ˆ˜์ •ํ•˜๊ธฐ 

์ฐธ๊ณ ๋กœ Xmx ์ตœ๋Œ€ํฌ๊ธฐ๋Š” ์ž๊ธฐ์˜ pc ram ์‚ฌ์–‘์„ ํ™•์ธํ•˜๊ณ  ๋ฐ”๊พธ๊ธฐ ์ถ”์ฒœ

 

JVM ๋ฉ”๋ชจ๋ฆฌ ์ฒดํฌํ•˜๋Š” ๋ฐฉ๋ฒ• 

// ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ „์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ
Runtime runtime = Runtime.getRuntime();
long memoryBefore = runtime.totalMemory() - runtime.freeMemory();

totalMemory(): JVM์ด ํ• ๋‹นํ•œ ์ „์ฒด ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ๋ฐ˜ํ™˜.  JVM์˜ ์ดˆ๊ธฐ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์™€ ์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ํ•ฉ์นœ ๊ฐ’ 
freeMemory(): ํ˜„์žฌ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ ์–‘์„ ๋ฐ˜ํ™˜. ํ˜„์žฌ ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ ์ค‘์—์„œ ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์˜์—ญ์˜ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธ

์—‘์…€ ํŒŒ์ผ์ฝ๊ธฐ๋ฅผ ์œ„ํ•ด ์‚ฌ์šฉํ•œ 3๊ฐ€์ง€ ๋ฐฉ๋ฒ• 

<form action="/excelUpload.do"  enctype="multipart/form-data" method="post">
    <input type="file" name="excelFile">
    <button type="submit">Upload</button>
</form>

1.  XSSFWorkbook ์‚ฌ์šฉ

@ResponseBody
	@RequestMapping(value = "/excelUpload.do", method = RequestMethod.POST)
	public void excelUpload(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	    response.setContentType("text/html;charset=UTF-8");
	    try {
	        // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ „์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ
	        Runtime runtime = Runtime.getRuntime();
	        long memoryBefore = runtime.totalMemory() - runtime.freeMemory();
	        System.out.println("Memory Before Processing (bytes): " + memoryBefore);

	        MultipartFile file = request.getFile("excelFile");

	        if (file != null) {
	            // ํŒŒ์ผ ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ
	            File uploadedFile = new File(file.getOriginalFilename());
	            file.transferTo(uploadedFile);
	            long fileSizeBytes = uploadedFile.length(); // ํŒŒ์ผ ํฌ๊ธฐ (๋ฐ”์ดํŠธ ๋‹จ์œ„)
	            double fileSizeMB = fileSizeBytes / (1024.0 * 1024.0); // ํŒŒ์ผ ํฌ๊ธฐ (MB ๋‹จ์œ„)
	            System.out.println("ํŒŒ์ผ ํฌ๊ธฐ: " + fileSizeMB + " MB");

	            InputStream fileContent = file.getInputStream();
	            XSSFWorkbook workbook = new XSSFWorkbook(fileContent);

	            // ํŠน์ • ์ด๋ฆ„์˜ ์‹œํŠธ
	            XSSFSheet sheet = workbook.getSheet("B");
	            System.out.println("sheet ::" + sheet);

	            int rowLength = 0;
	            for (Row row : sheet) {
	                rowLength = row.getLastCellNum();
	                for (Cell cell : row) {
	                }
	            }

	            // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ›„, ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค ํ•ด์ œ
	            workbook.close();

	        } else {
	            response.getWriter().println("No file uploaded.");
	        }

	        // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ›„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ
	        long memoryAfter = runtime.totalMemory() - runtime.freeMemory();
	        System.out.println("Memory After Processing (bytes): " + memoryAfter);
	        long memoryUsed = memoryAfter - memoryBefore;
	        System.out.println("Memory Used (bytes): " + memoryUsed);

	    } catch (Exception e) {
	        e.printStackTrace();
	        response.getWriter().println("Error processing Excel file.");
	    }
	}

2. XSSFWorkbook  + opcPackage ์‚ฌ์šฉ

<form action="/excelUploadOpc.do"  enctype="multipart/form-data" method="post">
    <input type="file" name="excelFile">
    <button type="submit">Upload</button>
</form>

 OPCPackage๋ฅผ ์‚ฌ์šฉ : ์—‘์…€ ํŒŒ์ผ์„ OOXML(์˜คํ”ˆ XML ๋ฌธ์„œ) ํ˜•์‹์œผ๋กœ ์••์ถ•ํ•ด์„œ ๊ฐ€์ ธ์˜ด. 

	@ResponseBody
	@RequestMapping(value = "/excelUploadOpc.do", method = RequestMethod.POST)
	public void excelUploadOpc(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	    response.setContentType("text/html;charset=UTF-8");
        
	    try {
	        // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ „์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ
	        Runtime runtime = Runtime.getRuntime();
	        long memoryBefore = runtime.totalMemory() - runtime.freeMemory();
	        System.out.println("Memory Before Processing (bytes): " + memoryBefore);

	        MultipartFile file = request.getFile("excelFile");

	        if (file != null) {
	            // ํŒŒ์ผ ํฌ๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ
	            File uploadedFile = new File(file.getOriginalFilename());
	            file.transferTo(uploadedFile);
	            long fileSizeBytes = uploadedFile.length(); // ํŒŒ์ผ ํฌ๊ธฐ (๋ฐ”์ดํŠธ ๋‹จ์œ„)
	            double fileSizeMB = fileSizeBytes / (1024.0 * 1024.0); // ํŒŒ์ผ ํฌ๊ธฐ (MB ๋‹จ์œ„)
	            System.out.println("ํŒŒ์ผ ํฌ๊ธฐ: " + fileSizeMB + " MB");

	            InputStream fileContent = file.getInputStream();

	            // OPCPackage๋ฅผ ์‚ฌ์šฉ : ์—‘์…€ ํŒŒ์ผ์„ OOXML(์˜คํ”ˆ XML ๋ฌธ์„œ)ํ˜•์‹์œผ๋กœ ์••์ถ•ํ•ด์„œ ๊ฐ€์ ธ์˜จ๋‹ค.
	            OPCPackage opcPackage = OPCPackage.open(fileContent);
	            XSSFWorkbook workbook = new XSSFWorkbook(opcPackage);

	            // ํŠน์ • ์ด๋ฆ„์˜ ์‹œํŠธ
	            XSSFSheet sheet = workbook.getSheet("B");
	            System.out.println("sheet ::" + sheet);

	            int rowLength = 0;
	            for (Row row : sheet) {
	                rowLength = row.getLastCellNum();
	                for (Cell cell : row) {
	                }
	            }

	            // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ›„, ๋ฉ”๋ชจ๋ฆฌ ๋ฆฌ์†Œ์Šค ํ•ด์ œ
	            workbook.close();
	            opcPackage.close();

	        } else {
	            response.getWriter().println("No file uploaded.");
	        }

	        // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ›„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ
	        long memoryAfter = runtime.totalMemory() - runtime.freeMemory();
	        System.out.println("Memory After Processing (bytes): " + memoryAfter);
	        long memoryUsed = memoryAfter - memoryBefore;
	        System.out.println("Memory Used (bytes): " + memoryUsed);

	    } catch (Exception e) {
	        e.printStackTrace();
	        response.getWriter().println("Error processing Excel file.");
	    }
	}

*** 3. SAX ์‚ฌ์šฉ *** 

๋ฐ์ดํ„ฐ๋ฅผ ์ˆœ์ฐจ์ ์œผ๋กœ ์ฝ์–ด ๋‚ด๋ ค๊ฐ€๋ฉฐ ๋…ธ๋“œ์˜ ์‹œ์ž‘๊ณผ ๋๋ถ€๋ถ„์— ์ด๋ฒคํŠธ๋ฅผ ๋ฐœ์ƒ์‹œํ‚จ๋‹ค.

๋ฌธ์„œ ์ „์ฒด๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์— ์˜ฌ๋ฆฌ์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ๋Ÿ‰์ด ์ ๊ณ  ๋‹จ์ˆœํžˆ ์ฝ๊ธฐ๋งŒ ํ•  ๋•Œ ๋น ๋ฅธ ์†๋„๋ฅผ ๋ณด์ธ๋‹ค.

<form action="/excelUploadSax.do"  enctype="multipart/form-data" method="post">
    <input type="file" name="excelFile">
    <button type="submit">Upload</button>
</form>
@ResponseBody
	@RequestMapping(value = "/excelUploadSax.do", method = RequestMethod.POST)
	public void excelUploadSax(MultipartHttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {
	    response.setContentType("text/html;charset=UTF-8");
	
	    try {
	        // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ์ „์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ
	        Runtime runtime = Runtime.getRuntime();
	        long memoryBefore = runtime.totalMemory() - runtime.freeMemory();
	        System.out.println("Memory Before Processing (bytes): " + memoryBefore);

	        MultipartFile file = request.getFile("excelFile");
	        
                // ๋ฐฉ์‹1
                // SheetHandler excelSheetHandler = ExcelSheetHandler.readExcel(file);
                // ๋ฐฉ์‹2
                SheetHandler excelSheetHandler = ExcelSheetHandler.readExcel2(file);
            
                // ์—‘์…€ ํ—ค๋” ๊ฐ’ ๊ฐ€์ ธ์˜ค๊ธฐ 
                List<String> excelHeader = excelSheetHandler.getHeader();
                // ์—‘์…€ ๋‹ด๊ธด ๋ฐ์ดํ„ฐ ๊ฐ€์ ธ์˜ค๊ธฐ 
                List<List<String>> excelDatas = excelSheetHandler.getRows();
	        
                System.out.println("excelDatas :: " + excelDatas);
                System.out.println("excelHeader :: " + excelHeader);
                
	        // ์—‘์…€ ํŒŒ์ผ ์ฒ˜๋ฆฌ ํ›„์˜ ๋ฉ”๋ชจ๋ฆฌ ์ƒํƒœ ์ถœ๋ ฅ
	        long memoryAfter = runtime.totalMemory() - runtime.freeMemory();
	        System.out.println("Memory After Processing (bytes): " + memoryAfter);
	        long memoryUsed = memoryAfter - memoryBefore;
	        System.out.println("Memory Used (bytes): " + memoryUsed);

	    } catch (Exception e) {
	        e.printStackTrace();
	        response.getWriter().println("Error processing Excel file.");
	    }
	}
์ถœ๋ ฅ ๊ฒฐ๊ณผ 
excelDatas :: [[2, 2, 2, 2, 2, 2, 2], [3, 3, 3, 3, 3, 3, 3], [4, 4, 4, 4, 4, 4, 4], [5, 5, 5, 5, 5, 5, 5], [6, 6, 6, 6, 6, 6, 6], [7, 7, 7, 7, 7, 7, 7], [8, 8, 8, 8, 8, 8, 8], [9, 9, 9, 9, 9, 9, 9], [10, 10, 10, 10, 10, 10, 10], [11, 11, 11, 11, 11, 11, 11], [12, 12, 12, 12, 12, 12, 12], [13, 13, 13, 13, 13, 13, 13], [14, 14, 14, 14, 14, 14, 14], [15, 15, 15, 15, 15, 15, 15]]
excelHeader :: [1, 1, 1, 1, 1, 1, 1]



ExcelSheetHandler.java

package egovframework.com.cmm.web;
import java.io.InputStream;

import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.util.SAXHelper;
import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.model.StylesTable;
import org.springframework.web.multipart.MultipartFile;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;

public class ExcelSheetHandler {

  // ๋ฐฉ์‹ 1
  public static SheetHandler readExcel(MultipartFile file) {
  SheetHandler sheetHandler = new SheetHandler();
 
  try {
        // MultipartFile์—์„œ InputStream ๊ฐ€์ ธ์˜ค๊ธฐ
        InputStream inputStream = file.getInputStream();

        // InputStream์„ ์‚ฌ์šฉํ•˜์—ฌ OPCPackage ์—ด๊ธฐ
        OPCPackage pkg = OPCPackage.open(inputStream);

        XSSFReader xssfReader = new XSSFReader(pkg);
        ReadOnlySharedStringsTable data = new ReadOnlySharedStringsTable(pkg);
        StylesTable styles = xssfReader.getStylesTable();

        InputStream sheetStream = xssfReader.getSheetsData().next();
        //InputStream sheetStream = xssfReader.getSheet("rId1"); // ์ฒซ๋ฒˆ์งธ ์‹œํŠธ๋งŒ ๊บผ๋‚ด๊ธฐ
        
        // <ํŠน์ • ์‹œํŠธ๋งŒ ๊บผ๋‚ด๊ณ ์‹ถ์„๊ฒฝ์šฐ>
        // InputStream sheetStream = xssfReader.getSheet("rId1"); // ์ฒซ๋ฒˆ์งธ ์‹œํŠธ๋งŒ ๊บผ๋‚ด๊ธฐ 
        // rId1 - 1๋ฒˆ์งธ์‹œํŠธ rId2 - 2๋ฒˆ์งธ์‹œํŠธ๋ฅผ ์˜๋ฏธ 
        
        InputSource sheetSource = new InputSource(sheetStream);
        ContentHandler handler = new XSSFSheetXMLHandler(styles, data, sheetHandler, false);
        XMLReader sheetParser = SAXHelper.newXMLReader();
        sheetParser.setContentHandler(handler);
        sheetParser.parse(sheetSource);
        sheetStream.close();

      } catch (Exception e) {
          throw new RuntimeException(e);
      }
	
   return sheetHandler;
 }



   
   // ๋ฐฉ์‹ 2
   public static SheetHandler readExcel2(MultipartFile file) {
   SheetHandler sheetHandler = new SheetHandler();
    try {
        // ์—…๋กœ๋“œ๋œ ํŒŒ์ผ์˜ InputStream ์–ป๊ธฐ
        InputStream inputStream = file.getInputStream();

        // InputStream์œผ๋กœ๋ถ€ํ„ฐ OPCPackage ์—ด๊ธฐ
        OPCPackage pkg = OPCPackage.open(inputStream);

        // XSSFReader๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ OPCPackage์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ธฐ
        XSSFReader xssfReader = new XSSFReader(pkg);
        ReadOnlySharedStringsTable data = new ReadOnlySharedStringsTable(pkg);
        StylesTable styles = xssfReader.getStylesTable();

        // ์‹œํŠธ๋ฅผ ๋ฐ˜๋ณตํ•˜๋ฉด์„œ ์ฒ˜๋ฆฌ
        XSSFReader.SheetIterator sheetIterator = (XSSFReader.SheetIterator) xssfReader.getSheetsData();

        InputStream sheetStream = null;
        while (sheetIterator.hasNext()) {
            InputStream currentSheetStream = sheetIterator.next();
            
            // sheetName์œผ๋กœ ๋ถ„๋ฅ˜ํ•˜๊ธฐ 
            String sheetName = sheetIterator.getSheetName();
            // ํŠน์ • ์‹œํŠธ๋“ค์„ ๊ฑด๋„ˆ๋›ฐ๊ธฐ
            if ("์ฃผ์˜์‚ฌํ•ญ".equals(sheetName)) { 
                sheetStream = currentSheetStream;
                System.out.println("sheetName :: " + sheetName); 
            }
        }

        // ์ฒ˜๋ฆฌํ•  ์‹œํŠธ๊ฐ€ ์—†์œผ๋ฉด ์˜ˆ์™ธ ๋ฐœ์ƒ
        if (sheetStream == null) {
            throw new IllegalArgumentException("Sheet not found");
        }

        // ์‹œํŠธ์˜ InputSource ์ƒ์„ฑ
        InputSource sheetSource = new InputSource(sheetStream);

        // XSSFSheetXMLHandler๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œํŠธ์˜ ๋‚ด์šฉ์„ ์ฒ˜๋ฆฌํ•  ContentHandler ์ƒ์„ฑ
        ContentHandler handler = new XSSFSheetXMLHandler(styles, data, sheetHandler, false);

        // SAX ํŒŒ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ContentHandler ์„ค์ •ํ•˜์—ฌ ์‹œํŠธ์˜ ๋‚ด์šฉ ํŒŒ์‹ฑ
        XMLReader sheetParser = SAXHelper.newXMLReader();
        sheetParser.setContentHandler(handler);
        sheetParser.parse(sheetSource);
        sheetStream.close();

    } catch (Exception e) {
        throw new RuntimeException(e);
    }
     return sheetHandler;
  }
}

 

 

Apache POI Streaming API doesn't recognize Excel (xlsx) content

I have a class which ingests .xlsx-files. I took it from this example and modified it for my needs: https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XL...

stackoverflow.com

 

SheetHandler.java

package egovframework.com.cmm.web;
import java.util.ArrayList;
import java.util.List;
 
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler;
import org.apache.poi.xssf.usermodel.XSSFComment;
public class SheetHandler implements SheetContentsHandler {
	 
    private List<List<String>> rows = new ArrayList<>();
 
    private List<String> row = new ArrayList<>();
 
    private List<String> header = new ArrayList<>();
 
    private int currentCol = -1;
 
    private int currRowNum = 0;
     
    public List<String> getHeader() {
      return header;
    }
     
    public List<List<String>> getRows() {
      return rows;
    }
 
    public void startRow(int rowNum) {
 
        this.currentCol = -1;
        this.currRowNum = rowNum;
 
    }
 
    public void endRow(int rowNum) {
        if(rowNum ==0) {
            header = new ArrayList(row);
        } else {
            if(row.size() < header.size()) {
                for (int i = row.size(); i < header.size(); i++) {
                    row.add("");
                }
            }
            rows.add(new ArrayList(row));
        }
       row.clear();
    }
 
    public void cell(String columnName, String value, XSSFComment var3) {
        int iCol = (new CellReference(columnName)).getCol();
        int emptyCol = iCol - currentCol - 1;
 
        for(int i = 0 ; i < emptyCol ; i++) {
            row.add("");
        }
        currentCol = iCol;
        row.add(value);
    }
 
    public void headerFooter(String text, boolean isHeader, String tagName) {
 
    }
}

ํ…Œ์ŠคํŠธ ๊ฒฐ๊ณผ

 

107MB ํฌ๊ธฐ์˜ .xlsx ํŒŒ์ผ ํ…Œ์ŠคํŠธ

XSSFWorkbook ์‚ฌ์šฉ OutOfMemoryError ๋ฐœ์ƒ  
XSSFWorkbook + OPCPackage ์‚ฌ์šฉ OutOfMemoryError ๋ฐœ์ƒ  
SAX ์ฒซ๋ฒˆ์งธ ์‹œํŠธ๋ฏผ ์‚ฌ์šฉ Memory Before Processing (bytes): 377,279,896
Memory After Processing (bytes): 1,312,857,664
Memory Used (bytes): 935,577,768
SAX ๋‘๋ฒˆ์งธ ์‹œํŠธ๋ฏผ ์‚ฌ์šฉ Memory Before Processing (bytes): 374,138,704
Memory After Processing (bytes): 1,156,792,120
Memory Used (bytes): 782,653,416
SAX ์ „์ฒด ์‹œํŠธ ์‚ฌ์šฉ Memory Before Processing (bytes): 376,451,232
Memory After Processing (bytes): 1,683,191,008
Memory Used (bytes): 1,306,739,776

 

213MB ํฌ๊ธฐ์˜ .xlsx ํŒŒ์ผ ํ…Œ์ŠคํŠธ

XSSFWorkbook ์‚ฌ์šฉ OutOfMemoryError ๋ฐœ์ƒ  
XSSFWorkbook + OPCPackage ์‚ฌ์šฉ OutOfMemoryError ๋ฐœ์ƒ  
SAX ์„ธ๋ฒˆ์งธ ์‹œํŠธ๋ฏผ ์‚ฌ์šฉ Memory Before Processing (bytes): 374,325,384
Memory After Processing (bytes): 2,266,669,232
Memory Used (bytes): 1,892,343,848
SAX ์ „์ฒด ์‹œํŠธ ์‚ฌ์šฉ Memory Before Processing (bytes): 235,024,768
Memory After Processing (bytes): 2,764,111,600
Memory Used (bytes): 2,529,086,832

 

 

 

XSSFReader (POI API Documentation)

java.io.InputStream getWorkbookData() Returns an InputStream to read the contents of the main Workbook, which contains key overall data for the file, including sheet definitions.

poi.apache.org

 

Java ๋Œ€์šฉ๋Ÿ‰ ์—‘์…€ ์—…๋กœ๋“œ

์›น ์„œ๋น„์Šค๋ฅผ ํ†ตํ•ด ์‚ฌ์šฉ์ž๋กœ๋ถ€ํ„ฐ ๋ฐ์ดํ„ฐ๋ฅผ ์ž…๋ ฅ ๋ฐ›๋Š” ์ž…์žฅ์—์„œ, ์ค‘๋ณต๋œ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๋Œ€๋Ÿ‰์œผ๋กœ ์ž…๋ ฅ ๋ฐ›๊ธฐ...

blog.naver.com