Excel导入功能

一:前端

<t:dgToolBar title="Excel题库导入" icon="icon-search" onclick="questionImportListImportXls()"></t:dgToolBar>

<script type="text/javascript" charset="utf-8">
    function questionImportListImportXls() {
        openuploadwin(‘Excel题库导入‘, ‘xueBaQuestionController.do?upload‘, "questionImportList");
    }
</script>

二:openuploadwin

/**
 * 创建上传页面窗口
 *
 * @param title
 * @param addurl
 * @param saveurl
 */
function openuploadwin(title, url,name,width, height) {
    gridname=name;
    $.dialog({
        content: ‘url:‘+url,
        cache:false,
        button: [
            {
                name: ‘开始上传‘,
                callback: function(){
                    iframe = this.iframe.contentWindow;
                    iframe.upload();
                    return false;
                },
                focus: true
            },
            {
                name: ‘取消上传‘,
                callback: function(){
                    iframe = this.iframe.contentWindow;
                    iframe.cancel();
                }
            }
        ]
    }).zindex();
}

三:上传页面

<%@ page language="java" import="java.util.*" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@include file="/context/mytags.jsp"%>
<!DOCTYPE html>
<html>
<head>
<title>Excel题库导入</title>
<t:base type="jquery,easyui,tools"></t:base>
</head>
<body style="overflow-y: hidden" scroll="no">
<t:formvalid formid="formobj" layout="div" dialog="true" beforeSubmit="upload">
    <fieldset class="step">
    <div class="form"><t:upload name="fiels" buttonText="选择要导入的文件" uploader="xueBaQuestionController.do?importExcel" extend="*.xls;*.xlsx" id="file_upload" formData="documentTitle"></t:upload></div>
    <div class="form" id="filediv" style="height: 50px"></div>
    </fieldset>
</t:formvalid>
</body>
</html>

四:xueBaQuestionController处理导入题库

@RequestMapping(params = "upload")
    public ModelAndView upload(HttpServletRequest req) {
        return new ModelAndView("weixin/shyd/happycampus/xueba/questionUpload");
    }

    @RequestMapping(params = "importExcel", method = RequestMethod.POST)
    @ResponseBody
    public AjaxJson importExcel(HttpServletRequest request, HttpServletResponse response) {
        AjaxJson j = new AjaxJson();

        MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
        Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
        for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
            MultipartFile file = entity.getValue();// 获取上传文件对象
            ImportParams params = new ImportParams();
            params.setTitleRows(0);
            params.setSecondTitleRows(1);
            params.setNeedSave(false);
            try {
                List<XueBaQuestionEntity> questionList = GetAllImportQuestion(file.getInputStream());
                for (XueBaQuestionEntity question : questionList) {
                    if(question.getContent()!=null){
                        xueBaQuestionService.saveQuestion(question);
                    }
                }
                j.setMsg("文件导入成功!");
            } catch (Exception e) {
                j.setMsg("文件导入失败!");
                logger.error(ExceptionUtil.getExceptionMessage(e));
            }finally{
                try {
                    file.getInputStream().close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return j;
    }

    private List<XueBaQuestionEntity> GetAllImportQuestion(InputStream inputstream) {
        POIFSFileSystem fs;
        HSSFWorkbook wb;
        HSSFSheet sheet;
        HSSFRow row;

        List<XueBaQuestionEntity> questionList = new ArrayList<XueBaQuestionEntity>();
        List<XueBaOptionEntity> optionList;
        XueBaQuestionEntity question = null;

        try{
            fs = new POIFSFileSystem(inputstream);
            wb = new HSSFWorkbook(fs);
            /** 遍历sheet **/
            for (int i = 0; i < wb.getNumberOfSheets(); i++) {
                /** 获得当前sheet **/
                sheet = wb.getSheetAt(i);
                int num = 1;
                for (int j = 1; j < sheet.getPhysicalNumberOfRows() ; j++) {
                    num++;
                    try{
                        question = new XueBaQuestionEntity();
                        optionList = new ArrayList<XueBaOptionEntity>();
                        /** 获得当前行情 **/
                        row = sheet.getRow(j);
                        if(row != null){
                            String qContent = getCellFormatValue(row.getCell(0)).trim();
                            String aOption = getCellFormatValue(row.getCell(1)).trim();
                            //题目或A选项为空就不保存
                            if(StringUtil.isEmpty(qContent) || StringUtil.isEmpty(aOption)){
                                logger.info("题库第" + num + "行题库或A选项为空,未保存");
                                continue;
                            }
                            String bOption = getCellFormatValue(row.getCell(2)).trim();
                            String cOption = getCellFormatValue(row.getCell(3)).trim();
                            String dOption = getCellFormatValue(row.getCell(4)).trim();
                            String eOption = getCellFormatValue(row.getCell(5)).trim();
                            String answer = getCellFormatValue(row.getCell(6)).trim();

                            System.out.println("qcontent:"+qContent);
                            /*  赋值问题实体  */
                            question.setContent(qContent);
                            if(answer.indexOf(",")>0){
                                question.setType(1);
                            }else{
                                question.setType(0);
                            }
                            question.setAnswer(answer);
                            //赋值选项实体
                            if (StringUtil.isNotEmpty(aOption)) {
                                XueBaOptionEntity aOptionEntity = new XueBaOptionEntity();
                                aOptionEntity = DealOption(aOptionEntity,aOption);
                                optionList.add(aOptionEntity);
                            }
                            if (StringUtil.isNotEmpty(bOption)) {
                                XueBaOptionEntity bOptionEntity = new XueBaOptionEntity();
                                bOptionEntity = DealOption(bOptionEntity,bOption);
                                optionList.add(bOptionEntity);
                            }
                            if (StringUtil.isNotEmpty(cOption)) {
                                XueBaOptionEntity cOptionEntity = new XueBaOptionEntity();
                                cOptionEntity = DealOption(cOptionEntity,cOption);
                                optionList.add(cOptionEntity);
                            }
                            if (StringUtil.isNotEmpty(dOption)) {
                                XueBaOptionEntity dOptionEntity = new XueBaOptionEntity();
                                dOptionEntity = DealOption(dOptionEntity,dOption);
                                optionList.add(dOptionEntity);
                            }
                            if (StringUtil.isNotEmpty(eOption)) {
                                XueBaOptionEntity eOptionEntity = new XueBaOptionEntity();
                                eOptionEntity = DealOption(eOptionEntity,eOption);
                                optionList.add(eOptionEntity);
                            }

                            question.setXueBaOptionList(optionList);
                            questionList.add(question);
                        }
                    }catch (Exception e) {
                        e.printStackTrace();
                        logger.info("题库第" + num + "行解析异常");
                    }
                }
            }
        }catch (Exception e) {
            e.printStackTrace();
        }
        return questionList;
    }

    private XueBaOptionEntity DealOption(XueBaOptionEntity optionEntity,
            String option) {
        int start = option.indexOf("、");
//        System.out.println("option:"+option+" start:"+start);
        String optionTitle = option.substring(0, start);
        String optionContent = option.substring(start+1);
        optionEntity.setTitle(optionTitle);
        optionEntity.setContent(optionContent);
        return optionEntity;
    }

    private String getCellFormatValue(HSSFCell cell) {
        String cellvalue = "";
        if (cell != null) {
            // 判断当前Cell的Type
            switch (cell.getCellType()) {
            // 如果当前Cell的Type为NUMERIC
            case HSSFCell.CELL_TYPE_NUMERIC:
            case HSSFCell.CELL_TYPE_FORMULA: {
                // 判断当前的cell是否为Date
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    // 如果是Date类型则,转化为Data格式

                    // 方法1:这样子的data格式是带时分秒的:2011-10-12 0:00:00
                    // cellvalue = cell.getDateCellValue().toLocaleString();

                    // 方法2:这样子的data格式是不带带时分秒的:2011-10-12
                    Date date = cell.getDateCellValue();
                    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
                    cellvalue = sdf.format(date);

                }
                // 如果是纯数字
                else {
                    // 取得当前Cell的数值
                    cellvalue = String.valueOf(cell.getNumericCellValue());
                }
                break;
            }
                // 如果当前Cell的Type为STRIN
            case HSSFCell.CELL_TYPE_STRING:
                // 取得当前的Cell字符串
                cellvalue = cell.getRichStringCellValue().getString();
                break;
            // 默认的Cell值
            default:
                cellvalue = " ";
            }
        } else {
            cellvalue = "";
        }
        return cellvalue;
    }
时间: 2024-10-11 12:30:29

Excel导入功能的相关文章

解析大型.NET ERP系统 设计通用Microsoft Excel导入功能

做企业管理软件很难避免与Microsoft Excel打交道,常常是软件做好了,客户要求说再做一个Excel导入功能.导入Excel数据的功能的难度不大,从Excel列数据栏位的取值,验证值,再导入到数据库表中.然而一直是在做重复工作,写过不计其数的Excel导入程序,每次只是满足于问题解决,后来终于找到一个方法,实现通用的Excel数据导入. 设计通用的Excel导入功能,第一个实现要求是不能依赖Excel,客户的电脑或服务器很有可能没有安装Excel,所以微软的Office Interop一

Java中Excel导入功能实现、excel导入公共方法_POI -

这是一个思路希望能帮助到大家:如果大家有更好的解决方法希望分享出来 公司导入是这样做的 每个到导入的地方 @Override public List<DataImportMessage> materialDataImport2(byte[] fileBytes, String fileName) { //return DataImport(fileBytes, fileName, "inv_m"); File file = FileUtils.getFileFromByte

php开发中Excel导入功能的具体实现方法

对于在做php开发项目中,一般的项目设计到最多用到的是Excel的导出功能,而对于其导入功能一般是很少见的,而且对于php开发中Excel的导入功能也要比导出功能开发起来更困难一些,那么今天就来分享一下php开发中Excel导入功能的具体实现步骤: 1.首先将下载下来的PHP Excel插件代码放入项目/Thinkphp/Extend/Vendor/下; 2.在模板添加导入功能; html代码实现如下:<form action="{:U('Turntable/imports')}"

Excel导入功能(Ajaxfileupload)

前言: 前端采用Easyui+Ajaxfileupload实现 后端采用springmvc框架,其中把解析xml封装成了一个jar包,直接调用即可 准备: 前端需要导入(easyui导入js省略,自行导入即可) Ajaxfileupload.js 下载地址:http://files.cnblogs.com/files/holdon521/ajaxfileupload.zip 后端需要导入:ht-excel.jar 下载地址:http://files.cnblogs.com/files/holdo

C# 之 Excel 导入一列中既有汉字又有数字:数字可以正常导入,汉字导入为空

今天在做一个Excel导入功能,一切开发就绪,数据可以成功导入.导入后检查数据库发现有一列既有汉字又有数字,数字正常导入,汉字为空.但是前面同样既有汉字又有数字的列可以导入成功. 查看excel 源文件,如下图: 仔细观察两列略有不同,前两列的数字单元格左上角有个绿色三角形,选中单元格,左边有一个信息显示“ 次单元格中的数字为文本形式,或者前面有撇号. ”,也就是 “ 以文本形式存储的数字 ”. 然后尝试选中内容列,右键设置单元格格式为“ 文本 ”,修改后如下图: 再次导入仍然失败,单元格左上角

ASP.NET Aries 高级开发教程:Excel导入之单表配置(上)

前言: 随着ASP.NET Aries的普及,刚好也有点闲空,赶紧把Excel导入功能的教程补上. Excel导入功能,分为四篇:单表配置(上).多表高级配置(中).配置规则(下).代码编写(番外篇). 本篇介绍单表配置功能. 1.配置表头,把需要导入的勾打上. 对于格式化的配置(生成Excel模板时,也会变成下拉项,同时导入回来时,它也可以把下拉的中文翻译回数值) 说明: 勾了三个,说明导入只导入三个. 其中勾选了唯一(键),则导入的数据会根据唯一键(存在则更新.不存在则插入). 也可以勾选多

excel 导入导出测试点

目前,为方便操作,很多系统都会增加批量导入导出的功能.文件导入导出一般格式都是excel.由于用户直接在excel在填写内容,无法控制填写的格 式,加上excel解析比较困难,所以一般涉及到excel导入导出功能测试起来都较为繁杂.现将常用设计用例总结如下. 批量导入 一.模板检查测试 一般excel导入功能,都会提供模板下载功能. 1.模板只有一个文件 模板只有一个文件时,比较简单,检查一下模板和预期是否一致即可. 2.模板是一个压缩包 模板是压缩包时,需要检查一下压缩包中文件是否齐全,每一个

《.NET学习笔记》——使用NPOI读取Excel导入数据和导出Excel的功能

前提:由于有差不多两年时间没有进行B/S项目开发了,换了新工作,项目中要求有Excel导入数据库的功能,故保存下来供以后查看. 一.使用jQuery的uploadify插件完成选择文件并上传的功能: (1)先引入相关文件: <script src="../Scripts/uploadify/swfobject.js" type="text/javascript"></script> <link href="../Scripts

Excel导入导出的业务进化场景及组件化的设计方案(转)

1:前言 看过我文章的网友们都知道,通常前言都是我用来打酱油扯点闲情的. 自从写了上面一篇文章之后,领导就找我谈话了,怕我有什么想不开. 所以上一篇的(下)篇,目前先不出来了,哪天我异地二次回忆的时候,再分享分享. 话说最近外面IT行情飞涨还咋的,人都飞哪去了呢,听说各地的军情都进入紧急状态了. 回归下正题,今天就抽点时间,写写技术文,和大伙分享一下近年在框架设计上的取的一些技术成果. 2:项目背景 在针对运营商(移动.联通.电信.铁塔)的信息类的系统中,由于相关的从业人员习惯于Excel的办公