使用poi将Excel文件转换为data数据

pom

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>

    <groupId>com.nihaorz</groupId>
    <artifactId>XLSXDemo</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <dependencies>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.16</version>
        </dependency>
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
    </dependencies>

</project>

XLSX2Data.java

package com.nihaorz;

import org.apache.log4j.Logger;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.openxml4j.exceptions.OpenXML4JException;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.openxml4j.opc.PackageAccess;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.util.CellAddress;
import org.apache.poi.ss.util.CellReference;
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.apache.poi.xssf.usermodel.XSSFComment;
import org.xml.sax.ContentHandler;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import javax.xml.parsers.ParserConfigurationException;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by Nihaorz on 2017/8/4.
 */
public class XLSX2Data {

    private Logger logger = Logger.getLogger(XLSX2Data.class);

    private File xlsxFile;

    private final String NULL_FILE_MSG = "文件对象为null或者文件不存在,请检查文件对象!";

    private OPCPackage xlsxPackage;

    private List<String> xlsxTitles;

    private List<Map<String, String>> xlsxData;

    public XLSX2Data(File xlsxFile) {
        this.xlsxFile = xlsxFile;
        if(check()) {
            xlsxTitles = new ArrayList();
            xlsxData = new ArrayList();
            try {
                this.xlsxPackage = OPCPackage.open(this.xlsxFile.getPath(), PackageAccess.READ);
                try {
                    process();
                    xlsxData.remove(0);
                } catch (IOException e) {
                    logger.error(e.getMessage(), e);
                } catch (SAXException e) {
                    logger.error(e.getMessage(), e);
                } catch (OpenXML4JException e) {
                    logger.error(e.getMessage(), e);
                }
                try {
                    this.xlsxPackage.close();
                } catch (IOException e) {
                    logger.error(e.getMessage(), e);
                }
            } catch (InvalidFormatException e) {
                logger.error(e.getMessage(), e);
            }
        }else {
            logger.error(NULL_FILE_MSG);
        }
    }

    private void process() throws IOException, SAXException, OpenXML4JException {
        ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(this.xlsxPackage);
        XSSFReader xssfReader = new XSSFReader(this.xlsxPackage);
        StylesTable styles = xssfReader.getStylesTable();
        XSSFReader.SheetIterator iter = (XSSFReader.SheetIterator) xssfReader.getSheetsData();
        int index = 0;
        while (iter.hasNext()) {
            InputStream stream = iter.next();
            processSheet(styles, strings, new XLSX2Data.SheetToCSV(), stream);
            stream.close();
            ++index;
        }
    }

    public void processSheet(
            StylesTable styles,
            ReadOnlySharedStringsTable strings,
            XSSFSheetXMLHandler.SheetContentsHandler sheetHandler,
            InputStream sheetInputStream) throws IOException, SAXException {
        DataFormatter formatter = new DataFormatter();
        InputSource sheetSource = new InputSource(sheetInputStream);
        try {
            XMLReader sheetParser = SAXHelper.newXMLReader();
            ContentHandler handler = new XSSFSheetXMLHandler(
                    styles, null, strings, sheetHandler, formatter, false);
            sheetParser.setContentHandler(handler);
            sheetParser.parse(sheetSource);
        } catch(ParserConfigurationException e) {
            throw new RuntimeException("SAX parser appears to be broken - " + e.getMessage());
        }
    }

    private class SheetToCSV implements XSSFSheetXMLHandler.SheetContentsHandler {
        private boolean firstCellOfRow = false;
        private int currentRow = -1;
        private int currentCol = -1;

        private void outputMissingRows(int number) {

        }

        @Override
        public void startRow(int rowNum) {
            // If there were gaps, output the missing rows
            outputMissingRows(rowNum-currentRow-1);
            // Prepare for this row
            firstCellOfRow = true;
            currentRow = rowNum;
            currentCol = -1;
            xlsxData.add(currentRow, new HashMap());
        }

        @Override
        public void endRow(int rowNum) {
            // Ensure the minimum number of columns
        }

        @Override
        public void cell(String cellReference, String formattedValue,
                         XSSFComment comment) {
            if (firstCellOfRow) {
                firstCellOfRow = false;
            }
            // gracefully handle missing CellRef here in a similar way as XSSFCell does
            if(cellReference == null) {
                cellReference = new CellAddress(currentRow, currentCol).formatAsString();
            }
            // Did we miss any cells?
            int thisCol = (new CellReference(cellReference)).getCol();
            currentCol = thisCol;
            String regEx = "[a-zA-Z]{1,}[1]";
            Pattern pattern = Pattern.compile(regEx);
            Matcher matcher = pattern.matcher(cellReference);
            boolean rs = matcher.matches();
            if(rs){
                xlsxTitles.add(formattedValue);
            }else{
                xlsxData.get(currentRow).put("col" + currentCol, formattedValue);
            }
        }

        @Override
        public void headerFooter(String text, boolean isHeader, String tagName) {
            // Skip, no headers or footers in CSV
        }
    }

    public String[] getXlsxTitles(){
        if(check()) {
            return xlsxTitles.toArray(new String[xlsxTitles.size()]);
        }else {
            logger.error(NULL_FILE_MSG);
            return null;
        }
    }

    public List<Map<String, String>> getXlsxData(){
        if(check()) {
            return xlsxData;
        }else {
            logger.error(NULL_FILE_MSG);
            return null;
        }
    }

    public File getXlsxFile() {
        return xlsxFile;
    }

    private boolean check(){
        boolean result = false;
        if(xlsxFile != null && xlsxFile.exists()) {
            result = true;
        }
        return result;
    }

}

XLSX2DataTest.java

package com.nihaorz;

import java.io.File;
import java.util.List;

/**
 * Created by Nihaorz on 2017/8/4.
 */
public class XLSX2DataTest {

    public static void main(String[] args) {
        File file = new File("C:\Users\Nihaorz\Desktop\人员表.xlsx");
        XLSX2Data x2d = new XLSX2Data(file);
        String[] titles = x2d.getXlsxTitles();
        List data = x2d.getXlsxData();
        System.out.println("titles:" + titles);
        System.out.println("data:" + data);
    }

}

  

  

  

XLSX2Data
原文地址:https://www.cnblogs.com/nihaorz/p/7284703.html