业务描述:
后缀为.xlsx的Excel文件,只有一个sheet页,且该sheet页对应数据库中的1张表,从A1开始有数据,第1行的数据对应表的各个字段,从第2行开始是要导入的数据,将该Excel导入到数据库中
解决方案:
因为Excel包含大量数据,如果采用POI的用户模式,会消耗大量内容,容易造成内存溢出
java.lang.OutOfMemoryError
所以这里采用SAX模式(事件模式)读取,需要注意的是SAX模式读取,大部分格式的数据都可以读取成String类型,日期格式不在此列,需要特殊处理,处理方式详见下方code
code:
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.regex.Pattern;
import org.apache.log4j.Logger;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.DataFormatter;
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.ContentHandler;
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;
/**
* <p>ClassName: ExampleEventUserModel</p>
* <p>Description: 事件模式</p>
* <p>Author: sloth</p>
* <p>Date: 2018-02-28</p>
*/
public class ExampleEventUserModel {
/**
* <p>Field stylesTable: 单元格样式</p>
*/
public static StylesTable stylesTable;
/**
* <p>Description: 处理单个sheet(本案例调用此方法)</p>
* @param filename 文件名带路径
* @throws Exception 异常
*/
public void processOneSheet(String filename) throws Exception {
OPCPackage pkg = OPCPackage.open(filename);
XSSFReader r = new XSSFReader(pkg);
SharedStringsTable sst = r.getSharedStringsTable();
stylesTable = r.getStylesTable();
XMLReader parser = fetchSheetParser(sst);
// To look up the Sheet Name / Sheet Order / rID,
// you need to process the core Workbook stream.
// Normally it's of the form rId# or rSheet#
InputStream sheet = r.getSheet("rId1");
InputSource sheetSource = new InputSource(sheet);
parser.parse(sheetSource);
sheet.close();
}