首页 > 代码库 > JAVA中用POI组件访问EXCEL文档

JAVA中用POI组件访问EXCEL文档

        对于用JAVA访问EXCEL文件,常用的组件有jxl和POI, jxl因为目前已无版本更新,并且仅能访问EXCEL2007以前的文件格式,对xlsx文件格式目前不支持, 故而推荐使用POI, 
       POI的官方下载地址为: http://poi.apache.org/
      本质上来说, EXCEL2007文档是一个XML文档, 所以POI对EXCEL文件读操作有两种方式,一种是DOM, 一种是SAX, DOM对EXCEL操作简单,易上手, 但是占用较多的内存,尤其是表格超过10000行, 经常会出现内存溢出问题,虽然可以改变JVM启动参数, 加大内存,但不能从根本上解决问题,所以当需要读取较大的EXCEL文件时, 我们采用第二种方式更为合理.
       对于EXCEL文档写操作也面临同样问题, 如果写入的行数过多, 也会遇到内存溢出, 但是写操作解决大文件的办法比较简单, 设置写缓存就可以了, 不过因为EXCEL的SHEET有最大行数的限制(65534), 所以如果行数超过这个限制, 需要创建新的SHEET, 以下是对EXCEL大文件读写操作的示例.

import java.io.InputStream;
import java.util.Date;
import java.util.Iterator;
import java.util.Map;
import java.util.regex.Pattern;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.BuiltinFormats;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.xssf.eventusermodel.XSSFReader;
import org.apache.poi.xssf.model.SharedStringsTable;
import org.apache.poi.xssf.model.StylesTable;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFRichTextString;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

public class TestExcelReader {
    public static void main(String[] args) throws Exception {
    String path = "c://cache//test.xlsx";
    ExcelHandler handler = new ExcelHandler();
        handler.process(path);
    }
    public static class ExcelHandler extends DefaultHandler {
        public ExcelHandler() {}
        private StylesTable stylesTable;
        private CellDataType dataType;
        private SharedStringsTable sst;
        private Map<String, String> datas;
        private short dataFormat;
        private String dataFormatString;
        private boolean tagString;
        private boolean tElement = false;
        private String content;
        private Coordinate coordinate;
        @Override
        public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
            super.startElement(uri, localName, qName, attributes);
            if ("c".equals(qName)) {
                this.setDataType(attributes);
                coordinate = getCoordinate(attributes.getValue("r"));
            }
            else if ("t".equals(qName)) {
                tElement = true;
            } 
            else {
                tElement = false;
            }
            content = "";
        }
        @Override
        public void endElement(String uri, String localName, String qName) throws SAXException {
            super.endElement(uri, localName, qName);
            if (tagString) {
                int idx = Integer.parseInt(content);
                content = new XSSFRichTextString(sst.getEntryAt(idx)).toString();
            }
            if (tElement) {
                String value = http://www.mamicode.com/content.trim();>

JAVA中用POI组件访问EXCEL文档