2011-06-17 77 views
7

Desde la página JSP, necesito navegar por el archivo Excel y luego de seleccionar el archivo en el sistema, necesito leer el contenido del archivo Excel y llenar mi formulario.¿Cómo leer un archivo de Excel contenido en el lado del cliente?

Actualmente he intentado con el código siguiente pero solo funciona en IE con algunos cambios en las opciones de internet de IE para ActiveXObject. No funciona en el resto de los navegadores.

<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> 

Por favor, sugiera alguna solución para que funcione en todos los navegadores.

Respuesta

0

En general, no es posible leer/escribir ningún archivo a través de JavaScript en un navegador. Entonces, sin ningún complemento adicional, no podrá leer/escribir archivos de Excel desde el navegador. Los objetos ActiveX de Excel le permiten hacer esto, pero solo IE admite objetos ActiveX.

Puede haber otros complementos para otros navegadores, pero no conozco ninguno.

En primer lugar, ¿por qué quieres hacer eso? ¿Puedes dar un caso de uso? Tal vez haya mejores opciones disponibles que lo que estás intentando.

ACTUALIZACIÓN

Usted tendrá que pasar el archivo de Excel en el servidor y hacer la lectura del excel en el lado del servidor (en un servlet, por ejemplo).

Usted tendrá que utilizar un <input type='file'> en el JSP dentro de un impreso de varias copias
<form name="myForm" action="myServlet" enctype="multipart/form-data" method="post">

En el lado del servidor, es posible que desee utilizar Apache Commons File Upload.

Una vez que tenga el archivo (o una corriente en él) se puede analizar el archivo usando, por ejemplo, Apache POI HSSF/XSSF y luego actualizar los datos a una base de datos o pasarlo de nuevo a una JSP

+0

Proyecto requerimiento - El usuario tiene que seleccionar el archivo de Excel en su sistema desde la página JSP y luego automáticamente todas los campos de formulario deben llenarse. Por favor sugiera como puedo hacer esto? – Jyoti

+0

@Jyoti He actualizado la respuesta – Nivas

+0

"En general, no es posible leer/escribir ningún archivo mediante JavaScript en un navegador." Entonces, ¿es posible, pero un complemento es su mejor opción? Pero puede hacer lo que quiera y no tiene que usar el servicio para hacer el trabajo sucio. Aunque xlsx.js lo logra con terrible DX, se puede hacer con mucha investigación. He visto muchos ejemplos de que funciona. – Urasquirrel

1

que hacer esto todo el tiempo: mis prototipos están diseñados para permitir a los interesados ​​modificar un Excel y llenar el prototipo html, a menudo sin un servidor.

  1. Guarde el Excel como XML
  2. carga el XML a través de AJAX y analizar la estructura

() he aquí una mano macro botón pongo en mis archivos de Excel, lo que permite guardar sin dolor como XML (y volver a guardar como 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 

() El análisis de JS es más complicat ed pero la premisa es simple. Habrá objetos XML como Hoja de trabajo, Tabla, Fila, Celda y Datos. También hay un atributo XML llamado ss: índice que a veces encuentro útil.

8

Una hoja de cálculo xlsx es un archivo zip con un montón de archivos xml en él. Usando algo como zip.js, puede extraer los archivos xml y analizarlos en el navegador. xlsx.js hace esto. Here's my simple example.Copiado aquí por conveniencia:

/* 
    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); 
      }); 
     } 
    } 
})(); 
1

que es posible cargar y abrir el lado del cliente archivo en most modern browsers utilizando el HTML5 File API

vez que haya cargado el archivo se puede analizar el contenido de una biblioteca que soporta cierta sobresalir formatos de salida (como csv/xlsx).

Aquí hay un par de opciones ...

Cuestiones relacionadas