springmvc 百万级别数据导入 sax方式

4 篇文章 0 订阅

 1.实现excel解析类 

import com.xakysoft.base.businessLog.FadException;
import com.xakysoft.creditRating.sheetHandler.ExcelParse;
import com.xakysoft.creditRating.sheetHandler.ISheetHandler;
import com.xakysoft.sys.entity.SysUser;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.ss.usermodel.DataFormatter;
import org.apache.poi.ss.usermodel.DateUtil;
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.springframework.web.multipart.MultipartFile;
import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.XMLReaderFactory;

import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class ExcelUtils {

    public static String excelParse(ISheetHandler sheetHandler, MultipartFile file, HttpSession session) throws Exception {
        SysUser user = (SysUser) session.getAttribute("user");
        sheetHandler.setUser(user);
        ExcelParse excelParse = null;
        try {
            excelParse = new ExcelParse();
            try {
                parse(sheetHandler, file.getInputStream());
            } catch (FadException e) {
                e.printStackTrace();
                return e.getMessage();
            }
        } catch (IOException e) {
            e.printStackTrace();
            return "导入失败!!!";
        }
        return "导入成功!!!";
    }
    // 参数说明 自定义excel实现类 和 excel文件流
    public static void parse (ISheetHandler hl, InputStream in) throws Exception {
        //解析器
        //SheetHandler hl = new SheetHandler("0");
        //1.根据 Excel 获取 OPCPackage 对象
        //OPCPackage pkg = OPCPackage.open(path, PackageAccess.READ);
        //InputStream inputStream = new ByteArrayInputStream(spreadsheetData);
        DataFormatter formatter = new CustomDataFormatter();
        OPCPackage pkg = OPCPackage.open(in);
        try {
            //2.创建 XSSFReader 对象
            XSSFReader reader = new XSSFReader(pkg);
            //3.获取 SharedStringsTable 对象
            ReadOnlySharedStringsTable sst = new ReadOnlySharedStringsTable(pkg,false);
            //4.获取 StylesTable 对象
            StylesTable styles = reader.getStylesTable();
            XMLReader parser = XMLReaderFactory.createXMLReader();
            // 处理公共属性
            parser.setContentHandler(new XSSFSheetXMLHandler(styles,sst, hl,formatter,
                    false));
            XSSFReader.SheetIterator sheets = (XSSFReader.SheetIterator)
                    reader.getSheetsData();

            //逐行读取逐行解析
            while (sheets.hasNext()) {
                InputStream sheetstream = sheets.next();
                InputSource sheetSource = new InputSource(sheetstream);
                try {
                    parser.parse(sheetSource);
                } finally {
                    sheetstream.close();
                }
            }
        } finally {
            pkg.close();
        }
    }
    
    //日期格式化问题
    private static class CustomDataFormatter extends DataFormatter {
        @Override
        public String formatRawCellContents(double value, int formatIndex, String formatString,
                                            boolean use1904Windowing) {
            // Is it a date?
            if (DateUtil.isADateFormat(formatIndex, formatString)) {
                if (DateUtil.isValidExcelDate(value)) {
                    Date d = DateUtil.getJavaDate(value, use1904Windowing);
                    try {
                        return new SimpleDateFormat("yyyy-MM-dd").format(d);
                    } catch (Exception e) {
                        //logger.log(Level.SEVERE, "Bad date value in Excel: " + d, e);
                        throw new FadException(BizExceptionEnum.DATE_FORMAT_ERROR);
                    }
                }
            }
            return new DecimalFormat("##0.#####").format(value);
        }
    }
}

 2.定义excel内容处理接口

package com.xakysoft.creditRating.sheetHandler;

import com.xakysoft.sys.entity.SysUser;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;

public interface ISheetHandler  extends  XSSFSheetXMLHandler.SheetContentsHandler{

     String covertDateFormat(String cellValue);
     void setUser(SysUser user);
     void isEmpty(String cellValue,String msg);
}

 3.为不同的导入excel模板实现不同的实现类

package com.xakysoft.creditRating.sheetHandler.impl;

import com.xakysoft.base.businessLog.BizExceptionEnum;
import com.xakysoft.base.businessLog.FadException;
import com.xakysoft.base.util.StringUtils;
import com.xakysoft.creditRating.entity.CompanyBackPay;
import com.xakysoft.creditRating.service.ILaborService;
import com.xakysoft.creditRating.sheetHandler.ISheetHandler;
import com.xakysoft.recordManager.service.IComInfoSubService;
import com.xakysoft.sys.entity.SysUser;
import org.apache.poi.xssf.usermodel.XSSFComment;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.HashMap;
import java.util.Map;

@Component
public class CompanyBackPaySheetHandler implements ISheetHandler {

    @Autowired
    private ILaborService laborService;
    @Autowired
    private IComInfoSubService comInfoSubService;
    private CompanyBackPay companyBackPay = null;
    private SysUser user = null;
    private Integer index = 0;

    private static CompanyBackPaySheetHandler serverHandler;

    @PostConstruct //通过@PostConstruct实现初始化bean之前进行的操作
    public void init() {
        serverHandler = this;
        serverHandler.laborService = this.laborService;
        serverHandler.comInfoSubService = this.comInfoSubService;
        // 初使化时将已静态化的testService实例化
    }

    @Override
    public String covertDateFormat(String cellValue) {
        return null;
    }

    @Override
    public void setUser(SysUser user) {
        this.user = user;
    }

    @Override
    public void isEmpty(String cellValue, String msg) {
        if(StringUtils.isEmpty(cellValue)) {
            throw new FadException(400,msg);
        }
    }
    //行开始处理
    @Override
    public void startRow(int rowNum) {
        if(rowNum == 0) {
            companyBackPay = null;
        } else {
            companyBackPay = new CompanyBackPay();
        }
    }
    //行结束处理
    @Override
    public void endRow(int rowNum) {
        if(rowNum == 0) {
            if(index!=5) {
                throw new FadException(BizExceptionEnum.TEMPLATE_ERROR);
            }
        } else {
            if (user != null) {
                Map resultMap = serverHandler.comInfoSubService.selectCompanySubBySoc(new HashMap<String, Object>(){{put("socialCreditCode",companyBackPay.getSocialCreditCode());}});
                if(resultMap!= null && StringUtils.isNotEmptyObject(resultMap.get("id"))) {
                    companyBackPay.setCompanyId(Long.valueOf(resultMap.get("id").toString()));
                }
                serverHandler.laborService.saveCompanyBackPay(companyBackPay, user);
            }
        }
    }
    //处理一行单元格
    @Override
    public void cell(String cellName, String cellValue, XSSFComment comment) {
        if(companyBackPay == null) {
            index++;
        }
        if (companyBackPay != null) {
            String letter = cellName.substring(0, 1); //每个单元格的首字母
            switch (letter) {
                case "A": {
                    companyBackPay.setSocialCreditCode(StringUtils.isNotEmptyObject(cellValue) ? cellValue.trim() : "");
                    break;
                }
                case "B": {
                    companyBackPay.setCompanyName(cellValue);
                    break;
                }
                case "C": {
                    companyBackPay.setPunishmentReason(cellValue);
                    break;
                }
                case "D": {
                    companyBackPay.setPunishmentTime(cellValue);
                    break;
                }
                case "E": {
                    companyBackPay.setPunishmentDepartment(cellValue);
                    break;
                }
            }
        }
    }

    @Override
    public void headerFooter(String text, boolean isHeader, String tagName) {

    }
}

4.service调用

 public String saveCompanyBackPayExcelIn(MultipartFile myfile, HttpServletRequest request, HttpServletResponse response, HttpSession session) throws Exception {
        CompanyBackPaySheetHandler sheetHandler = new CompanyBackPaySheetHandler();
        return ExcelUtils.excelParse(sheetHandler,myfile,session);
    }

5.controller调用

   @RequestMapping(value="/saveCompanyBackPayExcelIn",produces = "text/html; charset=utf-8")
    @ResponseBody
    public String saveCompanyBackPayExcelIn(HttpServletRequest request, HttpServletResponse response, @RequestParam MultipartFile myfile) throws Exception {
        return laborService.saveCompanyBackPayExcelIn(myfile, request, response,request.getSession());
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值