java实现Excel导入功能

最近研究了开源系统MyExam,对于java实现Excel导入分享下

前台代码:

<form id="importForm"  method="post" enctype="multipart/form-data">

        <div>

            <h1><fmt:message key="questionimport"/></h1>

                <table class="yTable margintop">

                    <tr>

                        <th><fmt:message key="selectfile"/>:</th>

                        <td><input id="files" name="files" type="file" /></td>

                    </tr>

                </table>

            <br />

        </div> 

        <div class="Btn">

    <input id="downloadBtn" type="button" value="<fmt:message key="downloadtemplate"/>" />

                <input id="importBtn" type="button" value="<fmt:message key="import"/>" />

       

    </div> 

   </form>

js文件:

define(function(require){

    var $ = require('jquery');

     var contextPath=$("#contextPath").val();

    require('dialog')($);

    require('uriTemplate')($);

    var IFA = require('util');

    require('dateTimePicker')($);

    require("../../../styles/cim/jquery-ui-1.8.14.custom.css");

   

    $("#importBtn").click(function(){

        var url =contextPath+'/question/import.do';

        $("#importForm").attr("action",url);

        $("#importForm").submit();

    });

   

    $("#downloadBtn").click(function(){

        url = contextPath+'/download/questionTemplate.xlsx';

        location.href = url;

    });

});

Java代码:

/**

     * 导入试题

     *

     * @author Eric

     *

     */

    @SuppressWarnings("unchecked")

    @RequestMapping(value = "/question/import.json", method = RequestMethod.POST)

    public String create(final ExcelDTO excelDTO,

            final BindingResult result, final ModelMap model,

            HttpServletRequest request){

        excelValidator.validate(excelDTO, result);     

        // 插入数据的list

        List<importQuestionDTO> importQuestionList = new LinkedList<importQuestionDTO>();

        if (result.hasErrors()) {

           

            model.put("importFileTypeError1", "importFileTypeError");

        } else {

           

            try {

                final Map<String, Object> parse = parseExcel(excelDTO);

                final boolean dataTooManyErrorFlag = (Boolean) parse

                        .get("dataTooManyErrorFlag");

                if (dataTooManyErrorFlag) {

                    model.put("importFileDataTooManyErroFlag1", true);

                } else {

                    // 格式正确的list

                    importQuestionList = (List<importQuestionDTO>) parse.get("formatCorrectList");

 

 

                }

            } catch (Exception e) {

                model.put("importFileReadErrorMsg1", "true");

                return view(model, "importQuestionView", TopMenu.EXAM,

                        SideMenu.QUESTION_MANAGEMENT);

            }

            final Map<String, Object> resultMap = insertDB(importQuestionList, request);

            model.put("lastId", resultMap.get("insertLastId"));

            model.put("count", resultMap.get("successCount"));

            model.put("importVoucherSuccessFlag1", "true");

        }

        return view(model, "importQuestionView", TopMenu.EXAM,

                SideMenu.QUESTION_MANAGEMENT);

    }

    /**

     * <p>

     * Description: 插入数据

     * </p>

     *

     * @author Eric

     */

    private Map<String, Object> insertDB(

            List<importQuestionDTO> questionList,

            HttpServletRequest request) {

        final Date date = new Date();

        final Integer creatorAndModifier = (Integer) securityHelper.getID(request);

        for (importQuestionDTO questionDTO : questionList) {

            setDefaultValue(date, creatorAndModifier, questionDTO);

        }

        //return personProfileService.importClubCustomer(clubCustomerList);

        return null;

    }

    /**

     * <p>

     * Description: 设置其他默认必须数据

     * </p>

     *

     * @author Eric

     */

    private void setDefaultValue(final Date date,

            final Integer creatorAndModifier,

            importQuestionDTO questionDTO) {

        questionDTO.setCreationDate(new Date());

        questionDTO.setCreator(creatorAndModifier);

        questionDTO.setModificationDate(new Date());

        questionDTO.setModifier(creatorAndModifier);

        questionDTO.setOrigin("import");

    }

 

    /**

     * <p>

     * Description: 解析excel

     * </p>

     *

     * @author Eric

     */

    private Map<String, Object> parseExcel(final ExcelDTO excelDTO)

            throws BiffException, IOException {

        final Map<String, Object> map = new HashMap<String, Object>(3);

        Workbook workbook = null;

        try {CommonsMultipartFile file=(CommonsMultipartFile) excelDTO.getFiles().get(0);

            String fileName = file.getFileItem().getName();

            String extension = fileName

                    .substring(fileName.lastIndexOf(".") + 1);

            InputStream is = file.getInputStream();

            // if ("xlsx".equals(extension)) {

            // XSSFWorkbook workbook2007 = new XSSFWorkbook(is);

            // final XSSFSheet sheet = workbook2007.getSheetAt(0);

            // final int totalRows = sheet.getLastRowNum();

            // if (totalRows > 3000) {

            // map.put("dataTooManyErrorFlag", true);

            // } else {

            // map.putAll(packagePersonProfile2007(sheet, totalRows));

            // map.put("dataTooManyErrorFlag", false);

            // }

            // }

 

            workbook = Workbook.getWorkbook(is);

            final Sheet sheet = workbook.getSheet(0);

 

            final int totalRows = sheet.getRows();

 

            if (totalRows > 3000) {

                map.put("dataTooManyErrorFlag", true);

            } else {

                map.putAll(packagePersonProfile(sheet, totalRows));

                map.put("dataTooManyErrorFlag", false);

            }

        } catch (BiffException e) {

           

            throw e;

        } catch (IOException e) {

           

            throw e;

        } finally {

            if (workbook != null) {

                workbook.close();

            }

        }

        return map;

    }

    /**

     * <p>

     * Description: 将excel2003封装成list

     * </p>

     *

     * @author Eric

     */

    private Map<String, List<importQuestionDTO>> packagePersonProfile(

            final Sheet sheet, final Integer totalRows) {

               

       

        final List<importQuestionDTO> formatCorrectList = new LinkedList<importQuestionDTO>();

 

        final Map<String, List<importQuestionDTO>> packageResult = new HashMap<String, List<importQuestionDTO>>(

                2);

        for (int i = 1; i < totalRows; i++) {

            importQuestionDTO questionDTO = new importQuestionDTO();

            List<OptionDTO>    optionDTO=new ArrayList<OptionDTO>();

            final String content = sheet.getCell(0, i).getContents().trim();

            final String analyse = sheet.getCell(1, i).getContents().trim();

            final String answer = sheet.getCell(2, i).getContents().trim();

            final String category = sheet.getCell(3, i).getContents().trim();

            int num=num(sheet, i);

          for (int k = num; k > 3; k--) {

          OptionDTO optionDTO2=new OptionDTO();

          optionDTO2.setContent(sheet.getCell(k, i).getContents().trim());

            optionDTO.add(optionDTO2);

        }

 

                try {

                    questionDTO = constructclubCustomerDTO(content, analyse,

                        answer, category, (ArrayList<OptionDTO>) optionDTO);

                formatCorrectList.add(questionDTO);

                } catch (NumberFormatException e) {

                    //log.catching(e);

 

                }

            }

 

        packageResult.put("formatCorrectList", formatCorrectList);

 

        return packageResult;

    }

    /**

     * <p>

     * Description: 封装所需的DTO

     * </p>

     *

     * @author Eric

     */

    private importQuestionDTO constructclubCustomerDTO(String content,

            String analyse, String answer, String category, ArrayList<OptionDTO> optionDTO) {

        final importQuestionDTO importQuestionDTO = new importQuestionDTO();

        importQuestionDTO.setContent(content);

        importQuestionDTO.setAnalysis(analyse);

        importQuestionDTO.setAnswer(answer);

        importQuestionDTO.setCategory(category);

        importQuestionDTO.setOptions(optionDTO);

       

        return importQuestionDTO;

    }

    public int num(final Sheet sheet, final Integer i){

        int a;

        for (int j = 0; ; j++) {

           

       

        if (StringUtils.isBlank(sheet.getCell(4+j, i).getContents().trim())) {

            a=4+j;

            break;

        }  

        }

        return a;

    }

    /**

     * <p>

     * Description: 将excel2007封装成list

     * </p>

     *

     * @author Eric

     */

    private Map<String, List<QuestionDTO>> packagePersonProfile2007(

            final XSSFSheet sheet, final Integer totalRows) {

        // 填充的list

        final List<QuestionDTO> formatCorrectList = new LinkedList<QuestionDTO>();

 

        final Map<String, List<QuestionDTO>> packageResult = new HashMap<String, List<QuestionDTO>>(

                2);

        for (int i = 1; i < totalRows; i++) {

            QuestionDTO clubCustomerDTO = new QuestionDTO();

           

        }

        return packageResult;

    }

    /**

     * 导入试题

     *

     * @author Eric

     *

     */

    @RequestMapping(value = "/importPaper.do", method = RequestMethod.GET)

    public String importPaperIndex(final ModelMap model){

           

 

        return view(model, "importPaperView", TopMenu.EXAM,

                SideMenu.PAPER_MANAGEMENT);

    }

Service代码:

    public Map<String, Object> importQuestion(

            final List<importQuestionDTO> questionList) {

 

        // 插入新数据,并返回最后插入的personProfile的id

        final Integer insertLastId = questionDao

                .insertQuestionBatch(questionList);

        final Map<String, Object> resultMap = new HashMap<String, Object>();

 

        resultMap.put("insertLastId", insertLastId);

 

        return resultMap;

    }

DAO:

            public Integer insertQuestionBatch(

                    final List<importQuestionDTO> questionDTOs) {

                Integer lastId = (Integer) getSqlMapClientTemplate().execute(

                        new SqlMapClientCallback<Object>() {

                            public Object doInSqlMapClient(final SqlMapExecutor executor)

                                    throws SQLException {

                                executor.startBatch();

                                for (importQuestionDTO clubCustomerDTOs : questionDTOs) {

                                    int id=(Integer) executor.insert(

                                            "question.insert",

                                            clubCustomerDTOs);

                                    List<OptionDTO> optionDTOs=clubCustomerDTOs.getOptions();

                                   

                                    for (OptionDTO optionDTO:optionDTOs ) {

                                        optionDTO.setQuestionId(id);

                                        executor.insert(

                                                "question.insertOption",

                                                optionDTO);

                                    }

                                }

                                executor.executeBatch();

                                //final Integer id = (Integer) executor

                                        //.queryForObject("person_profile.selectLastInsertID");

                                return 5;

                            }

                        });

                return lastId;

            }

    // 根据id删除

    public void deleteQuestion(int id) {

        getSqlMapClientTemplate().delete("question.deleteById", id);

    }

 

    public int insertQuestion(QuestionDTO questionDTO) {

        return (Integer) getSqlMapClientTemplate().insert("question.insert",

                questionDTO);

 

    }

大家可以下载完整源代码,慢慢研究吧

posted @ 2013-08-28 16:14  eric2013  阅读(699)  评论(0)    收藏  举报