• POI Excel导入导出


    一.导出到Excel

       基本思路:点击导出后生成临时.xls文件,返回文件名,供用户下载,下载完后删除文件

       带查询的导出(前端EasyUI),如下为导出界面图

      

      下面为导出按钮绑定的函数:

    var exportCondition={};//导出条件
    //导出功能 function outputData(){ $.ajax({ type: "POST", url: path+"/main/inputAndOutput/output", data: exportCondition, success: function (fileName) { var downUrl = path+"/main/inputAndOutput/download?fileName=" + fileName; window.location = downUrl; } }); }

       //查询功能
       function search(){
         //按条件进行查询数据,首先我们得到数据的值
         //得到用户输入的参数,取值有几种方式:$("#id").combobox('getValue'), $("#id").datebox('getValue'), $("#id").val()
           //字段增加search_前缀字符,避免传递如URL这样的Request关键字冲突
           var queryData = {
               search_type: $("#search_type").combobox('getValue'),
               search_address: $("#search_address").combotree("tree").tree("getSelected")!=null?$("#search_address").combotree("tree").tree("getSelected").id:"",
               search_name: $("#search_name").textbox('getValue'),
               search_year: $("#search_year").textbox('getValue'),
               search_publicType: $("#search_publicType").textbox('getValue'),
               search_publicName: $("#search_publicName").textbox('getValue'),
               search_layout: $("#search_layout").combobox('getValue'),
               search_status: $("#search_status").combobox('getValue')
           }
           //将值传递给
           initGrid(queryData);
           
           //将查询条件传递给导出
           exportCondition = queryData;
       }

    后台:生成.xls文件,返回文件名

    @RequestMapping(value="output",method=RequestMethod.POST)
        @ResponseBody
        public String output(HttpServletRequest request,HttpServletResponse response){
            Map<String, Object> param = new HashMap<String, Object>();
            List<YellowPagesResourceModel> list = new ArrayList<YellowPagesResourceModel>();
            String fileName="";
            try {
                
                //获取查询条件
                param = getQueryParam(request);
                
                list = this.yellowpageResService.QueryAllForGridData(param);
                if(list.size()>0){
                    //创建webbook,对应一个Excel文件
                    HSSFWorkbook wb = new HSSFWorkbook();
                    
                    //设置表头及样式
                    HSSFSheet sheet = defineHeader(wb);
                    
                    //填充数据
                    writeData(list, sheet);
                    
                    //数据写入文件
                    fileName=writeToFile(wb);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return fileName;
        }
    
    /**
         * 设置表头和样式
         * @param wb
         * @return
         */
        private HSSFSheet defineHeader(HSSFWorkbook wb) {
            //添加sheet,对应Excel文件中sheet
            HSSFSheet sheet = wb.createSheet("黄页资源(一)");
            
            //创建表头
            HSSFRow row = sheet.createRow(0);
            
            //创建单元格,设置表头值
            HSSFCellStyle style = wb.createCellStyle();
            style.setAlignment(HSSFCellStyle.ALIGN_CENTER);//居中格式
            
            HSSFCell cell = row.createCell(0);
            cell.setCellValue("序号");
            cell.setCellStyle(style);
            
            cell = row.createCell(1);
            cell.setCellValue("所属地市");
            cell.setCellStyle(style);
            
            cell = row.createCell(2);
            cell.setCellValue("地区");
            cell.setCellStyle(style);
            
            cell = row.createCell(3);
            cell.setCellValue("年份");
            cell.setCellStyle(style);
            
            cell = row.createCell(4);
            cell.setCellValue("书名");
            cell.setCellStyle(style);
            
            cell = row.createCell(5);
            cell.setCellValue("刊式代码");
            cell.setCellStyle(style);
            
            cell = row.createCell(6);
            cell.setCellValue("刊式名称");
            cell.setCellStyle(style);
            
            cell = row.createCell(7);
            cell.setCellValue("刊式尺寸");
            cell.setCellStyle(style);
            
            cell = row.createCell(8);
            cell.setCellValue("价格");
            cell.setCellStyle(style);
            
            cell = row.createCell(9);
            cell.setCellValue("版面");
            cell.setCellStyle(style);
            return sheet;
        }
    
        /**
         * 写入数据到excel
         * @param list
         * @param sheet
         */
        private void writeData(List<YellowPagesResourceModel> list, HSSFSheet sheet) {
            HSSFRow row = null;
            //写入数据
            YellowPagesResourceModel model = null;
            for(int i=0;i<list.size();i++){
                row = sheet.createRow(i+1);
                model = list.get(i);
                row.createCell(0).setCellValue(i+1);
                row.createCell(1).setCellValue(model.getAddress());
                row.createCell(2).setCellValue(model.getAddressStr());
                row.createCell(3).setCellValue(model.getPagesYear());
                row.createCell(4).setCellValue(model.getPagesName());
                row.createCell(5).setCellValue(model.getPublicCode());
                row.createCell(6).setCellValue(model.getPublicName());
                row.createCell(7).setCellValue(model.getPublicType());
                row.createCell(8).setCellValue(model.getPrice().toString());
                row.createCell(9).setCellValue(model.getLayout()==1?"普通版面":"特殊版面");
            }
        }
    
        /**
         * 数据写入磁盘文件
         * @param wb
         * @throws IOException
         * @throws FileNotFoundException
         */
        private String writeToFile(HSSFWorkbook wb) throws IOException,
                FileNotFoundException {
            // 读取配置文件获取实际保存路径
            Properties props = PropertiesLoaderUtils.loadAllProperties("otherCfg.properties");
            //实际保存路径
            String saveDir = props.getProperty("PathToYellowPagesResFile_DEV");
            File fileDir = new File(saveDir.toString());
            if(!fileDir.exists()){
                fileDir.mkdirs();
            }
            String fileName = new java.text.SimpleDateFormat("yyyyMMddHHmmss").format(new Date()) + "-" +RandomUtils.nextInt();
            String filePath = saveDir+File.separator+fileName+".xls";
            FileOutputStream fout = new FileOutputStream(filePath);
            ByteArrayOutputStream ostream = new ByteArrayOutputStream();
            wb.write(ostream);
            fout.write(ostream.toByteArray());
            fout.flush();
            ostream.close();
            fout.close();
            return fileName+".xls";
        }

    文件下载在此就不多提,注意的是在下载完后记得删除上面生成的.xls文件,其次为了解决乱码,如下设置response

    /**
         * 解决附件下载名称乱码
         * @param request
         * @param response
         * @param params
         * @throws UnsupportedEncodingException
         */
        private void solveGarbled(HttpServletRequest request,
                                    HttpServletResponse response,
                                    Map<String, String> params
                                    ) throws UnsupportedEncodingException{
            if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") > -1){//IE浏览器
                response.setContentType("application/octet-stream");
                response.addHeader("Content-Disposition", "attachment;filename="+URLEncoder.encode(params.get("realFileName"), "iso-8859-1"));
            }else if (request.getHeader("User-Agent").toLowerCase().indexOf("firefox") > -1){//firefox浏览器
                response.setContentType("application/x-xls");
                response.addHeader("content-disposition", "attachment;filename="" + params.get("realFileName") + """);
            }else{//其他浏览器
                response.setContentType("application/x-xls");
                response.addHeader("content-disposition", "attachment;filename=" + params.get("realFileName"));
            }
        }

    导出.xls文件如下:

      

    二.xls导入数据到数据库

       基本思路:上传.xls,转换成.csv,读取数据,存入数据库

       导入对话框如下所示:

      

    如下为代码:

     <div id="inputDlg" class="easyui-dialog" style="380px;height:220px;"
                 data-options="buttons: '#inputDlg-buttons',closed:true,modal: true">
                     <form id="uploadForm"  method="post" enctype="multipart/form-data">  
                         <table cellpadding="8">
                            <tr class="fitem">
                                    <td>
                                        <input id="uploadExcel" name="uploadExcel" class="easyui-filebox" style="250px;"
                                            data-options="prompt:'请选择.xls文件...'">  
                                    </td>
                            </tr>
                            <tr class="fitem">
                                 <td>
                                     <label>黄页类型:</label><input id="uploadType" name="uploadType" class="easyui-combobox"/>
                                 </td>
                            </tr>
                         </table>
                    </form> 
                    <p style="color:red;font-size:12px;text-align:center;">请注意导入的Excel数据字段和
                        <a href="${pageContext.request.contextPath}/main/inputAndOutput/downloadTemplate">Excel模板</a>一致
                    </p>
        </div>
        <div id="inputDlg-buttons">
                <a href="javascript:void(0)" class="easyui-linkbutton"
                    data-options="iconCls:'icon-save'" onclick="uploadFile()">上传</a> 
               <a id="uploadBtn" href="javascript:void(0)" class="easyui-linkbutton"
                    data-options="iconCls:'icon-cancel'"
                    onclick="javascript:$('#inputDlg').dialog('close')">取消</a>
        </div>
    //文件上传
    function uploadFile(){
        //得到文件路径
        var filePath = $('#uploadExcel').filebox('getValue');
        if(filePath!=""){
            //对文件格式进行验证(简单验证)
            var d1=/.[^.]+$/.exec(filePath);
            if(d1==".xls"){
                $('#uploadForm').form('submit',{
                       url: path+'/main/inputAndOutput/upload',
                       success: function(data){
                           if (data){
                               $('#inputDlg').dialog('close');
                               $("#grid").datagrid('reload');
                           } else {
                               $.messager.alert('操作提示',"导入失败,请检查数据是否正确!",'error');
                           }
                       }
                   });
            }else{
                $.messager.alert('温馨提示','请选择.xls文件!','warning');
            }
        }else{
            $.messager.alert('温馨提示','请选择.xls文件!','warning');
        }
    }

    后台:

      

        @RequestMapping(value="upload")
        @ResponseBody
        public String upload(HttpServletRequest request,HttpServletResponse response) throws IOException{
            String result=null;
            //文件上传到磁盘
            Map<String,String> map = uploadExcel(request);
            
            String fileName = map.get("fileName");
            Integer type =Integer.parseInt(map.get("type"));
            List<String> dataList = new ArrayList<String>();
            Properties props = PropertiesLoaderUtils.loadAllProperties("otherCfg.properties");
            String saveDir = props.getProperty("PathToYellowPagesResFile_DEV");
            String filePath = saveDir+File.separator+fileName;
            try {
                
                //.xls转换为.csv
                XLS2CSVmra xls2csv = new XLS2CSVmra(filePath+".xls", filePath+".csv");
                xls2csv.process();
                //删除.xls
                File file = new File(filePath+".xls");
                if(file.exists())file.delete();
                
                //获取.csv中数据
                File csvFile = new File(filePath+".csv"); 
                dataList = CSVUtils.importCsv(csvFile);
                
                //删除.csv
                csvFile.delete();
                for(String s:dataList){
                    System.out.println(s);
                }
                
                if(dataList.size()>0){
                    //.csv中数据转换为entity
                    List<YellowPagesResource> instances = new ArrayList<YellowPagesResource>();
                    instances = convertToEntity(type, dataList);
                    //保存至数据库
                    this.yellowpageResService.createOrModify(instances);
                    result = "成功导入:"+instances.size()+"条数据.";
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            return result;
        }

    说明:

      (1).xls转换为.csv,由于.csv以一行数据的字符串并用“,”分隔存放数据,所以可以实现一行一行地读取数据

          apache官方的例子:实现.xls-->.csv和.xlsx--->.csv
      XLS2CSV: http://www.docjar.com/html/api/org/apache/poi/hssf/eventusermodel/examples/XLS2CSVmra.java.html
      XLSX2CSV: https://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/xssf/eventusermodel/XLSX2CSV.java

      (2)获取.csv的数据(注意设置编码集,否则容易乱码)

    public static List<String> importCsv(File file){
            List<String> dataList=new ArrayList<String>();
            FileInputStream in = null;
            BufferedReader br=null;
            try { 
                in = new FileInputStream(file);
                br = new BufferedReader(new InputStreamReader(in, "GBK"));//设置编码集
                String line = ""; 
                while ((line = br.readLine()) != null) { 
                    dataList.add(line);
                }
            }catch (Exception e) {
            }finally{
                if(br!=null){
                    try {
                        br.close();
                        br=null;
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
     
            return dataList;
        }

    (3).csv中数据转换为entity

        /**
         * 将从csv中获取的数据转换成Entity
         * @param type 资源类型
         * @param dataList
         */
        private List<YellowPagesResource> convertToEntity(Integer type, List<String> dataList) {
            String[] cells = null;
            List<YellowPagesResource> instances = new ArrayList<YellowPagesResource>();
            for(int i=0;i<dataList.size();i++){
                cells = dataList.get(i).replace(""", "").split(",");
                if(cells.length<10){
                    continue;
                }else{
                    YellowPagesResource ypr = new YellowPagesResource();
                    ypr.setPagesName(cells[4]);
                    ypr.setPagesYear(cells[3]);
                    ypr.setAddress(cells[1]);
                    ypr.setPublicCode(cells[5]);
                    ypr.setPublicName(cells[6]);
                    ypr.setPublicType(cells[7]);
                    ypr.setStatus(2);//未销售
                    ypr.setCreator(SecurityUserHolder.getCurrentUser().getName());
                    ypr.setProductId("402881ea4c5e43fd014c60660ffd0000");//这个暂时写死的
                    ypr.setType(type);
                    if("特殊版面".equals(cells[9])){
                        ypr.setLayout(2);
                    }else if("普通版面".equals(cells[9])){
                        ypr.setLayout(1);
                    }else{
                        continue;
                    }
                    ypr.setPrice(BigDecimal.valueOf(Double.parseDouble(cells[8])));
                    instances.add(ypr);
                }
            }
            return instances;
        }

    注:以上实例未给出验证上传的.xls数据格式是否合法,只是在转换为entity时简单判断了(这样是不行的!)

  • 相关阅读:
    jQuery Ajax通用js封装
    java校验导入的模板
    一条sql查出数据库某张表的所有属性
    封装SpringJdbcTemplate
    ehCache 配置
    使用mybatis自动实现接口封装返回结果集
    js打开新窗口并且居中显示
    单例模式读取配置文件只创建一次
    递归
    函数声明,函数表达式
  • 原文地址:https://www.cnblogs.com/javamilan/p/4415392.html
Copyright © 2020-2023  润新知