2011-06-17 66 views
7

從JSP頁面,我需要瀏覽excel文件,並在系統上選擇文件後,我需要閱讀該excel文件內容並填寫我的表單。如何讀取客戶端上的excel文件內容?

目前我已經嘗試使用下面的代碼,但它只能在IE中使用IE對ActiveX對象的Internet選項進行一些更改。它不適用於瀏覽器的其餘部分。

<script> 
    function mytest2() { 
     var Excel; 
     Excel = new ActiveXObject("Excel.Application"); 
     Excel.Visible = false; 
     form1.my_textarea2.value = Excel.Workbooks.Open("C:/Documents and Settings/isadmin/Desktop/test.xlsx").ActiveSheet.Cells(1,1).Value; 
     Excel.Quit(); 
    } 
</script> 

請建議一些解決方案,以便它可以在所有瀏覽器中使用。

回答

0

通常不可能在瀏覽器中通過JavaScript讀/寫任何文件。因此,如果沒有任何額外的插件,您將無法從瀏覽器讀取/寫入Excel文件。 Excel的ActiveX對象可以讓你做到這一點,但只有IE支持ActiveX對象。

可能有其他瀏覽器的插件,但我知道沒有。

首先,你爲什麼要這麼做?你能提供一個用例嗎?也許有比你想要的更好的選擇。

UPDATE

你將不得不通過的Excel文件服務器和做Excel在服務器端讀取(在例如一個servlet)。

你將不得不在JSP中的多形式
<form name="myForm" action="myServlet" enctype="multipart/form-data" method="post">

在服務器端內使用<input type='file'>,您可能需要使用Apache Commons File Upload

一旦你的文件(或在其上的流)可以使用,比如說,Apache POI HSSF/XSSF解析文件,然後更新的數據到數據庫或將其返回到JSP

+0

項目需求 - 用戶必須選擇Excel他的系統從JSP頁面文件,然後自動將所有表單字段應該填充。請建議我如何做到這一點? – Jyoti 2011-06-17 08:19:05

+0

@Jyoti我已經更新了答案 – Nivas 2011-06-17 10:00:05

+0

「在瀏覽器中通常不可能通過JavaScript讀/寫任何文件。」所以這是可能的,但插件是最好的選擇?但是,你可以做任何你喜歡的事情,並且不會因爲使用服務來做這些骯髒的工作而陷入困境?雖然xlsx.js確實可以用可怕的DX完成它,但可以通過大量研究來完成。我見過它的許多例子。 – Urasquirrel 2016-05-13 03:30:17

1

我做這一切的時間 - 我的原型旨在讓利益相關者修改一個excel並讓它填充html原型,通常不需要服務器。

  1. 通過AJAX保存Excel作爲XML
  2. 加載XML和解析出結構

()這裏有一個方便的按鈕微距我把我的Excel文件,允許無痛儲蓄如XML(和重新保存爲XLS):

Sub SaveAndExportXML() 
     Dim fname As String 
     Dim fnamexml As String 
     fname = ThisWorkbook.FullName 
     fnamexml = Replace(fname, ".xls", ".xml", 1, 1, vbTextCompare) 

     If MsgBox("Will save the following (runtime XML and source XLS) files: " & vbNewLine & "XML: " & fnamexml & vbNewLine & "Src: " & fname & vbNewLine & vbNewLine & "Ok? If so, please click Yes here and on the next 3 prompts...", vbYesNo) = vbNo Then Exit Sub 
     ActiveWorkbook.SaveAs Filename:=fnamexml, FileFormat:=xlXMLSpreadsheet, ReadOnlyRecommended:=False, CreateBackup:=False 
     're-save as xls: 
     ActiveWorkbook.SaveAs Filename:=fname, FileFormat:=xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False, CreateBackup:=False 
    End Sub 

()解析JS更complicat但前提是簡單的。將會有像Worksheet,Table,Row,Cell和Data這樣的XML對象。還有一個名爲ss的XML屬性:索引我有時會覺得很方便。

8

xlsx電子表格是一個帶有一堆xml文件的zip文件。使用類似zip.js的東西,您可以提取xml文件並在瀏覽器中解析它們。 xlsx.js這樣做。 Here's my simple example。複製在這裏爲了方便:

/* 
    Relies on jQuery, underscore.js, Async.js (https://github.com/caolan/async), and zip.js (http://gildas-lormeau.github.com/zip.js). 
    Tested only in Chrome on OS X. 

    Call xlsxParser.parse(file) where file is an instance of File. For example (untested): 

    document.ondrop = function(e) { 
     var file = e.dataTransfer.files[0]; 
     excelParser.parse(file).then(function(data) { 
      console.log(data); 
     }, function(err) { 
      console.log('error', err); 
     }); 
    } 
*/ 

xlsxParser = (function() { 
    function extractFiles(file) { 
     var deferred = $.Deferred(); 

     zip.createReader(new zip.BlobReader(file), function(reader) { 
      reader.getEntries(function(entries) { 
       async.reduce(entries, {}, function(memo, entry, done) { 
        var files = ['xl/worksheets/sheet1.xml', 'xl/sharedStrings.xml']; 
        if (files.indexOf(entry.filename) == -1) return done(null, memo); 

        entry.getData(new zip.TextWriter(), function(data) { 
         memo[entry.filename.split('/').pop()] = data; 
         done(null, memo); 
        }); 
       }, function(err, files) { 
        if (err) deferred.reject(err); 
        else deferred.resolve(files); 
       }); 
      }); 
     }, function(error) { deferred.reject(error); }); 

     return deferred.promise(); 
    } 

    function extractData(files) { 
     var sheet = $(files['sheet1.xml']), 
      strings = $(files['sharedStrings.xml']), 
      data = []; 

     var colToInt = function(col) { 
      var letters = ["", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"]; 
      var col = $.trim(col).split(''); 

      var n = 0; 

      for (var i = 0; i < col.length; i++) { 
       n *= 26; 
       n += letters.indexOf(col[i]); 
      } 

      return n; 
     }; 

     var Cell = function(cell) { 
      cell = cell.split(/([0-9]+)/); 
      this.row = parseInt(cell[1]); 
      this.column = colToInt(cell[0]); 
     }; 

     var d = sheet.find('dimension').attr('ref').split(':'); 
     d = _.map(d, function(v) { return new Cell(v); }); 

     var cols = d[1].column - d[0].column + 1, 
      rows = d[1].row - d[0].row + 1; 

     _(rows).times(function() { 
      var _row = []; 
      _(cols).times(function() { _row.push(''); }); 
      data.push(_row); 
     }); 

     sheet.find('sheetData row c').each(function(i, c) { 
      var $cell = $(c), 
       cell = new Cell($cell.attr('r')), 
       type = $cell.attr('t'), 
       value = $cell.find('v').text(); 

      if (type == 's') value = strings.find('si t').eq(parseInt(value)).text(); 

      data[cell.row - d[0].row][cell.column - d[0].column] = value; 
     }); 

     return data; 
    } 

    return { 
     parse: function(file) { 
      return extractFiles(file).pipe(function(files) { 
       return extractData(files); 
      }); 
     } 
    } 
})();