Bir web sayfasından tabloları Excel'e nasıl aktarabilirim. Dışa aktarımın tüm biçimlendirmeyi ve renkleri içermesini istiyorum.
<td style="background-color: ...
Bir web sayfasından tabloları Excel'e nasıl aktarabilirim. Dışa aktarımın tüm biçimlendirmeyi ve renkleri içermesini istiyorum.
<td style="background-color: ...
Yanıtlar:
Uzak ve uzakta, tablolardan Excel'e en temiz ve en kolay dışa aktarma, Jquery DataTables Tablo Araçları eklentisidir. Verilerinizi sıralayan, filtreleyen, sıralayan ve sayfalandıran bir ızgaraya sahip oluyorsunuz ve yalnızca birkaç ekstra kod satırı ve dahil edilen iki küçük dosya ile Excel, PDF, CSV, panoya ve yazıcıya aktarabilirsiniz.
Gerekli olan tüm kod budur:
$(document).ready( function () {
$('#example').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
}
} );
} );
Dolayısıyla, hızlı dağıtım, tarayıcı sınırlaması yok, sunucu tarafı dili gerekli değil ve en önemlisi anlaşılması çok KOLAY. Bu bir kazan-kazan. Bununla birlikte, sınırları olan tek şey, sütunların katı biçimlendirilmesidir.
Biçimlendirme ve renkler mutlak dağıtıcı ise, bulduğum% 100 güvenilir, çapraz tarayıcı yöntemi, kodunuzdan uygun Excel dosyalarını işlemek için bir sunucu tarafı dili kullanmaktır. Benim tercih ettiğim çözüm PHPExcel'tir Bu şimdiye kadar bulduğum tek çözüm, HTML'den başka bir şey vermezseniz, herhangi bir tarayıcıdan Excel'in MODERN sürümüne formatlama ile dışa aktarımı olumlu bir şekilde gerçekleştiriyor. Yine de açıklığa kavuşturmama izin verin, kesinlikle ilk çözüm kadar kolay değil ve aynı zamanda biraz kaynak kazası. Bununla birlikte, artı tarafta, doğrudan PDF'ye de çıktı verebilir. Ve bir kez yapılandırdığınızda, her seferinde çalışır.
GÜNCELLEME - 15 Eylül 2016: TableTools, " düğmeler " adlı yeni bir eklenti lehine durduruldu Bu araçlar, eski TableTools uzantısıyla aynı işlevleri yerine getirir, ancak FAR'ın yüklenmesi daha kolaydır ve modern tarayıcılar için HTML5 indirmelerinden yararlanırlar, HTML5 standardını desteklemeyen tarayıcılar için orijinal Flash indirmesine geri dönme özelliği ile. 2011'de bu yanıtı yayınladığımdan beri birçok yorumdan da görebileceğiniz gibi, TableTools'un temel zayıflığı giderildi. Hala hem geliştirici hem de kullanıcı için büyük miktarda veriyi işlemek için yeterince DataTables öneremiyorum.
Uzun zaman önce, Excel içerik türü ile gönderirsek Excel'in tablo içeren bir HTML dosyasını açacağını keşfettim. Yukarıdaki belgeyi düşünün:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Java Friends</title>
</head>
<body>
<table style="font-weight: bold">
<tr style="background-color:red"><td>a</td><td>b</td></tr>
<tr><td>1</td><td>2</td></tr>
</table>
</body>
</html>
Üzerinde aşağıdaki yer imini çalıştırdım:
javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);
ve aslında onu bir Excel dosyası olarak indirilebilir hale getirdim. Ancak beklenen sonucu alamadım - dosya OpenOffice.org Writer'da açıldı. Benim sorunum bu: Bu makinede Excel yok, bu yüzden daha iyi deneyemiyorum. Ayrıca, bu numara aşağı yukarı altı yıl önce eski tarayıcılarda ve MS Office'in eski bir sürümünde işe yaradı, bu yüzden bugün çalışıp çalışmayacağını gerçekten söyleyemem.
Her neyse, yukarıdaki belgeye teoride tüm belgeyi bir Excel dosyası olarak indirecek bir düğme ekledim:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Java Friends</title>
</head>
<body>
<table style="font-weight: bold">
<tr style="background-color:red"><td>a</td><td>b</td></tr>
<tr><td>1</td><td>2</td></tr>
<tr>
<td colspan="2">
<button onclick="window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);">
Get as Excel spreadsheet
</button>
</td>
</tr>
</table>
</body>
</html>
Bir dosyaya kaydedin ve düğmesine tıklayın. Ben istiyorum seviyorum işe yaradı, değil mi ona bile eser yoktu söyleyerek için yorum yapmanızı rica yüzden, bilmek.
document.getElementById('id').innerHTML
yalnızca tabloyu seçmeli olarak almak için kimliği ile çağırın , aksi takdirde tüm malzemeleriniz elektronik tabloya aktarılır. Yine de eski IE'de çalışmıyor, sadece başlıktaki tüm html'leri içeren yeni bir pencere açıyor
İstediğiniz XML'i içeren bir dize oluşturmak için eski Excel 2003 XML biçimini (OpenXML'den önce) kullanmak mümkündür , ardından istemci tarafında XSL mime türünü kullanarak dosyayı açmak için bir veri URI'si kullanabilir veya dosyayı gönderebilirsiniz. istemciye sunucu tarafından Excel mimeype "Content-Type: application / vnd.ms-excel" kullanarak.
<script type="text/javascript">
var worksheet_template = '<?xml version="1.0"?><ss:Workbook xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet">'+
'<ss:Styles><ss:Style ss:ID="1"><ss:Font ss:Bold="1"/></ss:Style></ss:Styles><ss:Worksheet ss:Name="Sheet1">'+
'<ss:Table>{{ROWS}}</ss:Table></ss:Worksheet></ss:Workbook>';
var row_template = '<ss:Row ss:StyleID="1"><ss:Cell><ss:Data ss:Type="String">{{name}}</ss:Data></ss:Cell></ss:Row>';
</script>
<script type="text/javascript">
var rows = document.getElementById("my-table").getElementsByTagName('tr'),
row_data = '';
for (var i = 0, length = rows.length; i < length; ++i) {
row_data += row_template.replace('{{name}}', rows[i].getElementsByTagName('td')[0].innerHTML);
}
</script>
Bilgileri topladıktan sonra, son dizeyi oluşturun ve veri URI'sini kullanarak yeni bir pencere açın.
<script type="text/javascript">
var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
window.open('data:application/vnd.ms-excel,'+worksheet);
</script>
Eski tarayıcıların veri URI şemasını desteklemediğini belirtmekte fayda var, bu yüzden onu desteklemeyen tarayıcılar için dosya sunucusu tarafı üretmeniz gerekebilir.
Veri URI'sinde mime türünden sonra '; base64' dizesinin yanı sıra bir js kitaplığı gerektirebilecek veri URI içeriği üzerinde base64 kodlaması yapmanız gerekebilir .
Excel, ek programlama olmadan hemen hemen her web sayfasından veri almanıza izin veren "Web sorguları" adı verilen az bilinen bir özelliğe sahiptir.
Bir web sorgusu temel olarak doğrudan Excel içinden bir HTTP isteği çalıştırır ve alınan verilerin bir kısmını veya tamamını (ve isteğe bağlı olarak biçimlendirmeyi) çalışma sayfasına kopyalar.
Web sorgusunu tanımladıktan sonra, excel'den çıkmanıza gerek kalmadan istediğiniz zaman yenileyebilirsiniz. Yani verileri gerçekten "dışa aktarmanız" ve bir dosyaya kaydetmeniz gerekmez - verileri tıpkı bir veritabanındaki gibi yenilemeyi tercih edersiniz.
Hatta excel'in belirli filtre kriterleri vb. İçin sizi istemesini sağlayarak URL parametrelerinden yararlanabilirsiniz.
Ancak şu ana kadar fark ettiğim eksiler:
Excel'de web sorgularının nasıl oluşturulacağıyla ilgili bir soru burada . Bir Web sayfasından dış verileri Nasıl Alınır hakkında bir Microsoft Yardım sitesine bağlanır
Bu bir php ama javascript olarak değiştirebilirsin:
<?php>
$colgroup = str_repeat("<col width=86>",5);
$data = "";
$time = date("M d, y g:ia");
$excel = "<html xmlns:o=\"urn:schemas-microsoft-com:office:office\" xmlns:x=\"urn:schemas-microsoft-com:office:excel\" xmlns=\"http://www.w3.org/TR/REC-html40\">
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html>
<head>
<meta http-equiv=\"Content-type\" content=\"text/html;charset=utf-8\" />
<style id=\"Classeur1_16681_Styles\">
.xl4566 {
color: red;
}
</style>
</head>
<body>
<div id=\"Classeur1_16681\" align=center x:publishsource=\"Excel\">
<table x:str border=0 cellpadding=0 cellspacing=0 style=\"border-collapse: collapse\">
<colgroup>$colgroup</colgroup>
<tr><td class=xl2216681><b>Col1</b></td><td class=xl2216681><b>Col2</b></td><td class=xl2216681 ><b>Col3</b></td><td class=xl2216681 ><b>Col4</b></td><td class=xl2216681 ><b>Col5</b></td></tr>
<tr><td class=xl4566>1</td><td>2</td><td>3</td><td>4</td><td>5</td></tr>
</table>
</div>
</body>
</html>";
$fname = "Export".time().".xls";
$file = fopen($fname,"w+");
fwrite($file,$excel);
fclose($file);
header('Content-Type: application/vnd.ms-excel');
header('Content-Disposition: attachment; filename="'.basename($fname).'"');
readfile($fname);
unlink($fname); ?>
Öncelikle, olur değil Excel'in kullanıcının örneği bunu alır o ihracat Html ve umut denemenizi öneririz. Bu çözümün Macintosh istemcileriyle uyumsuzluklar da dahil olmak üzere sorunlarla dolu olduğunu ve kullanıcıya söz konusu dosyanın belirtilen formatta olmadığına dair bir hata verdiğini deneyimledim. En kurşun geçirmez, kullanıcı dostu çözüm, gerçek bir Excel dosyası oluşturmak ve bunu kullanıcıya geri göndermek için bir kitaplık kullandığınız sunucu tarafı çözümdür. Bir sonraki en iyi çözüm ve daha evrensel çözüm, Açık XML biçimini kullanmak olacaktır. Excel'in eski sürümleriyle birkaç nadir uyumluluk sorunuyla karşılaştım, ancak genel olarak bu size Mac'ler dahil Excel'in herhangi bir sürümünde çalışacak bir çözüm sunmalı.
Mozilla hala temel 64 URI'leri desteklemektedir. Bu, javascript kullanarak ikili içeriği dinamik olarak oluşturmanıza olanak tanır:
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
excel dosyanız çok süslü değilse (diyagramlar, formüller, makrolar yok) biçimine girebilir ve dosyanız için bayt oluşturabilir, ardından bunları base64 ile kodlayabilir ve href'e koyabilirsiniz.
Bu aslında düşündüğünüzden daha basit: "Sadece" HTML tablosunu (yani: tablonun HTML kodu) panoya kopyalayın. Excel, HTML tablolarının nasıl çözüleceğini bilir; öznitelikleri korumaya bile çalışacaktır.
Zor kısım, JavaScript'ten panoya erişmenin standart bir yolu olmadığından "tabloyu panoya kopyala" dır. Şu blog gönderisine bakın: Sistem Panosuna JavaScript ile Erişmek - Bir Kutsal Kase?
Şimdi ihtiyacınız olan tek şey HTML olarak tablo. JQuery ve html () yöntemini öneririm .
Bu kod yalnızca IE'dir, bu nedenle yalnızca tüm kullanıcılarınızın IE kullanacağını bildiğiniz durumlarda yararlıdır (örneğin, bazı kurumsal ortamlarda).
<script Language="javascript">
function ExportHTMLTableToExcel()
{
var thisTable = document.getElementById("tbl").innerHTML;
window.clipboardData.setData("Text", thisTable);
var objExcel = new ActiveXObject ("Excel.Application");
objExcel.visible = true;
var objWorkbook = objExcel.Workbooks.Add;
var objWorksheet = objWorkbook.Worksheets(1);
objWorksheet.Paste;
}
</script>
Varsayımlar:
verilen url
dönüşüm müşteri tarafında yapılmalıdır
sistemler Windows, Mac ve linux'tur
Windows için Çözüm:
ie penceresini açan ve ona erişimi olan python kodu: theurl değişkeni url'yi içerir ('http: //')
ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)
Not: Sayfaya doğrudan erişilemiyor, ancak oturum açılıyorsa, bunu form verilerini girerek ve kullanıcı eylemlerini python ile taklit ederek halletmeniz gerekecektir.
işte örnek
from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw
web sayfasından veri almak için aynı yöntem. Diyelim ki 'el1' kimliğine sahip eleman verileri içeriyor. eleman metnini değişkene getir
el1 = ie.Document.all('el1').value
daha sonra veriler python değişkeninde olduğunda, excel ekranını python kullanarak benzer şekilde açabilirsiniz:
from win32com.client import Dispatch
xlApp = Dispatch("Excel.Application")
xlWb = xlApp.Workbooks.Open("Read.xls")
xlSht = xlWb.WorkSheets(1)
xlSht.Cells(row, col).Value = el1
Mac için Çözüm:
sadece ipucu: AppleScript kullanın - win32com.client Dispatch gibi basit ve benzer API'ye sahiptir
Linux için Çözüm:
java.awt.Robot bunun için işe yarayabilir, tıklama, tuşa basma (kısayol tuşları kullanılabilir), ancak bildiğim Linux için hiçbir API, AppleScript kadar basit çalışamaz
basit google araması bunu ortaya çıkardı:
Veriler gerçekte bir HTML sayfasıysa ve ASP, PHP veya başka bir komut dosyası dili tarafından oluşturulmamışsa ve Internet Explorer 6 kullanıyorsanız ve bilgisayarınızda Excel yüklüyse, sayfayı sağ tıklayıp menü aracılığıyla. "Microsoft Excel'e Aktar" seçeneğini görmelisiniz. Tüm bu koşullar doğruysa, menü öğesine tıklayın ve birkaç istemden sonra Excel'e aktarılacaktır.
Bunu yapamazsanız, alternatif bir "sürükle ve bırak" yöntemi sunar:
Bunu otomatik olarak yapmanın iki pratik yolu vardır ve tüm tarayıcılarda yalnızca bir çözüm kullanılabilir. Öncelikle, excel sayfasını oluşturmak için açık xml belirtimini kullanmalısınız. Bu formatı eski ofis sürümleri için de kullanılabilir kılan Microsoft'un ücretsiz eklentileri vardır. Açık xml, Office 2007'den beri standarttır. İki yol, sunucu tarafında veya istemci tarafında açıktır.
İstemci tarafı uygulaması, yalnızca verilerin URL'si yerine verileri depolamanıza izin veren yeni bir CSS standardı kullanır. Bu harika bir yaklaşım çünkü herhangi bir sunucu çağrısına ihtiyacınız yok, sadece veriler ve biraz javascript. Öldüren dezavantajı, Microsoft'un mevcut IE (IE9 hakkında bilmiyorum) sürümlerinde bunun tüm parçalarını desteklememesidir. Microsoft, verileri resim olarak kısıtlıyor ancak bir belgeye ihtiyacımız olacak. Firefox'ta oldukça iyi çalışıyor. Benim için IE ölüm noktasıydı.
Diğer yol, sunucu tarafı uygulamalarını kullanmaktır. Tüm diller için çok sayıda açık XML uygulaması olmalıdır. Sadece birini almalısın. Çoğu durumda, bir Viewmodel'i bir Belge ile sonuçlanacak şekilde değiştirmenin en basit yolu olacaktır, ancak kesinlikle İstemci tarafındaki tüm verileri sunucuya geri gönderebilir ve aynısını yapabilirsiniz.
function normalexport() {
try {
var i;
var j;
var mycell;
var tableID = "tblInnerHTML";
var drop = document.getElementById('<%= ddl_sections.ClientID %>');
var objXL = new ActiveXObject("Excel.Application");
var objWB = objXL.Workbooks.Add();
var objWS = objWB.ActiveSheet;
var str = filterNum(drop.options[drop.selectedIndex].text);
objWB.worksheets("Sheet1").activate; //activate dirst worksheet
var XlSheet = objWB.activeSheet; //activate sheet
XlSheet.Name = str; //rename
for (i = 0; i < document.getElementById("ctl00_ContentPlaceHolder1_1").rows.length - 1; i++) {
for (j = 0; j < document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells.length; j++) {
mycell = document.getElementById("ctl00_ContentPlaceHolder1_1").rows(i).cells(j);
objWS.Cells(i + 1, j + 1).Value = mycell.innerText;
// objWS.Cells(i + 1, j + 1).style.backgroundColor = mycell.style.backgroundColor;
}
}
objWS.Range("A1", "L1").Font.Bold = true;
// objWS.Range("A1", "L1").Font.ColorIndex = 2;
// objWS.Range("A1", "Z1").Interior.ColorIndex = 47;
objWS.Range("A1", "Z1").EntireColumn.AutoFit();
//objWS.Range("C1", "C1").ColumnWidth = 50;
objXL.Visible = true;
} catch (err) {
alert("Error. Scripting for ActiveX might be disabled")
return
}
idTmr = window.setInterval("Cleanup();", 1);
}
function filterNum(str) {
return str.replace(/[ / ]/g, '');
}