文档章节

POI导入EXCEL

Romanceling
 Romanceling
发布于 2017/04/15 11:51
字数 717
阅读 14
收藏 0

package com.gsww.chis.commons.result;

import java.io.IOException;
import java.io.InputStream;
import java.text.NumberFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;
import java.util.Queue;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import com.gsww.chis.pojo.ywyk.YwykSfxm;

public class ImportExcelUtils {
    //每次导入到数据库的实体条数
    private static final int ONCE_IMPORT_SIZE = 2000;
    //开始读取的sheet的row下标
    private static final int BEGIN_ROW_INDEX = 1;

    /**
     * 导入excel到数据库的方法
     * 每次现读取一定条数的实体放入queue中
     * @param excelInputStream
     * @param queue
     */
    public static void importExcelToDB(InputStream excelInputStream,Queue<List<YwykSfxm>> queue){
        //创建Excel工作薄
        Workbook workbook = getWorkbook(excelInputStream);
        for(int i=0;i<workbook.getNumberOfSheets();i++){
            Sheet sheet = workbook.getSheetAt(i);
            if(sheet == null)continue;
            int nums = sheet.getLastRowNum();
            //当sheet的row数量小于ONCE_IMPORT_SIZE时,一次性将数据全部放入queue
            if(nums<=ONCE_IMPORT_SIZE){
                queue.offer(dealWithSheet(sheet,BEGIN_ROW_INDEX,sheet.getLastRowNum()));
            }else{//当sheet的row数量大于ONCE_IMPORT_SIZE时,每次将ONCE_IMPORT_SIZE条数据放入queue
                for(int j=0;j<=nums/ONCE_IMPORT_SIZE;j++){
                    boolean b = j<nums/ONCE_IMPORT_SIZE;
                    int begin = 0;
                    int end = 0;
                    if(b && j==0){//最开始的两千条数据
                        begin = BEGIN_ROW_INDEX;
                        end = ONCE_IMPORT_SIZE;
                    }else if(b){//中间部分
                        begin = ONCE_IMPORT_SIZE*j+1;
                        end = ONCE_IMPORT_SIZE*(j+1);
                    }else{//最后的两千条数据
                        begin = ONCE_IMPORT_SIZE*j+1;
                        end = sheet.getLastRowNum();
                    }
                    queue.offer(dealWithSheet(sheet,begin,end));
                }
            }
        }
    }
    
    /**
     * 处理sheet
     * @param sheet
     * @param rowBeginIndex 读取开始的sheet下标
     * @param rowEndIndex 读取结束的sheet下标
     * @return
     */
    public static List<YwykSfxm> dealWithSheet(Sheet sheet,int rowBeginIndex,int rowEndIndex){
        List<YwykSfxm> medicalList = new ArrayList<YwykSfxm>();
        for(int i=rowBeginIndex;i<=rowEndIndex;i++){
            Row row = sheet.getRow(i);
            if(row == null )continue;
            medicalList.add(dealWithRow(row));
        }
        return medicalList;
    }
    
    /**
     * 导入excel处理Row,此方法待优化
     * @param row
     */
    public static YwykSfxm dealWithRow(Row row){
        YwykSfxm ywykSfxm = new YwykSfxm();
        Object[] array = new Object[row.getLastCellNum()];
        for(int i=row.getFirstCellNum();i<row.getLastCellNum();i++){
            Cell cell = row.getCell(i);
            Object obj = getCellValue(cell);
            array[i] = obj;
        }
        
        ywykSfxm.setXmdm(array[0].toString());
        ywykSfxm.setXmmc(array[1].toString());
        ywykSfxm.setGg(array[2].toString());
        ywykSfxm.setDw(array[3].toString());
        ywykSfxm.setXmfl(array[5].toString());
        String str=array[4].toString();
        if(str.contains(",")){
            str = str.replace(",", "");
        }
        ywykSfxm.setDj(Double.parseDouble(str));
        String str1=array[6].toString();
        if(str1.contains(",")){
            str1 = str1.replace(",", "");
        }
        ywykSfxm.setLb(Long.parseLong(str1));
        return ywykSfxm;
    }
    
    /**
     * 导入excel获取cell的值,此方法待优化
     * 
     * @param cell
     * @return
     */
    public static Object getCellValue(Cell cell){
        //DecimalFormat dfNum = new DecimalFormat("#");  //格式化数字
        NumberFormat nf = NumberFormat.getInstance();  //格式化数字
        SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");  //日期格式化
        Object obj = null;
        switch (cell.getCellType()) {
        case Cell.CELL_TYPE_STRING:
            obj = cell.getStringCellValue();
            break;
        case Cell.CELL_TYPE_BLANK:
            obj = "";
            break;
        case Cell.CELL_TYPE_NUMERIC:
            if("General".equals(cell.getCellStyle().getDataFormatString())){
                obj = nf.format(cell.getNumericCellValue());
            }else if("HH:mm:ss".equals(cell.getCellStyle().getDataFormatString())){
                obj = sdf.format(cell.getDateCellValue());
            }else{
                obj = cell.getNumericCellValue();
            }
            break;

        default:
            obj = "未知类型数据!";
            break;
        }
        return obj;
    }
    
    
    /**
     * 导入excel获取工作薄
     * @param excelInputStream
     * @return
     */
    private static Workbook getWorkbook(InputStream excelInputStream) {
        Workbook workbook = null;
        try{
            //2003版本的excel,用.xls结尾
            workbook = new HSSFWorkbook(excelInputStream);//得到工作簿
        }catch (Exception ex){
            try{
                //2007版本的excel,用.xlsx结尾
                workbook = new XSSFWorkbook(excelInputStream);//得到工作簿
            }catch (IOException e){
                e.printStackTrace();
            }
        }
        return workbook;
    }

    
}

-------------------------------------

/**
     * 
     * 方法描述 : 调用存储过程PKG_DATA_BASE.USP_JC_BASE_SFXM_IMP
     * @param yydm
     * @param req
     * @param res
     * @return
     * @throws Exception 
     */
    @ResponseBody
    @RequestMapping(value="/callSfxmImp",method=RequestMethod.POST)
    public Boolean callSfxmImp( String yydm,@RequestParam(value = "medicalExcel", required = true)MultipartFile medicalExcel, int sfqk,HttpServletRequest req,HttpServletResponse res){
            Boolean flag = true;
            Queue<List<YwykSfxm>> queue = new LinkedList<List<YwykSfxm>>(); 
            InputStream is = null;
            try {

                     is = medicalExcel.getInputStream();

                     ImportExcelUtils.importExcelToDB(is,queue);

                    List<YwykSfxm> medicalList = queue.poll();

                     flag=ywykSfxmService.callSfxmImp(yydm, medicalList, sfqk);
            } catch (SerialException e) {
                      flag=false;
                      e.printStackTrace();
            } catch (SQLException e) {
                      flag=false;
                       e.printStackTrace();
            }
        return flag;
    }

--------------------------------

<form id="sfxm_form"  enctype="multipart/form-data">
        <input type="file" name="medicalExcel" style="display:none" onchange="importExcel()">
</form>

© 著作权归作者所有

上一篇: web打印
下一篇: POI导出EXCEL
Romanceling
粉丝 14
博文 166
码字总数 91809
作品 0
无锡
程序员
私信 提问
kvn-wang/poi-el

poi-el excel导出与导入神器,poi-el。 poi-el支持强大的excel模板导出功能 poi-el支持方便的excel导入API excel模板导出 使用poi + spEl,支持各种普通模板和复杂模板的导出功能 Quick Star...

kvn-wang
2017/11/01
0
0
POI事件模式指北(三)- 读取Excel实战

POI事件模式指北(三)- 读取Excel实战 1、简介 这篇文章将介绍一个完整的利用POI事件模式读取Excel的实例,目的是贴近实际使用中的情况,并且考虑了细节的问题而不仅仅满足于实现简单功能。...

不科学计算
02/24
0
0
POI - 读取Excel2003、Excel2007或更高级的兼容性问题

我们使用POI中的HSSFWorkbook来读取Excel数据。 上边代码,读取Excel2003(xls)的文件没问题,但是一旦读取的是Excel2007(xlsx)的文件,就会报异常:“The supplied data appears to be i...

技术小美
2017/11/14
0
0
Excel 导入导出工具--icexls

icexls是一个excel导入导出工具,依赖于poi或jxl,主要解决简单Excel的导入导出问题。它具有以下特点: 同时支持 poi和jxl两种api. 支持自定义sheet. 由导入方法(getData)和导出方法(setDat...

iceexcel
2017/03/06
837
0
excel,csv文件导入导出解决方案 - FrameworkPoi

poi框架 framework-poi > 简单、好用且轻量级的海量excel,csv文件导入导出解决方案。解决火狐浏览器中文编码问题。 > 注:excel的合并功能及复杂功能,使用代码实现比较复杂,框架只提供单行...

匿名
01/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

rsync工具常用选项以及同步的两种方式

rsync -av /etc/passwd /tmp/1.txt #rsync的本机传输写法 rsync -av /tmp/1.txt 192.168.188.128:/tmp/2.txt #rsync的远程传输rsync格式rsync [OPTION] … SRC ......

林怡丰
今天
3
0
GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238

GatewayWorker 报错:stream_socket_server(): unable to connect to tcp://0.0.0.0:1238 (Address already in use) 官方文档虽然有相同的问题,但是对我的问题没起作用…… 后面发现自己手贱...

wenzhizhong
昨天
3
0
REST接口

文章来源 https://zhuanlan.zhihu.com/p/28674721?group_id=886181549958119424 http://www.ruanyifeng.com/blog/2014/05/restful_api.html REST 对请求的约定 REST 用来规范应用如何在 HTTP......

Airship
昨天
5
0
Spring Cloud Config 统一配置中心

Spring Cloud Config 统一配置中心 一、统一配置中心 统一管理配置 通常,我们会使用配置文件来管理应用的配置。如一个 Spring Boot 的应用,可以将配置信息放在 application.yml 文件中,如...

非摩尔根
昨天
6
0
android ------ AAPT2 error: check logs for details解决方法

AAPT 是全称是 Android Asset Packaging Tool,它是构建 App,甚至是构建 Android 系统都必不可少的一个工具。它的作用是将所有资源文件压缩打包到Android APK 当中。我们在 Android SDK 目录...

切切歆语
昨天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部