首页 > 社交 > 科普中国

POI导入导出百万级数据Excel

常驻编辑 科普中国 2022-05-17 表头   空行   级数   扩展名   字符串   标识   索引   类型   文件   内容   数据
readExcelFile(MultipartFile file, int headerIncex, int dataIndex) throws Exception { //文件判空 if (file == null) { return new HashMap<>(); } //获取后缀名判断是否为excel String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf(".") + 1); if (isNotExcelPath(suffix)) { return new HashMap<>(); } //解析数据返回map Map map = new HashMap<>(); //表头内容 List header = new ArrayList<>(); //数据内容 List> data = new ArrayList<>(); InputStream inputStream = null; try { inputStream = file.getInputStream(); if (suffix.endsWith(XLS_LOWER_CASE) || suffix.endsWith(XLS_UPPER_CASE)) { //处理excel2003文件 ExcelXlsReader excelXls = new ExcelXlsReader() { @Override public void sendHeaderRows(String filePath, String sheetName, int sheetIndex, int curRow, List cellList) { ServiceCheckUtility.errorCheck(sheetIndex > 1, "请删除或清除多余的sheet页,只保留一个正确的sheet页"); header.addAll(cellList); } @Override public void sendDataRows(String filePath, String sheetName, int sheetIndex, int curRow, List cellList) { List tempList = new ArrayList<>(); tempList.addAll(cellList); data.add(tempList); } }; excelXls.process(inputStream, headerIncex, dataIndex); } else if (suffix.endsWith(XLSX_LOWER_CASE) || suffix.endsWith(XLSX_UPPER_CASE)) { //处理excel2007文件 ExcelXlsxReader excelXlsx = new ExcelXlsxReader() { @Override public void sendHeaderRows(String filePath, String sheetName, int sheetIndex, int curRow, List cellList) { ServiceCheckUtility.errorCheck(sheetIndex > 1, "请删除或清除多余的sheet页,只保留一个正确的sheet页"); header.addAll(cellList); } @Override public void sendDataRows(String filePath, String sheetName, int sheetIndex, int curRow, List cellList) { List tempList = new ArrayList<>(); tempList.addAll(cellList); data.add(tempList); } }; excelXlsx.process(inputStream, headerIncex, dataIndex); } else { throw new ServiceException("文件格式错误,上传的excel的扩展名只能是xls或xlsx。"); } } finally { if (inputStream != null) { inputStream.close(); } } map.put("data", data); map.put("head", header); return map; } /** * excel路劲检查 * * @param path * @return */ private static boolean isNotExcelPath(String path) { if (StringUtility.isEmpty(path)) { return true; } return !path.endsWith(XLS_LOWER_CASE) && !path.endsWith(XLSX_LOWER_CASE) && !path.endsWith(XLS_UPPER_CASE) && !path.endsWith(XLSX_UPPER_CASE); } }

2、2003版本解析Evj拜客生活常识网

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.eventusermodel.EventWorkbookBuilder;
import org.apache.poi.hssf.eventusermodel.FormatTrackingHSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.hssf.eventusermodel.MissingRecordAwareHSSFListener;
import org.apache.poi.hssf.eventusermodel.dummyrecord.LastCellOfRowDummyRecord;
import org.apache.poi.hssf.eventusermodel.dummyrecord.MissingCellDummyRecord;
import org.apache.poi.hssf.model.HSSFFormulaParser;
import org.apache.poi.hssf.record.BOFRecord;
import org.apache.poi.hssf.record.BlankRecord;
import org.apache.poi.hssf.record.BoolErrRecord;
import org.apache.poi.hssf.record.BoundSheetRecord;
import org.apache.poi.hssf.record.FormulaRecord;
import org.apache.poi.hssf.record.LabelRecord;
import org.apache.poi.hssf.record.LabelSSTRecord;
import org.apache.poi.hssf.record.NumberRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SSTRecord;
import org.apache.poi.hssf.record.StringRecord;
import org.apache.poi.hssf.usermodel.HSSFDataFormatter;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

/**
 * 用于解决.xls2003版本大数据量问题
 */
public class ExcelXlsReader implements HSSFListener {
    
    private int minColums = -1;
    
    private POIFSFileSystem fs;
    
    /**
     * 总行数
     */
    private int totalRows = 0;
    
    /**
     * 上一行row的序号
     */
    private int lastRowNumber;
    
    /**
     * 上一单元格的序号
     */
    private int lastColumnNumber;
    
    /**
     * 是否输出formula,还是它对应的值
     */
    private boolean outputFormulaValues = true;
    
    /**
     * 用于转换formulas
     */
    private EventWorkbookBuilder.SheetRecordCollectingListener workbookBuildingListener;
    
    //excel2003工作簿
    private HSSFWorkbook stubWorkbook;
    
    private SSTRecord sstRecord;
    
    private FormatTrackingHSSFListener formatListener;
    
    private final HSSFDataFormatter formatter = new HSSFDataFormatter();
    
    /**
     * 文件的绝对路径
     */
    private String filePath = "";
    
    //表索引
    private int sheetIndex = 0;
    
    private BoundSheetRecord[] orderedBSRs;
    
    @SuppressWarnings({"rawtypes"})
    private ArrayList boundSheetRecords = new ArrayList();
    
    private int nextRow;
    
    private int nextColumn;
    
    private boolean outputNextStringRecord;
    
    //当前行
    private int curRow = 0;
    
    //存储一行记录所有单元格的容器
    private List    

相关阅读:

  • 如何打印表头(打印表格表头怎么每页都有)
  • 有了这个开源工具后,我五点就下班了
  • 行动
  • 加拿大枫叶卡续签、补发、补发—IMM5444表填写指南
  • Linux
  • 如何输入字符串(python如何输入字符串)
  • 如何设置条件格式(如何输入数字字符串)
  • 「数据结构之字典树Trie」C语言版本实现
  • #汇编语言#课程设计1#王爽著
  • JavaScript中的数据类型判断
    • 网站地图 |
    • 声明:登载此文出于传递更多信息之目的,并不意味着赞同其观点或证实其描述。文章内容仅供参考,不做权威认证,如若验证其真实性,请咨询相关权威专业人士。