精华内容
下载资源
问答
  • java web Excel导入数据库java web Excel导入数据库 java web Excel导入数据库java web Excel导入数据库
  • 前端_HTML_Web Excel导入

    2018-04-26 17:44:31
    前端_HTML_Web Excel导入,内有可以使用的demo,前端_HTML_Web Excel导入,内有可以使用的demo
  • 纯前端实现的webExcel

    2019-05-07 10:35:53
    纯前端实现的webExcel,支持插入行列,合并单元格,九宫格布局等
  • WebExcel文件展现

    2013-03-27 17:36:33
    WebExcel文件展现,在asp.net网页中显示EXCEL
  • Web Excel導出功能實現

    2011-06-22 15:12:23
    Web Excel導出功能實現!!!!!!!!
  • java web Excel文件导出

    2018-05-28 10:17:22
    提供列表查询匹配的excel数据导出,引用该工具类,只需要在页面上引用导出的自定义标签,然后按照提供的使用文档进行配置,后端action层或者controller层,实现其数据加载的抽象方法即可(使用方式也在文档中说明)...
  • 在线Excel的前端组件、控件,实现web Excel 在互联网众多领域,都有导入导出的场景;但是有些场景 是导出来 编辑 再导进去,无疑是一个很麻烦的事情,失去了互联网的价值,同时也存在性能,数据一致性的问题。所以一...

    在线Excel的前端组件、控件,实现web Excel

    在互联网众多领域,都有导入导出的场景;但是有些场景 是导出来 编辑 再导进去,无疑是一个很麻烦的事情,失去了互联网的价值,同时也存在性能,数据一致性的问题。所以一个线上Excel很是重要。

    这里推荐两个 前端技术供大家参考:
    SpreadJS

    SpreadJS 纯前端表格控件是基于 HTML5 的 JavaScript 电子表格和网格功能控件,提供了完备的公式引擎、排序、过滤、输入控件、数据可视化、Excel 导入/导出等功能,适用于 .NET、Java 和移动端等各平台在线编辑类 Excel 功能的表格程序开发。

    SpreadJS具有以下功能特点:

             丰富的数据交互和外观
    	   数据、显示、可视化和分析支持
           强大的计算引擎
           工作表和单元格级别的数据绑定
           数据验证
           单元格类型
           数据操作
           高速、低耗
    

    https://www.grapecity.com.cn/developer/spreadjs

    JExcel.js

    展开全文
  • Visual studio平台下基于C#语言开发的WebForm,调用NPOI类库实现Excel文档的读写操作,非常好用,程序可以直接运行
  • java web Excel在网页预览

    万次阅读 2018-07-04 11:54:34
    * @param wb excel生成的Workbook (可读取io转换生成workbook) */ public static void writToAjax(HttpServletResponse response, HSSFWorkbook wb) throws IOException { try { ExcelToHtmlConverter ...

    pom.xml添加

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi</artifactId>
                <version>3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml-schemas</artifactId>
                <version>3.9</version>
            </dependency>
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-scratchpad</artifactId>
                <version>3.9</version>
            </dependency>

     

    后端处理方法代码:

     

            /** 
             * Workbook生成HTML方法
    	 * @param response  后端接口返回参数 
    	 * @param wb excel生成的Workbook  (可读取io转换生成workbook)
    	 */
    	public static void writToAjax(HttpServletResponse response, HSSFWorkbook wb) throws IOException {
    		try {
    			ExcelToHtmlConverter ethc = new ExcelToHtmlConverter(
    					DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument());
    			ethc.setOutputColumnHeaders(false);
    			ethc.setOutputRowNumbers(false);
    			ethc.processWorkbook(wb);
    
    			Document htmlDocument = ethc.getDocument();
    			ByteArrayOutputStream out = new ByteArrayOutputStream();
    			DOMSource domSource = new DOMSource(htmlDocument);
    			StreamResult streamResult = new StreamResult(out);
    
    			TransformerFactory tf = TransformerFactory.newInstance();
    			Transformer serializer = tf.newTransformer();
    			serializer.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
    			serializer.setOutputProperty(OutputKeys.INDENT, "yes");
    			serializer.setOutputProperty(OutputKeys.METHOD, "html");
    			serializer.transform(domSource, streamResult);
    			out.close();
    
    			String htmlStr = new String(out.toByteArray(), "UTF-8");
    
    			htmlStr = htmlStr.replace("<h2>Sheet1</h2>", "").replace("<h2>Sheet2</h2>", "")
    					.replace("<h2>Sheet3</h2>", "").replace("<h2>Sheet4</h2>", "").replace("<h2>Sheet5</h2>", "");
    			response.setContentType("text/html;charset=utf-8");
    			PrintWriter pw = response.getWriter();
    			pw.print(htmlStr);
    			pw.flush();
    			pw.close();
    		} catch (Exception e) {
    			e.printStackTrace();
    		}
    	}

    前端请求:

    <script>
    $('#officeContent').attr("src","[后端接口路径]");
    </script>
    
    <html><body>
    <iframe id="officeContent" src="" width=0 height=0 frameborder=0></iframe></body></html>

     

     

     

    展开全文
  • handsontable中文API 常规配置,第三方web 表格处理属性设计文档,包括单元格的合并等操作
  • js web excel 0.56 + js vm

    2008-11-25 18:06:11
    web版的excel(js)附带一个javascript 写的vm 当前版本 0.56 已经更新到0.57,有兴趣的请下最新版本
  • web excel + vm(js)

    2008-11-18 17:31:35
    web版的excel(js)附带一个javascript 写的vm vm还在进一步修整开发中,有兴趣的人可以来一起研讨一下 qq群号:37124638 目前已更新,请下新的版本
  • 基于handsontable的web excel(上)

    千次阅读 2017-09-28 15:38:39
    handsontable在网页上显示excel表格

    handsontable是一个js插件,可以在网页上显示和操作excel。可以通过github或者handsontable的官方网站下载。首先上效果图:


    使用handsontable显示excel步骤:

    一、导入js和css:

        <link href="__STATIC__/handsontable/handsontable.full.css" rel="stylesheet" type="text/css">
        <script type="text/javascript" src="__STATIC__/jquery-2.0.3.min.js"></script>
        <script type="text/javascript" src="__STATIC__/handsontable/handsontable.full.js"></script>

    二、创建一个div作为excel表格的容器:

        <div id="lina_main">
        </div>
    三、添加初始数据:

    3.1、自定义行高和列宽,单位是px:

         var cell_width = [
             100,120,90,100,100
         ];
         var cell_height = [
             50,20,40,100
         ];

    3.2、设置单元格数据:

          var cell_data = [
             ["", "Ford", "Tesla", "Toyota", "Honda"],
             ["2017", 10, 11, 12, 13],
             ["2018", 20, 11, 14, 13],
             ["2019", 30, 15, 12, 13]
          ];
    3.3、调用Handsontable 绘制表格:

                var container = document.getElementById('lina_main');
                hot = new Handsontable(container, {
                    data: cell_data, //导入数据
                    rowHeaders: true,
                    colHeaders: function(index) {
                        return ++index;
                    },
                    autoColumnSize:false,
                    autoRowSize:false,//禁止行列自动计算距离
                    dropdownMenu: true,
                    manualRowResize: true,
                    manualColumnResize: true,//行列可拉缩
                    manualColumnMove: true,//可整行整列移动
                    manualRowMove: true,
                    mergeCells:true,//合并单元格
                    contextMenu: true,//使用菜单
                    colWidths: cell_width,//定义列宽度
                    rowHeights:cell_height ,//定义行高度
                    //水平:htLeft,htCenter,htRight,htJustify,
                    //垂直:htTop,htMiddle,htBottom。
                    //只读: readOnly htDimmed
                    cell:[ //设置单元格属性
                        {row: 1, col: 1, readOnly: true,className: 'htCenter htMiddle'},
                        {row: 2, col: 0, className: 'htCenter htMiddle'},
                    ],
                    mergeCells: [
                        {row: 1, col: 1, rowspan: 2, colspan: 2}
                    ],//设置单元格合并情况
                    afterRowResize: function(currentRow, newSize) { 
                        cell_height[currentRow] =  newSize; 
                        hot.updateSettings({ rowHeights: cell_height }); 
                    },//rowHeights为最小高度,为了设置比初始值更小的高度,编写此钩子
                });


    首先获取div容器,然后设置显示的参数,均有备注。需要注意以下参数:

    1、在使用manualRowResize和manualColumnResize手动拉伸行列的时候,最好关闭autoRowSize和autoColumnSize。

    2、cell参数可以单独设置某个单元格的格式,row和col表示单元格的行号列号(注意是从0开始),readOnly设置是否只读,className表示数据

    在单元格中的显示是上下居中,左右居中等显示格式。

    3、mergeCells参数表示合并单元格的情况,row和col表示单元格的行号和列号,rowspan和colspan表示跨域的行和列。

    4、rowHeights设置了行初始化高度,同时也是最小高度(这个比较坑)。故在afterRowResize,行高改变之后重新赋值行的高度。

    5、header表示头、true为默认的选项,即列号ABCD,如果想改为1、2、3或者其他,可以自定义函数。
    至此,一个可编辑的excel便展示出来了。

    展开全文
  • public class ImportException extends Exception{ public ImportException(int i, int j){ super("第"+(i+1)+"行第"+(j+1)+"列的数据不合法,请严格按照模板标明的数据格式进行输入!"); } ...
  • js web excel 0.57 + js vm

    热门讨论 2008-12-02 18:17:23
    修正了一些低级错误,增加了直接对日期计算.
  • java web Excel导入、导出的实现

    万次阅读 多人点赞 2015-11-02 21:54:57
    在做web开发时,我们经常会用到数据表格的导入导出功能,这样可以帮我们节省人工操作的时间,极大提高办事效率,下面,直入正题: 笔者所做的导入导出是针对java springMVC框架、工作簿poi以及前端plupload.js插件...

    在做web开发时,我们经常会用到数据表格的导入导出功能,这样可以帮我们节省人工操作的时间,极大提高办事效率,下面,直入正题:
    笔者所做的导入导出是针对java springMVC框架、工作簿poi以及前端plupload.js插件设计的。

    第一步、总体介绍

    首先,来看页面展示,如下图:
    这里写图片描述
    导入菜单包含模板下载和导入数据,如下图:
    这里写图片描述
    点击模板下载,弹出模板下载对话框,如下图:
    这里写图片描述
    点击导入数据,弹出导入对话框,如下图:
    这里写图片描述
    接下来,再来看看导出,包含导出当前页和导出全部,如下图:
    这里写图片描述
    点击导出当前页或是导出全部后,生成excel,如下图:
    这里写图片描述
    最后再来看看导入模板和生成的excel,如下图:
    这里写图片描述
    我的模板是放在src/main/webapp/template下的。

    第二步、模板下载和导入

    首先,来看看前台导入、导出的jsp代码:

    <!-- 导出,当前页和页大小隐藏域 -->
    <input type="hidden" name="currentPage" id="current" value="0"/>
    <input type="hidden" name="pageSize" id="size" value="0"/>
    ID:<input type="text" name="id" id="userId"/> 姓名:<input type="text" name="userName"/> <a href="javascript:void(0);" id="search">搜索</a>
    </form>
    </div>
    
    <!-- 导入 -->
    <a 
    type="import" 
    id="import" 
    class="easyui-menubutton" 
    suffix="xls"
    resouseCode="user" 
    importurl="sys/user/importData.do"
    callback="myCallback">导入</a>
    <!-- 导出 -->
    <a type="export" id="export" class="easyui-menubutton">导出</a>

    然后,再来看看js:

    $(function() {
      var uploadsubmenu = '<div id="upload_sub" style="width:100px;">'+
      '<div id="download_templ"><span class="exportDownload"></span>模板下载</div>'+
      '<h1 class="excel-line" id="line1"></h1>'+
      '<div id="import_data"><span class="exportData"></span>导入数据</div>'+
      '</div>';
      if($("#upload_sub").length<1){
        $("body").append(uploadsubmenu);
      }
    
      //将导入设为菜单按钮
      var importMenu = $('#import').menubutton({ 
        menu: "#upload_sub",
        iconCls:"icon-import"
      }); 
    
      //为子菜单添加点击事件
      $(importMenu.menubutton('options').menu).menu({
        onClick: function (item) {
          if(item.id == 'download_templ'){
            var resouseCode = $('#import').attr('resouseCode');
            var suffix = $('#import').attr('suffix');
            loadTemplate(resouseCode, suffix);
          }
          if(item.id == 'import_data'){
            var importurl = $('#import').attr('importurl');
            var callback = $('#import').attr('callback');
            var resouseCode = $('#import').attr('resouseCode');
            makerUpload(importurl, callback, resouseCode);
          }
        }
    });
    });
    
    /**
     * 模板下载
     */
    function loadTemplate(resouseCode, suffix) {
      //文件名+后缀名
      var fileName = resouseCode + '.' + suffix
    
      var templatediv = '<div id="templatediv" style="width:400px;height:200px;">'+
      '</div>';
      if (window.top.$('#templatediv').length == 0) {
        window.top.$("body").append(templatediv);
      }
      var templistspan = "";
      templistspan +='<div class="download-list">'
      templistspan += '<span><a id="downloadBtn" href="file/fileHandle/downloadtemplate.do?fileName='+encodeURI(encodeURI( fileName))+'">'+fileName+'</a></span>'
      templistspan +='</div>';
      window.top.$("#templatediv").html(templistspan);
      //弹出下载模板
      window.top.$("#templatediv").dialog({
        title:"下载模板",
        modal:true  
      });
    
      //下载模板完了就关闭对话框
      window.top.$("#downloadBtn").click(function() {
        window.top.$("#templatediv").dialog('close');
      });
    }
    
    /**
     * 上传导入
     */
    function makerUpload(importurl, callback, resouseCode) {
      console.log('弹出导入对话框。。');
    
      //用户详情对话框
      var importWindow = window.top.$('#importWin');
      if(importWindow.length <= 0) {
        importWindow = window.top.$("<div id='importWin'/>").appendTo(window.top.document.body);
      }
      importWindow.window({
        title:'导入',
        closed: false,
        closable: true,
        draggable: true,
        resizable: true,
        width: 500,
        height: 350,
        modal: true,
        href: 'sys/redirect/redirectHomePage.do?path=import&callback=' + callback + '&resouseCode=' + resouseCode + '&importurl=' + importurl,
        onClose: function() {
          importWindow.window("destroy");
        }
      });
    }

    然后,再来看看导出对话框对应的jsp页面import.jsp:

    <%@ page language="java" contentType="text/html; charset=UTF-8"
        pageEncoding="UTF-8"%>
    <%
      String callback = request.getParameter("callback");
      String importurl = request.getParameter("importurl");
      String resouseCode = request.getParameter("resouseCode");
      System.out.println("callback:" + callback);
      System.out.println("importurl:" + importurl);
      System.out.println("resouseCode:" + resouseCode);
    %>
    <link rel="stylesheet" href="js/plugs/plupload/queue/css/jquery.plupload.queue.css" type="text/css"></link>
    <script type="text/javascript" src="js/plugs/plupload/plupload.js"></script>
    <script type="text/javascript" src="js/plugs/plupload/plupload.html4.js"></script>
    <script type="text/javascript" src="js/plugs/plupload/plupload.html5.js"></script>
    <script type="text/javascript" src="js/plugs/plupload/plupload.flash.js"></script>
    <script type="text/javascript" src="js/plugs/plupload/zh_CN.js"></script>
    <script type="text/javascript" src="js/plugs/plupload/queue/jquery.plupload.queue.js"></script>
    <script type="text/javascript">
    var callback = '<%=callback%>';
    var resouseCode = '<%=resouseCode%>';
    var importurl = '<%=importurl%>';
    console.log('callback:', callback);
    console.log('resouseCode:', resouseCode);
    console.log('importurl:', importurl);
    </script>
    <!-- <div style="width:100%;height:100%;position:relative;">
        <button id="startImport" style="position:relative;top:224px;left:50px;height:20px;">开始导入</button>
    </div> -->
    
    <form id="form">
    <div id="uploader">
    </div>
    </form>
    
    <script type="text/javascript" src="resources/logicJS/common/common.js"></script>
    <script type="text/javascript" src="resources/logicJS/common/import.js"></script>
    

    再来看看其对应的import.js:

    /*$(function() {
      console.log('windows是否一致', window === window.top);
      $('#startImport').click(function() {
        console.log('开始导入');
    
        var iframe = $('#mainPanel > iframe' ,window.top.document)[0];
        var currentChildWindow = iframe.contentWindow || iframe.window;
        console.log('callback', callback);
        currentChildWindow[callback]('qiyongkang');
      });
    });*/
    
    $(function() {
      var files = [];
      var errors = [];
      var type = 'file';
      var chunk = true;
      var startbutton = null;
      var des = "<div class='upload-sm'>";
      des += "单个文件最大不超过1mb; &nbsp;&nbsp;";
      des += "批量上传文件个数不超过1个; &nbsp;&nbsp;";
      des += "上传文件格式为:xls";
      des += "</div>";
    
      $("#uploader").pluploadQueue($.extend({
        runtimes : 'flash,html4,html5',
        url : 'file/fileHandle/upload.do?resouseCode=' + resouseCode,
        max_file_size : '1mb',
        file_data_name:'file',
        filters : [],
        dragdrop : false,
        flash_swf_url : 'js/plugs/plupload/plupload.flash.swf',
        init:{
          Init:function(uploader){
            //开始上传按钮
            startbutton = $(".plupload_start");
            $(".plupload_header").html(des);
          },
          QueueChanged:function(uploader){
            if(uploader.files.length > 1){
              var error = "<div class='upload-sm'>";
              error += "<font color=red>最多只能上传1个</font>";
              error += "</div>";
              $(".plupload_header").html(error);
              startbutton.hide();
            }else{
              $(".plupload_header").html(des);
              startbutton.show();
            }
          },
          FileUploaded:function(uploader,file,response){
            if(response.response){
              var rs = $.parseJSON(response.response);
              console.log(rs);
              if(rs.status){
                files.push(file.name);
              }else{
                errors.push(file.name);
              }
            }
          },
          UploadProgress:function(uploader,fs){
            var begin = "<div class='upload-sm'>";
            begin +="开始上传文件<img src='js/plugs/plupload/queue/img/uploading.gif'>";
            begin +="</div>";
            $(".plupload_header").html(begin);
          },
          //上传完毕后触发
          UploadComplete:function(uploader,fs){
            var e= errors.length ? ",失败"+errors.length+"个("+errors.join("、")+")。" : "。";
            var begin = "<div class='upload-sm'>";
            var value=parseInt(fs.length)-parseInt(errors.length);
            begin +="上传完成!共"+fs.length+"个。成功"+value+"个";
            begin +="</div>";
            $(".plupload_header").html(begin);
              importdata(importurl,callback);
          }
        }
      },(chunk ? {chunk_size:'1mb'} : {})));
    
    });
    
    /**
     * 导入数据
     * @param importurl
     * @param callback
     */
    function importdata(importurl,callback){
      var des = "<div class='upload-sm'>";
      des +="正在解析入库<img src='js/plugs/plupload/queue/img/uploading.gif'>";
      des +="</div>";
      $(".plupload_header").html(des);
    
      $.ajax({
        url:importurl,
        type:"POST",
        dataType: "json",
        success: function (data) {
          var msg = "<div class='upload-sm'>";
          msg +=data.msg;
          msg +="</div>";
          $(".plupload_header").html(msg);
    
          //回调,重新加载数据
          var iframe = $('#mainPanel > iframe' ,window.top.document)[0];
          var currentChildWindow = iframe.contentWindow || iframe.window;
          console.log('callback', callback);
          currentChildWindow[callback]('qiyongkang');
        }
      });
    }

    其中的chunk的含义,笔者稍作解释,如果文件的大小超过chunk_size,那么此文件将分多次请求上传,待会儿就可以看到后台处理上传的请求逻辑。

    第三步、导出当前页和导出全部

    对应的jsp代码已在第二步给出,再来看导出对应的js:

    /**
     * 初始化导出按钮
     */
    function initMyExportMenu(){
      var exportsubmenu = '<div id="exportMenu_sub">'+
      '<div id="export_crrent"><span class="exportcurrent"></span>导出当前页</div>'+
      '<h1 class="excel-line"></h1>'+
      '<div id="export_all"><span class="exportall"></span>导出全部</div>'+
      '</div>';
      $("body").append(exportsubmenu);
      var exports = $("a[type='export']");
      $.each(exports,function(data){
    
        var exportMenu = $(this).menubutton({ 
          menu: "#exportMenu_sub",
          iconCls:"icon-export"
    
        }); 
        $(exportMenu.menubutton('options').menu).menu({
          onHide:function(){
          },
          onClick: function (item) {
          if(item.id=="export_crrent"){
            console.log('导出当前页');
            var options = $('#userListTab').datagrid('getPager').data("pagination").options;
            var curr = options.pageNumber;
            console.log('当前页:', curr);
            var pageSize = options.pageSize;
            console.log('页大小', pageSize);
    
            //通过隐藏域传参数
            $('#current').val(curr);
            $('#size').val(pageSize);
    
            $("#queryForm").form('submit',{
                  url : 'sys/user/exportData.do',
                  onSubmit : function() {
                    return $(this).form('validate');
                  },
                  success : function(data) {
                  }
             });
    
          }
          if(item.id=="export_all"){
            //通过隐藏域传参数
            $('#current').val(0);
            $('#size').val(0);
    
            console.log('导出全部');
            $("#queryForm").form('submit',{
              url : 'sys/user/exportData.do',
              onSubmit : function() {
                return $(this).form('validate');
              },
              success : function(data) {
                console.log('data', data);
              }
             });
    
          }
    
          }
        });
    
      });
    }
    
    /**
     * 回调函数
     * @returns
     */
    function myCallback(name) {
      console.log('回调函数执行。。' + name);
      //重新加载datagrid
      $("#userListTab").datagrid('reload'); 
    }

    上面的回调函数是用于导入成功后重新加载datagrid。

    第四步、导入导出的后台处理逻辑

    首先,来看看UserController.java对应的代码:

    /**
         * 
         * importTeleFraudEvent:导入数据. <br/>
         *
         * @author qiyongkang
         * @param request
         * @return
         * @since JDK 1.6
         */
        @RequestMapping
        @ResponseBody
        public ExtJsObject importData(HttpServletRequest request) {
            ExtJsObject result = new ExtJsObject(false, "导入不成功", null);
            try {
                String path = request.getSession().getAttribute("justpath").toString();
                File f = new File(path);
                FileInputStream fis = new FileInputStream(f);
                HSSFWorkbook book = new HSSFWorkbook(fis);
                result = userService.importData(book);
            } catch (Exception e) {
                e.printStackTrace();
                return renderObject(false, "导入不成功", null);
            }
            return result;
        }
    
        @RequestMapping
        @ResponseBody
        public ExtJsObject exportData(User user, HttpServletRequest request,
                HttpServletResponse response) {
            List<User> userList = null;
            try {
                if (user.getCurrentPage() != null && !user.getCurrentPage().equals(0)) {
                    // 导出当前页
                    userList = userService.getPageList(user);
                } else {
                    // 导出所有
                    userList = userService.listAll(user);
                }
    
                if (userList != null && userList.size() > 0) {
                    // 开始导出,获取模板路径
                    String templatePath = request.getSession().getServletContext().getRealPath("template/user.xls");
    
                    // 写入工作簿
                    userService.exportData(userList, templatePath, response);
                }
            } catch (Exception e) {
                log.error("导出失败", e);
                return new ExtJsObject(false, "导出失败", null);
            }
            return new ExtJsObject(true, "导出成功", null);
        }

    以及对应的service实现:

    @Override
        public ExtJsObject importData(HSSFWorkbook workBook) {
            HSSFSheet sheet = workBook.getSheetAt(0);
            int startReadRow = 2;
            int lastRowNum = sheet.getLastRowNum();
            for(int i = startReadRow; i <= lastRowNum; i++) {
                try {
                    User entity = new User();
    
                    HSSFRow row = sheet.getRow(i);
    
                    //用户编号
                    long id = Long.valueOf(ExcelUtil.getCellValue(row.getCell(0)));
                    entity.setId(id);
    
                    //用户姓名
                    String userName = ExcelUtil.getCellValue(row.getCell(1));
                    entity.setUserName(userName);
    
                    //年龄
                    int age = Integer.valueOf(ExcelUtil.getCellValue(row.getCell(2)));
                    entity.setAge(age);
    
                    userMapper.addUser(entity);
                } catch (Exception e) {
                    e.printStackTrace();
                    return new ExtJsObject(true, "导入失败", null);
                }
            }
            return new ExtJsObject(true, "导入成功", null);
        }
    
        @Override
        public List<User> getPageList(User user) {
            return userMapper.listUser(user);
        }
    
        @Override
        public void exportData(List<User> userList, String templatePath, HttpServletResponse response) throws Exception {
            //获取文件输入流,创建工作簿
            FileInputStream fis = new FileInputStream(new File(templatePath));
            HSSFWorkbook workBook = new HSSFWorkbook(fis);
    
            //设置导出文件名,并编码
            String fileName = "用户信息导出_" + System.currentTimeMillis()+".xls";
            fileName = URLEncoder.encode(fileName, "UTF-8");  
            response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\"");
            response.setContentType("application/octet-stream;charset=UTF-8"); 
    
            //创建输出流
            OutputStream outputStream = new BufferedOutputStream(response.getOutputStream());
    
            exportUserData(workBook, userList);
    
            //删除模板页
            workBook.removeSheetAt(0);
    
            //将工作簿写入输出流
            workBook.write(outputStream);
    
            //关闭资源流
            fis.close();
            outputStream.flush();  
            outputStream.close();
        }
    
        /**
         * 
         * exportUserData:将数据写入工作簿. <br/>
         *
         * @author qiyongkang
         * @param workBook
         * @param userList
         * @since JDK 1.6
         */
        private void exportUserData(HSSFWorkbook workBook, List<User> userList) {
            //克隆模板sheet
            HSSFSheet singleSheet = workBook.cloneSheet(0);
    
            //设置克隆的sheet名称
            workBook.setSheetName(1, "用户信息表");
    
            //获取cellStyle
            HSSFCellStyle style = ExcelUtil.getStyle(workBook); 
    
            //定义起始行,从第二行开始
            int singleRowIndex = 2;
    
            //开始遍历
            for (User user : userList) {
                try {
                    //起始列索引
                    int singleColIndex=0;
    
                    //创建行
                    HSSFRow singleRow = singleSheet.createRow(singleRowIndex++);
    
                    //创建列
                    HSSFCell singleCell = null;
    
                    //用户编号,0
                    singleCell=singleRow.createCell(singleColIndex++);
                    singleCell.setCellValue(user.getId());
                    singleCell.setCellStyle(style);
    
                    //用户姓名,1
                    singleCell=singleRow.createCell(singleColIndex++);
                    singleCell.setCellValue(user.getUserName());
                    singleCell.setCellStyle(style);
    
                    //用户年龄,2
                    singleCell=singleRow.createCell(singleColIndex++);
                    singleCell.setCellValue(user.getAge());
                    singleCell.setCellStyle(style);
                } catch (Exception e) {
                    e.printStackTrace();
                    continue;
                }
            }
        }
    
        @Override
        public List<User> listAll(User user) {
            return userMapper.listAll(user);
        }

    再来看看模板下载以及文件上传的处理类FileHandleCtrl.java:

    /**
     * Project Name:qyk_testSpringMVC
     * File Name:FileHandleCtrl.java
     * Package Name:com.qiyongkang.file.ctrl
     * Date:2015年11月1日下午3:01:05
     * Copyright (c) 2015, CANNIKIN(http://http://code.taobao.org/p/cannikin/src/) All Rights Reserved.
     *
    */
    
    package com.qiyongkang.file.ctrl;
    
    import java.io.BufferedInputStream;
    import java.io.BufferedOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.net.URLDecoder;
    import java.util.Iterator;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.apache.commons.fileupload.servlet.ServletFileUpload;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.multipart.MultipartFile;
    import org.springframework.web.multipart.MultipartHttpServletRequest;
    
    import com.qiyongkang.file.util.FileUtil;
    import com.qiyongkang.sys.controller.BaseController;
    
    /**
     * ClassName:FileHandleCtrl <br/>
     * Function: TODO ADD FUNCTION. <br/>
     * Reason:   TODO ADD REASON. <br/>
     * Date:     2015年11月1日 下午3:01:05 <br/>
     * @author   qiyongkang
     * @version  
     * @since    JDK 1.6
     * @see      
     */
    @Controller
    @RequestMapping
    public class FileHandleCtrl extends BaseController {
    
        /**
         * 
         * downloadtemplate:下载模板. <br/>
         *
         * @author qiyongkang
         * @param request
         * @param response
         * @throws IOException
         * @since JDK 1.6
         */
        @RequestMapping
        public void downloadtemplate(HttpServletRequest request, HttpServletResponse response) throws IOException {
            response.setContentType("text/html;charset=utf-8");
            request.setCharacterEncoding("UTF-8");
            BufferedInputStream bis = null;
            BufferedOutputStream bos = null;
    
            //获取template的目录路径
            String templatePath = request.getSession().getServletContext().getRealPath("template");
            System.out.println("templatePath:" + templatePath);
    
            String downLoadPath  = templatePath + File.separator + URLDecoder.decode(new String(request.getParameter("fileName")), "UTF-8");
    
            if("/".equals(File.separator)){
                downLoadPath = downLoadPath.replace("\\", "/");
            }
            try {
                File file = new File(downLoadPath);
                long fileLength = file.length();
                response.setContentType("application/x-msdownload;");
                response.setHeader("Content-disposition", "attachment; filename="+new String(file.getName().getBytes("UTF-8"), "ISO8859-1" ));
                response.setHeader("Content-Length", String.valueOf(fileLength));
                bis = new BufferedInputStream(new FileInputStream(downLoadPath));  
                bos = new BufferedOutputStream(response.getOutputStream());
                byte[] buff = new byte[2048];
                int bytesRead;
                while (-1 != (bytesRead = bis.read(buff, 0, buff.length))){
                    bos.write(buff, 0, bytesRead);
                }
            } catch (Exception e){
                e.printStackTrace();
            } finally {
                if(bis != null){
                  bis.close();
                }
                if(bos != null){
                  bos.close();
                }
            }
        }
    
        /**
         * 
         * upload:文件上传. <br/>
         *
         * @author qiyongkang
         * @param request
         * @param response
         * @since JDK 1.6
         */
        @RequestMapping
        public void upload(HttpServletRequest request, HttpServletResponse response) {
            String justpath = "";
            String savePath = FileUtil.getResouseValue("uploadpath");
            String filename = null;
            // 当前正在处理的文件分块序号
            int chunk = Integer.valueOf(request.getParameter("chunk"));
            // 分块上传总数
            int chunks = Integer.valueOf(request.getParameter("chunks"));
            //文件名
            String resouseCode = request.getParameter("resouseCode");
    
            // 判断当前表单是否为"multipart/form-data"
            boolean isMultipart = ServletFileUpload.isMultipartContent(request);
            try {
                if (isMultipart) {
                    MultipartHttpServletRequest multiReq = (MultipartHttpServletRequest) request;
                    Iterator<?> i = multiReq.getFileNames();
                    while (i.hasNext()) {
                        multiReq.getAttribute("chunk");
                        MultipartFile f = multiReq.getFile((String) i.next());
                        InputStream input = f.getInputStream();
    
                        // 文件名
                        filename = f.getOriginalFilename();
                        if (!FileUtil.savedFileNameCache.containsKey(filename)) {
                            FileUtil.savedFileNameCache.put(filename,
                                    FileUtil.getSavedFileName(filename));
                        }
                        // 保存文件目录绝对路径
                        File dir = new File(savePath+"/"+resouseCode);
                        if (!dir.isDirectory() || !dir.exists()) {
                            dir.mkdirs();
                        }
                        // 保存文件绝对路径
                        justpath = dir + "/"+ FileUtil.savedFileNameCache.get(filename);
                        if (chunk == 0) {
                            File file = new File(justpath);
                            if (file.exists()) {
                                file.delete();
                            }
                            // 上传文件
                            FileUtil.uploadFile(input, justpath);
                        }
                        if (chunk > 0) {
                            // 追加文件
                            FileUtil.uploadFile(input, justpath, true);
                        }
                        if (chunk + 1 == chunks || chunks == 0) {
                            FileUtil.savedFileNameCache.remove(filename);
                            break;
                        }
                    }
    
    
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            request.getSession().setAttribute("justpath", justpath);
        }
    }
    
    

    第五步、总结

    其实,导入导出的核心逻辑就是首先上传文件,然后再对文件进行读写,而与excel操作相关的类就是工作簿类了。
    以上的导入导出,笔者讲得很概括,只是贴出了代码,具体的含义还得大家去领悟,由于不同的框架所使用的导入导出有可能不一致,不过大体的思路应该是一致的,有兴趣的小伙伴可以自己去尝试下,挺有意思的!

    展开全文
  • 发布的源码没做太多修饰和说明文档,大家看看就好,年后工作也有点忙,抽出了点时间实现了部分公式的计算,遇到了不少web端焦点的问题,比较头疼,excel本身的功能和细节实在太多了,本人对excel的使用本身就和小白...
  • 开发四年只会写业务代码,分布式高并发都不会还做程序员? >>> x-spreadsheet 是一个在...
  • web table 转 excel

    2017-06-01 09:35:53
    web table 转 excel
  • web 导出EXCEL

    2013-04-13 10:21:59
    WEB导出EXCEL,导出速度快,可以自动分页,解决了数据超出60000多行,后页的数据无法显示问题
  • WEB 导出EXCEL

    2013-09-03 21:49:51
    支持各类web开发程序的EXCEL导出。
  • 实现从服务器端,下载到客户端上的web excel案例 用poi三方包进行excel的写出

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,522
精华内容 41,808
关键字:

webexcel