zoukankan      html  css  js  c++  java
  • JQuery 导入导出 Excel

    正在做一个小项目, 从数据库中查询数据放在 HTML Table 中. 现在想要从这个 table 中导出数据来. 另外用户需要选择导出的列. 使用 jQuery 的导出插件可以完成这个需求. 

     jQuery Plugin to Export HTML Tables

    例子: 

    导入插件: 

    [javascript] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <script src="jquery-tableexport/tableExport.js"></script>  
    2. <script src="jquery-tableexport/jquery.base64.js"></script>  

    html: 

    <a href="#" onClick ="$('#table-name').tableExport({type:'excel', separator:';', escape:'false'});" id="buttonExportData" class="ui-btn ui-btn-inline ui-mini ui-shadow ui-corner-all">Export XLS</a>

    插件还有以下这些参数选项: 

    separator: ','
    ignoreColumn: [2,3],
    tableName:'yourTableName'
    type:'csv'
    pdfFontSize:14
    pdfLeftMargin:20
    escape:'true'
    htmlContent:'false'
    consoleLog:'false'

    通过 ignoreColumn 可以指定哪几列不被导出. 

    JS-XLSX

    导入 excel 2007 以上版本, 可以使用 JS-XLSX 插件. 首先导入 js 包:

    [javascript] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. <!-- https://github.com/SheetJS/js-xlsx/blob/master/jszip.js -->  
    2. <script src="/path/to/jszip.js"></script>  
    3. <!-- https://github.com/SheetJS/js-xlsx/blob/master/xlsx.js -->  
    4. <script src="/path/to/xlsx.js"></script>  


    Node.js 安装:

    $ npminstall xlsx
    $ node
    > require('xlsx').readFile('excel_file.xlsx');

    然后可以使用这个插件把 XLSX 文件转为 JSON, CSV, Formula 输出. 

    [javascript] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. function get_radio_value( radioName ) {  
    2.     var radios = document.getElementsByName( radioName );  
    3.     for( var i = 0; i < radios.length; i++ ) {  
    4.         if( radios[i].checked ) {  
    5.             return radios[i].value;  
    6.         }  
    7.     }  
    8. }  
    9.    
    10. function to_json(workbook) {  
    11.     var result = {};  
    12.     workbook.SheetNames.forEach(function(sheetName) {  
    13.         var roa = XLSX.utils.sheet_to_row_object_array(workbook.Sheets[sheetName]);  
    14.         if(roa.length > 0){  
    15.             result[sheetName] = roa;  
    16.         }  
    17.     });  
    18.     return result;  
    19. }  
    20.    
    21. function to_csv(workbook) {  
    22.     var result = [];  
    23.     workbook.SheetNames.forEach(function(sheetName) {  
    24.         var csv = XLSX.utils.sheet_to_csv(workbook.Sheets[sheetName]);  
    25.         if(csv.length > 0){  
    26.             result.push("SHEET: " + sheetName);  
    27.             result.push("");  
    28.             result.push(csv);  
    29.         }  
    30.     });  
    31.     return result.join(" ");  
    32. }  
    33.    
    34. function to_formulae(workbook) {  
    35.     var result = [];  
    36.     workbook.SheetNames.forEach(function(sheetName) {  
    37.         var formulae = XLSX.utils.get_formulae(workbook.Sheets[sheetName]);  
    38.         if(formulae.length > 0){  
    39.             result.push("SHEET: " + sheetName);  
    40.             result.push("");  
    41.             result.push(formulae.join(" "));  
    42.         }  
    43.     });  
    44.     return result.join(" ");  
    45. }  
    46.    
    47. var tarea = document.getElementById('b64data');  
    48. function b64it() {  
    49.     var wb = XLSX.read(tarea.value, {type: 'base64'});  
    50.     process_wb(wb);  
    51. }  
    52.    
    53. function process_wb(wb) {  
    54.     var output = "";  
    55.     switch(get_radio_value("format")) {  
    56.         case "json":  
    57.         output = JSON.stringify(to_json(wb), 2, 2);  
    58.             break;  
    59.         case "form":  
    60.             output = to_formulae(wb);  
    61.             break;   
    62.         default:  
    63.         output = to_csv(wb);  
    64.     }  
    65.     if(out.innerText === undefined) out.textContent = output;  
    66.     else out.innerText = output;  
    67. }  
    68.    
    69. var drop = document.getElementById('drop');  
    70. function handleDrop(e) {  
    71.     e.stopPropagation();  
    72.     e.preventDefault();  
    73.     var files = e.dataTransfer.files;  
    74.     var i,f;  
    75.     for (i = 0, f = files[i]; i != files.length; ++i) {  
    76.         var reader = new FileReader();  
    77.         var name = f.name;  
    78.         reader.onload = function(e) {  
    79.             var data = e.target.result;  
    80.             //var wb = XLSX.read(data, {type: 'binary'});  
    81.             var arr = String.fromCharCode.apply(null, new Uint8Array(data));  
    82.             var wb = XLSX.read(btoa(arr), {type: 'base64'});  
    83.             process_wb(wb);  
    84.         };  
    85.         //reader.readAsBinaryString(f);  
    86.         reader.readAsArrayBuffer(f);  
    87.     }  
    88. }  
    89.    
    90. function handleDragover(e) {  
    91.     e.stopPropagation();  
    92.     e.preventDefault();  
    93.     e.dataTransfer.dropEffect = 'copy';  
    94. }  
    95.    
    96. if(drop.addEventListener) {  
    97.     drop.addEventListener('dragenter', handleDragover, false);  
    98.     drop.addEventListener('dragover', handleDragover, false);  
    99.     drop.addEventListener('drop', handleDrop, false);  
    100. }  

    插件作者地址: author

    不使用 HTML5 的话, 就要上传文件到服务器端, 服务器再来解析处理文件.例子如下:

    [html] view plain copy
     
     在CODE上查看代码片派生到我的代码片
    1. @using (Html.BeginForm("Index", "Home", FormMethod.Post, new { enctype = "multipart/form-data" }))  
    2. {  
    3.     <input type="file" name="file" />  
    4.     <input type="submit" value="OK" />  
    5. }  
    public class HomeController : Controller
    {
        // This action renders the form
        public ActionResult Index()
        {
            return View();
        }
    
        // This action handles the form POST and the upload
        [HttpPost]
        public ActionResult Index(HttpPostedFileBase file)
        {
            // Verify that the user selected a file
            if (file != null && file.ContentLength > 0) 
            {
                // extract only the fielname
                var fileName = Path.GetFileName(file.FileName);
                // store the file inside ~/App_Data/uploads folder
                var path = Path.Combine(Server.MapPath("~/App_Data/uploads"), fileName);
                file.SaveAs(path);
            }
            // redirect back to the index action to show the form once again
            return RedirectToAction("Index");        
        }
    }

    深圳一朋友说使用jquery.base64.js时发现对于中文直接抛出异常,作者压根不处理汉字的情况,因此

    对其进行修正,关键函数为:

    jQuery.base64 = (function ($) {

    var _PADCHAR = "=",
    _ALPHA = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
    _VERSION = "1.1"; //Mr. Ruan fix to 1.1 to support asian char(utf8)


    function _getbyte64(s, i) {
    // This is oddly fast, except on Chrome/V8.
    // Minimal or no improvement in performance by using a
    // object with properties mapping chars to value (eg. 'A': 0)

    var idx = _ALPHA.indexOf(s.charAt(i));

    if (idx === -1) {
    throw "Cannot decode base64";
    }

    return idx;
    }

    function _decode_chars(y, x) {
    while (y.length > 0) {
    var ch = y[0];
    if (ch < 0x80) {
    y.shift();
    x.push(String.fromCharCode(ch));
    } else if ((ch & 0x80) == 0xc0) {
    if (y.length < 2) break;
    ch = y.shift();
    var ch1 = y.shift();
    x.push(String.fromCharCode(((ch & 0x1f) << 6) + (ch1 & 0x3f)));
    } else {
    if (y.length < 3) break;
    ch = y.shift();
    var ch1 = y.shift();
    var ch2 = y.shift();
    x.push(String.fromCharCode(((ch & 0x0f) << 12) + ((ch1 & 0x3f) << 6) + (ch2 & 0x3f)));
    }
    }
    }

    function _decode(s) {
    var pads = 0,
    i,
    b10,
    imax = s.length,
    x = [],
    y = [];

    s = String(s);

    if (imax === 0) {
    return s;
    }

    if (imax % 4 !== 0) {
    throw "Cannot decode base64";
    }

    if (s.charAt(imax - 1) === _PADCHAR) {
    pads = 1;

    if (s.charAt(imax - 2) === _PADCHAR) {
    pads = 2;
    }

    // either way, we want to ignore this last block
    imax -= 4;
    }

    for (i = 0; i < imax; i += 4) {
    var ch1 = _getbyte64(s, i);
    var ch2 = _getbyte64(s, i + 1);
    var ch3 = _getbyte64(s, i + 2);
    var ch4 = _getbyte64(s, i + 3);

    b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6) | _getbyte64(s, i + 3);
    y.push(b10 >> 16);
    y.push((b10 >> 8) & 0xff);
    y.push(b10 & 0xff);
    _decode_chars(y, x);
    }
    switch (pads) {
    case 1:
    b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12) | (_getbyte64(s, i + 2) << 6);
    y.push(b10 >> 16);
    y.push((b10 >> 8) & 0xff);
    break;

    case 2:
    b10 = (_getbyte64(s, i) << 18) | (_getbyte64(s, i + 1) << 12);
    y.push(b10 >> 16);
    break;
    }
    _decode_chars(y, x);
    if (y.length > 0) throw "Cannot decode base64";
    return x.join("");
    }


    function _get_chars(ch, y) {
    if (ch < 0x80) y.push(ch);
    else if (ch < 0x800) {
    y.push(0xc0 + ((ch >> 6) & 0x1f));
    y.push(0x80 + (ch & 0x3f));
    } else {
    y.push(0xe0 + ((ch >> 12) & 0xf));
    y.push(0x80 + ((ch >> 6) & 0x3f));
    y.push(0x80 + (ch & 0x3f));
    }
    }

    function _encode(s) {
    if (arguments.length !== 1) {
    throw "SyntaxError: exactly one argument required";
    }

    s = String(s);
    if (s.length === 0) {
    return s;
    }

    //s = _encode_utf8(s);
    var i,
    b10,
    y = [],
    x = [],
    len = s.length;
    i = 0;
    while (i < len) {
    _get_chars(s.charCodeAt(i), y);
    while (y.length >= 3) {
    var ch1 = y.shift();
    var ch2 = y.shift();
    var ch3 = y.shift();
    b10 = (ch1 << 16) | (ch2 << 8) | ch3;
    x.push(_ALPHA.charAt(b10 >> 18));
    x.push(_ALPHA.charAt((b10 >> 12) & 0x3F));
    x.push(_ALPHA.charAt((b10 >> 6) & 0x3f));
    x.push(_ALPHA.charAt(b10 & 0x3f));
    }
    i++;
    }


    switch (y.length) {
    case 1:
    var ch = y.shift();
    b10 = ch << 16;
    x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _PADCHAR + _PADCHAR);
    break;

    case 2:
    var ch1 = y.shift();
    var ch2 = y.shift();
    b10 = (ch1 << 16) | (ch2 << 8);
    x.push(_ALPHA.charAt(b10 >> 18) + _ALPHA.charAt((b10 >> 12) & 0x3F) + _ALPHA.charAt((b10 >> 6) & 0x3f) + _PADCHAR);
    break;
    }

    return x.join("");
    }


    return {
    decode: _decode,
    encode: _encode,
    VERSION: _VERSION
    };

    } (jQuery));

  • 相关阅读:
    解决:RuntimeError: invalid argument 0: Sizes of tensors must match except in dimension 0. Got 544 and 1935 in dimension 2 at ../aten/src/TH/generic/THTensor.cpp:711
    ubuntu16.04 notebook中(在anaconda的虚拟环境) 无法使用 anaconda的库
    多版本pip 指定下载
    Jmeter 使用-JDBC请求
    java基础函数
    Linux下安装bugfree
    linux下安装xampp
    Linux 常用命令
    Linux scp命令
    性能测试工具-Ngrinder使用之IDEA脚本开发环境配置
  • 原文地址:https://www.cnblogs.com/Alex80/p/6371750.html
Copyright © 2011-2022 走看看