Esiste un modo o una libreria standard per copiare e incollare da un foglio di calcolo in un modulo Web? Quando seleziono più di una cella da Excel I (ovviamente) perde il delimitatore e tutto viene incollato in una cella del modulo Web. Dev'essere fatto in VB? oppure l'elaborazione può essere eseguita una volta avviata l'azione Incolla nel modulo Web?Copia/incolla da Excel a una pagina Web
risposta
Non perdi i delimitatori, le cellule sono separate da schede (\t
) e righe di ritorni a capo (\n
) che potrebbe non essere visibile nel modulo. Provalo tu stesso: copia i contenuti da Excel a Blocco note e vedrai le tue celle allineate in modo corretto. È facile quindi suddividere i campi in schede e sostituirli con qualcos'altro, in questo modo puoi creare anche un tavolo da loro. Ecco un esempio utilizzando jQuery:
var data = $('input[name=excel_data]').val();
var rows = data.split("\n");
var table = $('<table />');
for(var y in rows) {
var cells = rows[y].split("\t");
var row = $('<tr />');
for(var x in cells) {
row.append('<td>'+cells[x]+'</td>');
}
table.append(row);
}
// Insert into DOM
$('#excel_table').html(table);
Quindi, in sostanza, questo script crea una tabella HTML dai dati di Excel incollati.
love it, Thanks! –
Ho giocato con un problema simile, vale la pena notare che, incollando su una casella di testo, si perdono le nuove righe. Mentre incollati in un'area di testo, tieni loro. –
Per motivi pratici, è possibile rendere questa risposta uno snippet per usi futuri. – AdrianoRR
Forse sarebbe meglio se tu leggessi il tuo file excel da PHP, e poi lo salvi in un DB o lo elabori.
qui un tutorial in-reparto su come leggere e scrivere dati di Excel con PHP:
http://www.ibm.com/developerworks/opensource/library/os-phpexcel/index.html
Questa è una soluzione assolutamente terribile. Sono venuto a questo thread come sto facendo attualmente ed è incredibilmente incline agli errori. Excel a volte sputa i numeri come numeri interi, a volte come float a volte come stringhe. –
si applicano anche gli scenari utente, in cui è necessario incollare da fonti inaffidabili, come la banca, i cui file xls/csv sono pieni di merda che devono essere setacciati manualmente – ZJR
Excel 2007 ha una funzionalità per farlo nella scheda "Dati" che funziona molto bene.
La stessa idea di Tatu (grazie ne avrò bisogno presto nel nostro progetto), ma con un'espressione regolare.
Che potrebbe essere più veloce per set di dati di grandi dimensioni.
<html>
<head>
<title>excelToTable</title>
<script src="../libs/jquery.js" type="text/javascript" charset="utf-8"></script>
</head>
<body>
<textarea>a1 a2 a3
b1 b2 b3</textarea>
<div></div>
<input type="button" onclick="convert()" value="convert"/>
<script>
function convert(){
var xl = $('textarea').val();
$('div').html(
'<table><tr><td>' +
xl.replace(/\n+$/i, '').replace(/\n/g, '</tr><tr><td>').replace(/\t/g, '</td><td>') +
'</tr></table>'
)
}
</script>
</body>
</html>
Ciao Mic, questo è un grande codice! Hai qualche idea su come posso convertire questa tabella in una forma presentabile? – BvilleBullet
dipende dal modulo che si desidera inviare. Vorrei fare un jit stringificato e pubblicarlo come un singolo campo sul server. – Mic
A proposito, questo funziona anche per una tabella di Word (una delle "form" legacy dei miei utenti "che stiamo cercando di convertire). Grazie. –
Scavando questo, nel caso in cui qualcuno lo incontrasse in futuro. Ho usato il codice sopra come previsto, ma poi ho incontrato un problema che mostrava la tabella dopo che era stata inviata a un database. È molto più semplice una volta memorizzati i dati per utilizzare PHP per sostituire le nuove linee e schede nella tua query. È possibile eseguire la sostituzione al momento della presentazione, $ _POST [Richiesta] sarebbe il nome del textarea:
$postrequest = trim($_POST[request]);
$dirty = array("\n", "\t");
$clean = array('</tr><tr><td>', '</td><td>');
$request = str_replace($dirty, $clean, $postrequest);
Ora basta inserire $ richiesta nel database, e saranno memorizzati in una tabella HTML.
Su OSX e Windows, esistono più tipi di appunti per diversi tipi di contenuto. Quando copi il contenuto in Excel, i dati vengono archiviati nel testo normale e negli appunti html.
Il modo corretto (che non viene sollevato dai problemi del delimitatore) è quello di analizzare l'HTML. http://jsbin.com/uwuvan/5 è una semplice demo che mostra come ottenere gli appunti HTML.La chiave è quella di legarsi alla manifestazione onpaste e leggere
event.clipboardData.getData('text/html')
jsbin non ha funzionato come previsto per me (Firefox 42 su Win 7, Excel 2013). Qualcosa di importante è cambiato da quando hai postato questa risposta, il che rende questo approccio non più funzionante?Nella console del browser, vedo il testo/contenuto semplice registrato, ma il contenuto text/html è vuoto. –
Funziona con chrome su Windows con Excel o su Ubuntu con libreOffice. La migliore soluzione IMO, poiché mantiene tutta la formattazione dei fogli originali. – BiAiB
In risposta alla risposta da Tatu ho creato un rapido jsFiddle per la presentazione la sua soluzione:
http://jsfiddle.net/duwood/sTX7y/
HTML
<p>Paste excel data here:</p>
<textarea name="excel_data" style="width:250px;height:150px;"></textarea><br>
<input type="button" onclick="javascript:generateTable()" value="Genereate Table"/>
<br><br>
<p>Table data will appear below</p>
<hr>
<div id="excel_table"></div>
JS
function generateTable() {
var data = $('textarea[name=excel_data]').val();
console.log(data);
var rows = data.split("\n");
var table = $('<table />');
for(var y in rows) {
var cells = rows[y].split("\t");
var row = $('<tr />');
for(var x in cells) {
row.append('<td>'+cells[x]+'</td>');
}
table.append(row);
}
// Insert into DOM
$('#excel_table').html(table);
}
Ed ecco la mia aggiunta a questa risposta, ma con la tabella automatica che mostra, subito dopo l'evento paste: http://jsfiddle.net/sTX7y/690/ Fondamentalmente, simula l'evento "afterpaste". – userfuser
Per tutti i futuri googler che finiscono qui come me, ho usato il concetto di @tatu Ulmanen e l'ho trasformato in una serie di oggetti. Questa semplice funzione prende una stringa di dati excel (o foglio Google) incollati (preferibilmente da un textarea
) e li trasforma in una serie di oggetti. Usa la prima riga per i nomi di colonne/proprietà.
function excelToObjects(stringData){
var objects = [];
//split into rows
var rows = stringData.split('\n');
//Make columns
columns = rows[0].split('\t');
//Note how we start at rowNr = 1, because 0 is the column row
for (var rowNr = 1; rowNr < rows.length; rowNr++) {
var o = {};
var data = rows[rowNr].split('\t');
//Loop through all the data
for (var cellNr = 0; cellNr < data.length; cellNr++) {
o[columns[cellNr]] = data[cellNr];
}
objects.push(o);
}
return objects;
}
Speriamo che aiuti qualcuno in futuro.
AGGIORNAMENTO: questo è vero solo se si utilizza ONLYOFFICE anziché MS Excel.
C'è in realtà un flusso in tutte le risposte fornite qui e anche in quella accettata. Il flusso è che ogni volta che hai una cella vuota in Excel e copia quella, negli appunti hai 2 caratteri di tabulazione uno accanto all'altro, quindi dopo averlo diviso ottieni un elemento aggiuntivo nell'array, che poi appare come una cella aggiuntiva in quella riga e sposta tutte le altre celle di una unità. Quindi, per evitare di dover sostanzialmente sostituire tutti i caratteri a doppia linguetta (solo una accanto all'altra) in una stringa con un carattere di tabulazione e solo dopo dividerlo.
Una versione aggiornata del jsfiddle @ di userfuser è qui per risolvere questo problema filtrando dati incollati con removeExtraTabs
http://jsfiddle.net/sTX7y/794/
function removeExtraTabs(string) {
return string.replace(new RegExp("\t\t", 'g'), "\t");
}
function generateTable() {
var data = removeExtraTabs($('#pastein').val());
var rows = data.split("\n");
var table = $('<table />');
for (var y in rows) {
var cells = rows[y].split("\t");
var row = $('<tr />');
for (var x in cells) {
row.append('<td>' + cells[x] + '</td>');
}
table.append(row);
}
// Insert into DOM
$('#excel_table').html(table);
}
$(document).ready(function() {
$('#pastein').on('paste', function(event) {
$('#pastein').on('input', function() {
generateTable();
$('#pastein').off('input');
})
})
})
In realtà ho scoperto che questo accade solo se si copia dal foglio di calcolo del software ONLYOFFICE. Hmm .. Lasciando questo qui nel caso qualcuno lo inciampi. – Aram
- 1. Puoi inviare dati da una pagina web a Flurry Analytics?
- 2. Aprire l'applicazione Android da una pagina Web
- 3. Come RDP da una pagina Web
- 4. Estrazione * immagine pertinente * da una pagina Web
- 5. Analisi dell'HTML da una pagina Web
- 6. Ottenere il titolo della pagina da una pagina web raschiato
- 7. HTML da Excel a Excel Javascript
- 8. Importa dati in Excel 2003 con una pagina di login
- 9. Web design "Una pagina"/"lunga pagina anteriore"?
- 10. Copia elementi da una pagina a un'altra in più pagine con VBA in Excel
- 11. Esportazione da PHP a Excel
- 12. Come intercettare ogni richiesta AJAX da una pagina web
- 13. Bibtex su una pagina Web?
- 14. Reverse Engineer una pagina Web
- 15. Come ottenere l'immagine di anteprima da una pagina Web
- 16. ExtJS 4.1 carica il contenuto da una pagina Web esterna
- 17. Traduci sito Web in una lingua specifica, a caricamento pagina
- 18. Aggiungere un blog a una pagina Web esistente
- 19. Come si fa a non restringere una pagina web mobile?
- 20. Invia modifiche a una pagina Web senza aggiornare
- 21. Evento quando una pagina web viene messa a fuoco
- 22. Trigger/richiama un'estensione di Chrome da una pagina Web
- 23. Nascondere una pagina nel sito Web Jekyll servita da GitHub
- 24. Come posso analizzare il contenuto dinamico da una pagina Web?
- 25. Stampa testo ruotato da pagina web
- 26. Utilizzo di mechanize per accedere a una pagina Web
- 27. Ottenere 404 durante l'accesso a una pagina Web tramite jsoup
- 28. .htaccess Reindirizzare a una pagina Web specifica basata sul browser
- 29. Impedire a una pagina web di allontanarsi utilizzando JavaScript
- 30. Javascript per reindirizzare da #anchor a una pagina separata
Stai cercando di automatizzare qualcosa? Puoi dare un esempio migliore ... –
Avevo paura di fare questa domanda. Grazie per averlo fatto e per essere così conciso. :) –