programing

Java에서 XLSX 파일 읽기

fastcode 2023. 4. 20. 23:00
반응형

Java에서 XLSX 파일 읽기

Java 어플리케이션에서 Excel 2007 XLSX 파일을 읽어야 합니다.이 작업을 수행하기 위한 좋은 API를 알고 있는 사람이 있습니까?

Apache POI 3.5는 모든 OOXML(docx, xlsx 등)에 대한 지원을 추가했습니다.

XSSF 서브프로젝트 참조

AFIK는 아직 사용할 수 있는 xlsx 라이브러리가 없습니다.그러나 오래된 xls에는 다음과 같은 것이 있습니다.

1개의 라이브러리는 이미 언급한 POI를 내부적으로 사용하는 jxls입니다.

다른 2개의 링크: Excel 파일, Java 라이브러리 처리로 Excel XLS 문서 파일을 읽고 쓸 수 있습니다.

조금 늦을 수도 있지만, 베타 POI는 xlsx를 지원하게 되었습니다.

이것을 시험해 보세요.

  1. XLSX 파일의 압축 해제
  2. XML 파일 읽기
  3. 데이터 구성 및 사용

코드 예:

    public Workbook getTemplateData(String xlsxFile) {
    Workbook workbook = new Workbook();
    parseSharedStrings(xlsxFile);
    parseWorkesheet(xlsxFile, workbook);
    parseComments(xlsxFile, workbook);
    for (Worksheet worksheet : workbook.sheets) {
        worksheet.dimension = manager.getDimension(worksheet);
    }

    return workbook;
}

private void parseComments(String tmpFile, Workbook workbook) {
    try {
        FileInputStream fin = new FileInputStream(tmpFile);
        final ZipInputStream zin = new ZipInputStream(fin);
        InputStream in = getInputStream(zin);
        while (true) {
            ZipEntry entry = zin.getNextEntry();
            if (entry == null)
                break;

            String name = entry.getName();
            if (name.endsWith(".xml")) { //$NON-NLS-1$
                if (name.contains(COMMENTS)) {
                    parseComments(in, workbook);
                }
            }
            zin.closeEntry();
        }
        in.close();
        zin.close();
        fin.close();
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

private void parseComments(InputStream in, Workbook workbook) {
    try {
        DefaultHandler handler = getCommentHandler(workbook);
        SAXParser saxParser = getSAXParser();
        saxParser.parse(in, handler);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private DefaultHandler getCommentHandler(Workbook workbook) {
    final Worksheet ws = workbook.sheets.get(0);
    return new DefaultHandler() {
        String lastTag = "";
        private Cell ccell;

        @Override
        public void startElement(String uri, String localName,
                String qName, Attributes attributes) throws SAXException {
            lastTag = qName;
            if (lastTag.equals("comment")) {
                String cellName = attributes.getValue("ref");
                int r = manager.getRowIndex(cellName);
                int c = manager.getColumnIndex(cellName);
                Row row = ws.rows.get(r);
                if (row == null) {
                    row = new Row();
                    row.index = r;
                    ws.rows.put(r, row);
                }
                ccell = row.cells.get(c);
                if (ccell == null) {
                    ccell = new Cell();
                    ccell.cellName = cellName;
                    row.cells.put(c, ccell);
                }
            }
        }

        @Override
        public void characters(char[] ch, int start, int length)
                throws SAXException {
            String val = "";
            if (ccell != null && lastTag.equals("t")) {
                for (int i = start; i < start + length; i++) {
                    val += ch[i];
                }
                if (ccell.comment == null)
                    ccell.comment = val;
                else {
                    ccell.comment += val;
                }
            }
        }
    };
}

private void parseSharedStrings(String tmpFile) {
    try {
        FileInputStream fin = new FileInputStream(tmpFile);
        final ZipInputStream zin = new ZipInputStream(fin);
        InputStream in = getInputStream(zin);
        while (true) {
            ZipEntry entry = zin.getNextEntry();
            if (entry == null)
                break;
            String name = entry.getName();
            if (name.endsWith(".xml")) { //$NON-NLS-1$
                if (name.startsWith(SHARED_STRINGS)) {
                    parseStrings(in);
                }
            }
            zin.closeEntry();
        }
        in.close();
        zin.close();
        fin.close();
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void parseWorkesheet(String tmpFile, Workbook workbook) {
    try {
        FileInputStream fin = new FileInputStream(tmpFile);
        final ZipInputStream zin = new ZipInputStream(fin);
        InputStream in = getInputStream(zin);
        while (true) {
            ZipEntry entry = zin.getNextEntry();
            if (entry == null)
                break;

            String name = entry.getName();
            if (name.endsWith(".xml")) { //$NON-NLS-1$
                if (name.contains("worksheets")) {
                    Worksheet worksheet = new Worksheet();
                    worksheet.name = name;
                    parseWorksheet(in, worksheet);
                    workbook.sheets.add(worksheet);
                }
            }
            zin.closeEntry();
        }
        in.close();
        zin.close();
        fin.close();
    } catch (FileNotFoundException e) {
        System.out.println(e);
    } catch (IOException e) {
        e.printStackTrace();
    }
}

public void parseWorksheet(InputStream in, Worksheet worksheet)
        throws IOException {
    // read sheet1 sharedStrings
    // styles, strings, formulas ...
    try {
        DefaultHandler handler = getDefaultHandler(worksheet);
        SAXParser saxParser = getSAXParser();
        saxParser.parse(in, handler);
    } catch (SAXException e) {
        e.printStackTrace();
    } catch (ParserConfigurationException e) {
        e.printStackTrace();
    }
}

워크북 클래스:

public class Workbook {
Integer id = null;
public List<Worksheet> sheets = new ArrayList<Worksheet>();}

및 워크시트 클래스:

public class Worksheet {
public Integer id = null;
public String name = null;
public String dimension = null;
public Map<Integer, Row> rows = new TreeMap<Integer, Row>();
public Map<Integer, Column> columns = new TreeMap<Integer, Column>();
public List<Span> spans = new ArrayList<Span>();}

및 행 클래스:

public class Row {
public Integer id = null;
public Integer index = null;
public Row tmpRow = null;
public Style style = null;
public Double height = null;
public Map<Integer,Cell> cells = new TreeMap<Integer, Cell>();
public String spans = null;
public Integer customHeight = null;}

및 셀 클래스:

public class Cell {
public Integer id = null;
public Integer rowIndex = null;
public Integer colIndex = null;
public String cellName = null;
public String text = null;
public String formula = null;
public String comment = null;
public Style style = null;
public Object value = null;
public Cell tmpCell = null;}

및 열 클래스:

public class Column {
    public Integer index = null;
    public Style style = null;
    public String width = null;
    public Column tmpColumn = null;
}

및 스팬 클래스:

public class Span {
    Integer id = null;
    String topLeft = null;
    String bottomRight = null;
}

에서 이 작업을 수행해야 했습니다.NET과 저는 API를 찾을 수 없었습니다.저의 솔루션은 .xlsx의 압축을 풀고 XML을 조작하는 것이었습니다.도우미 클래스 등을 만들면 나쁘지 않습니다.

노드는 모두 엑셀이 예상하는 방식에 따라 정렬해야 하는 것과 같은 "고치"도 있지만 공식 문서에서는 찾을 수 없었습니다.Excel에는 독자적인 날짜 타임스탬프가 있으므로 변환식을 작성해야 합니다.

이 제품은 Excel 2007 xlsx 파일을 읽고 쓸 수 있습니다.스마트 XLS

어떤 옵션도 마음에 들지 않아 결국 엑셀 97포맷으로 파일을 요청하게 되었습니다.POI는 그것에 매우 효과적입니다.도와주셔서 감사합니다.

난독화가 제대로 되지 않은 API를 보셨나요?

신경 쓰지 마세요:

HSSF는 POI 프로젝트에서 Excel '97(-2007) 파일 포맷을 완전히 Java로 구현한 것입니다.OLE2 기반의 새로운 Excel 2007 .xlsx OOXML 파일 형식은 지원하지 않습니다.

대신 JDBC-ODBC 브릿지의 사용을 검토해 주십시오.

Excel 2007 최신 버전인지 모르겠지만 이전 버전에서는 Jexcel을 사용합니다.API

docx4j는 xlsx도 커버하게 되었습니다.

"xlsx 및 binary xls에 초점을 맞춘 POI가 아니라 docx4j를 사용하여 이 작업을 수행하는 이유가 무엇입니까?"라고 질문하는 것으로 알고 있습니다.

JAXB(XML Bean이 아닌)를 좋아하거나 docx 또는 pptx에 docx4j를 이미 사용하고 있기 때문에 xlsx에서도 작업을 수행할 수 있어야 합니다.

OpenXML 스키마에서 XML Bean이 생성하는 jar가 사용자의 목적에 비해 너무 크다는 것도 생각할 수 있습니다.(이 문제를 해결하려면 POI는 'lite' 서브셋을 제공합니다: 'big' oxml-schemas-1.0.jar는 14.5MB입니다! 그러나 임의의 스프레드시트를 지원해야 한다면 완전한 jar가 필요할 것입니다.)반면 docx4j/pptx4j/xlsx4j의 전체 무게는 POI의 라이트 서브셋과 거의 동일합니다.

스프레드시트(docx 또는 pptx가 아닌)만을 처리하고 있으며, 앞의 단락이 관심사가 아닌 경우 POI를 사용하는 것이 좋습니다.

Aspose.Cells for Java는 XLSX 형식을 지원합니다.자세한 내용은 Aspose에서 확인할 수 있습니다.Java 문서용 셀.이게 도움이 되는지 봐주세요.

공개:저는 아스포스에서 개발자 전도사로 일하고 있습니다.

Apache Tika를 사용할 수 있습니다.

String parse(File xlsxFile) {
    return new Tika().parseToString(xlsxFile);
}

Tika는 Apache POI를 사용하여 XLSX 파일을 해석합니다.

다음은 Tiki의 사용 예입니다.

또는 스프레드시트의 각 셀을 개별적으로 처리하려는 경우 POI를 사용하여 이를 수행하는 한 가지 방법이 있습니다.

void parse(File xlsx) {
    try (XSSFWorkbook workbook = new XSSFWorkbook(xlsx)) {
        // Handle each cell in each sheet
        workbook.forEach(sheet -> sheet.forEach(row -> row.forEach(this::handle)));
    }
    catch (InvalidFormatException | IOException e) {
        System.out.println("Can't parse file " + xlsx);
    }
}

void handle(Cell cell) {
    final String cellContent;
    switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            cellContent = cell.getStringCellValue();
            break;
        case Cell.CELL_TYPE_NUMERIC:
            cellContent = String.valueOf(cell.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_BOOLEAN:
            cellContent = String.valueOf(cell.getBooleanCellValue());
            break;
        default:
            cellContent = "Don't know how to handle cell " + cell;
    }
    System.out.println(cellContent);
}

xlsx를 해야 org.apache.poi.ss" ". 이파일 할 수 .이 패키지에는 xlxs 파일 해석에 사용할 수 있는 클래스 XSSF가 있습니다.합니다.

OPCPackage pkg = OPCPackage.open(new ByteArrayInputStream(data));
            Workbook wb = new XSSFWorkbook(pkg);
            Sheet sheet = wb.getSheetAt(0);
            Iterator<Row> rows = sheet.rowIterator();

        while (rows.hasNext()) {
            int j = 5;
            Person person= new Person ();
            Row row = rows.next();
            if (row.getRowNum() > 0) {
                person.setPersonId((int)(row.getCell(0).getNumericCellValue()));
                person.setFirstName(row.getCell(1).getStringCellValue());
                person.setLastName(row.getCell(2).getStringCellValue());
                person.setGroupId((int)(row.getCell(3).getNumericCellValue()));
                person.setUserName(row.getCell(4).getStringCellValue());
                person.setCreditId((int)(row.getCell(5).getNumericCellValue()));
            }

        }

Excel 1998-2003 file (.xls) - you may use HSSF library.
  just use :  Workbook wb = new HSSFWorkbook(pkg);

언급URL : https://stackoverflow.com/questions/267025/read-xlsx-file-in-java

반응형