POI读写海量Excel(详细解读)(2)

2019-04-22 19:41

} /**

}

lastRowNumber = thisRow; if (thisColumn > -1) lastColumnNumber = thisColumn;

// 行结束时的操作

if (record instanceof LastCellOfRowDummyRecord) { if (minColumns > 0) { // 列值重新置空 if (lastColumnNumber == -1) { lastColumnNumber = 0; } } lastColumnNumber = -1; }

// 每行结束时, 调用getRows() 方法 rowReader.getRows(sheetIndex,curRow, rowlist);

// 清空容器 rowlist.clear();

* 抽象Excel2007读取器,excel2007的底层数据结构是xml文件,采用SAX的事件驱动的方法解析

* xml,需要继承DefaultHandler,在遇到文件内容时,事件会触发,这种做法可以大大降低

* 内存的耗费,特别使用于大数据量的文件。 * */

public class Excel2007Reader extends DefaultHandler { //共享字符串表 private SharedStringsTable sst;

//上一次的内容

private String lastContents; private boolean nextIsString;

private int sheetIndex = -1;

private List rowlist = new ArrayList(); //当前行

private int curRow = 0; //当前列

private int curCol = 0;

//日期标志

private boolean dateFlag; //数字标志

private boolean numberFlag;

private boolean isTElement;

private IRowReader rowReader;

public void setRowReader(IRowReader rowReader){ this.rowReader = rowReader; }

/**只遍历一个电子表格,其中sheetId为要遍历的sheet索引,从1开始,1-3 * @param filename * @param sheetId * @throws Exception */

public void processOneSheet(String filename,int sheetId) throws Exception { OPCPackage pkg = OPCPackage.open(filename); XSSFReader r = new XSSFReader(pkg); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); }

// 根据 rId# 或 rSheet# 查找sheet

InputStream sheet2 = r.getSheet(\sheetIndex++;

InputSource sheetSource = new InputSource(sheet2); parser.parse(sheetSource); sheet2.close();

/**

* 遍历工作簿中所有的电子表格 * @param filename * @throws Exception */

public void process(String filename) throws Exception { OPCPackage pkg = OPCPackage.open(filename); XSSFReader r = new XSSFReader(pkg); SharedStringsTable sst = r.getSharedStringsTable(); XMLReader parser = fetchSheetParser(sst); Iterator sheets = r.getSheetsData();

}

while (sheets.hasNext()) { curRow = 0; sheetIndex++; InputStream sheet = sheets.next(); InputSource sheetSource = new InputSource(sheet); parser.parse(sheetSource); sheet.close(); }

public XMLReader fetchSheetParser(SharedStringsTable sst) throws SAXException { XMLReader parser = XMLReaderFactory .createXMLReader(\ this.sst = sst; parser.setContentHandler(this); return parser; }

public void startElement(String uri, String localName, String name, Attributes attributes) throws SAXException {

// c => 单元格

if (\

// 如果下一个元素是 SST 的索引,则将nextIsString标记为true String cellType = attributes.getValue(\if (\ nextIsString = true; } else { nextIsString = false; }

//日期格式

String cellDateType = attributes.getValue(\if (\ dateFlag = true; } else { dateFlag = false; }

String cellNumberType = attributes.getValue(\if(\ numberFlag = true; } else { numberFlag = false; }

}

}

//当元素为t时 if(\ isTElement = true; } else { isTElement = false; }

// 置空

lastContents = \

public void endElement(String uri, String localName, String name) throws SAXException {

// 根据SST的索引值的到单元格的真正要存储的字符串 // 这时characters()方法可能会被调用多次 if (nextIsString) { try { int idx = Integer.parseInt(lastContents); lastContents = new XSSFRichTextString(sst.getEntryAt(idx)) .toString(); } catch (Exception e) { } }

//t元素也包含字符串 if(isTElement){ String value = lastContents.trim(); rowlist.add(curCol, value); curCol++; isTElement = false; // v => 单元格的值,如果单元格是字符串则v标签的值为该字符串在SST中的索引 // 将单元格内容加入rowlist中,在这之前先去掉字符串前后的空白符 } else if (\ String value = lastContents.trim(); value = value.equals(\ //日期格式处理 if(dateFlag){ Date date = HSSFDateUtil.getJavaDate(Double.valueOf(value)); SimpleDateFormat dateFormat = new SimpleDateFormat( \

value = dateFormat.format(date); } //数字类型处理 if(numberFlag){ BigDecimal bd = new BigDecimal(value); value = bd.setScale(3,BigDecimal.ROUND_UP).toString(); } rowlist.add(curCol, value); curCol++; }else {

//如果标签名称为 row ,这说明已到行尾,调用 optRows() 方法 if (name.equals(\ rowReader.getRows(sheetIndex,curRow,rowlist); rowlist.clear(); curRow++; curCol = 0; } } } public void characters(char[] ch, int start, int length) throws SAXException { //得到单元格内容的值 lastContents += new String(ch, start, length); } }

public class ExcelReaderUtil {

//excel2003扩展名

public static final String EXCEL03_EXTENSION = \

//excel2007扩展名

public static final String EXCEL07_EXTENSION = \ /**

* 读取Excel文件,可能是03也可能是07版本 * @param excel03 * @param excel07 * @param fileName * @throws Exception */

public static void readExcel(IRowReader reader,String fileName) throws Exception{ // 处理excel2003文件


POI读写海量Excel(详细解读)(2).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:自考《国际法》学习笔记

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: