Làm cách nào để xuất bảng sang Excel từ một trang web. Tôi muốn bản xuất chứa tất cả các định dạng và màu sắc.
<td style="background-color: ...
Làm cách nào để xuất bảng sang Excel từ một trang web. Tôi muốn bản xuất chứa tất cả các định dạng và màu sắc.
<td style="background-color: ...
Câu trả lời:
Xa và xa, công cụ xuất bảng sang Excel rõ ràng, dễ dàng nhất là plugin Jquery DataTables Table Tools. Bạn nhận được một lưới sắp xếp, bộ lọc, đơn đặt hàng và trang dữ liệu của mình và chỉ với một vài dòng mã bổ sung và hai tệp nhỏ đi kèm, bạn có thể xuất sang Excel, PDF, CSV, sang khay nhớ tạm và máy in.
Đây là tất cả mã bắt buộc:
$(document).ready( function () {
$('#example').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
}
} );
} );
Vì vậy, triển khai nhanh chóng, không có giới hạn trình duyệt, không yêu cầu ngôn ngữ phía máy chủ và hơn hết là rất DỄ hiểu. Đó là một kết quả đôi bên cùng có lợi và tốt cho tất cả. Tuy nhiên, một điều mà nó có giới hạn là định dạng cột nghiêm ngặt.
Nếu định dạng và màu sắc là yếu tố quyết định tuyệt đối, thì phương pháp trình duyệt chéo, đáng tin cậy 100% duy nhất mà tôi đã tìm thấy là sử dụng ngôn ngữ phía máy chủ để xử lý các tệp Excel phù hợp từ mã của bạn. Giải pháp tôi lựa chọn là PHPExcel Đây là giải pháp duy nhất mà tôi tìm thấy cho đến nay xử lý tích cực việc xuất với định dạng sang phiên bản HIỆN ĐẠI của Excel từ bất kỳ trình duyệt nào khi bạn không cung cấp gì ngoài HTML. Mặc dù vậy, hãy để tôi làm rõ, nó chắc chắn không dễ dàng như giải pháp đầu tiên và cũng hơi tốn tài nguyên. Tuy nhiên, về mặt tích cực, nó cũng có thể xuất trực tiếp sang PDF. Và, khi bạn đã cấu hình xong, nó sẽ hoạt động mọi lúc.
CẬP NHẬT - Ngày 15 tháng 9 năm 2016: TableTools đã bị ngừng cung cấp một plugin mới có tên là " nút " Các công cụ này thực hiện các chức năng tương tự như tiện ích mở rộng TableTools cũ, nhưng FAR dễ cài đặt hơn và chúng sử dụng tải xuống HTML5 cho các trình duyệt hiện đại, với khả năng dự phòng cho bản tải xuống Flash ban đầu cho các trình duyệt không hỗ trợ tiêu chuẩn HTML5. Như bạn có thể thấy từ nhiều nhận xét kể từ khi tôi đăng phản hồi này vào năm 2011, điểm yếu chính của TableTools đã được giải quyết. Tôi vẫn không thể đề xuất DataTables đủ để xử lý lượng lớn dữ liệu một cách đơn giản, cho cả nhà phát triển và người dùng.
Cách đây khá lâu, tôi đã phát hiện ra rằng Excel sẽ mở một tệp HTML với một bảng nếu chúng tôi gửi nó với kiểu nội dung Excel. Hãy xem xét tài liệu trê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>
Tôi đã chạy bookmarklet sau trên đó:
javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);
và trên thực tế, tôi có thể tải nó xuống dưới dạng tệp Excel. Tuy nhiên , tôi không nhận được kết quả như mong đợi - tệp được mở trong OpenOffice.org Writer. Đó là vấn đề của tôi: Tôi không có Excel trong máy này nên tôi không thể thử nó tốt hơn. Ngoài ra, thủ thuật này đã hoạt động cách đây sáu năm với các trình duyệt cũ hơn và phiên bản cũ của MS Office, vì vậy tôi thực sự không thể nói liệu nó có hoạt động ngày hôm nay hay không.
Dù sao, trong tài liệu ở trên, tôi đã thêm một nút sẽ tải xuống toàn bộ tài liệu dưới dạng tệp Excel, về lý thuyết:
<!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>
Lưu nó vào một tệp và nhấp vào nút. Tôi muốn yêu để biết nếu nó làm việc hay không, vì vậy tôi hỏi bạn nhận xét ngay cả đối với nói rằng nó đã không làm việc.
document.getElementById('id').innerHTML
để chỉ lấy bảng một cách có chọn lọc, nếu không, tất cả nội dung của bạn sẽ được xuất sang bảng tính. Không làm việc trong IE cũ tuy nhiên, chỉ mở ra một cửa sổ mới với tất cả các html trong tiêu đề
Có thể sử dụng định dạng XML cũ của Excel 2003 (trước OpenXML) để tạo chuỗi chứa XML mong muốn của bạn, sau đó ở phía máy khách, bạn có thể sử dụng URI dữ liệu để mở tệp bằng kiểu mime XSL hoặc gửi tệp cho khách hàng bằng cách sử dụng mimetype Excel "Content-Type: application / vnd.ms-excel" từ phía máy chủ.
<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>
Khi bạn đã thu thập được thông tin, hãy tạo chuỗi cuối cùng và mở một cửa sổ mới bằng cách sử dụng URI dữ liệu
<script type="text/javascript"> var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
window.open('data:application/vnd.ms-excel,'+worksheet); </script>
Cần lưu ý rằng các trình duyệt cũ hơn không hỗ trợ lược đồ URI dữ liệu, vì vậy bạn có thể cần tạo phía máy chủ tệp cho những trình duyệt không hỗ trợ nó.
Bạn cũng có thể cần thực hiện mã hóa base64 trên nội dung URI dữ liệu, có thể yêu cầu thư viện js , cũng như thêm chuỗi '; base64' sau loại mime trong URI dữ liệu.
Excel có một tính năng ít được biết đến được gọi là "Truy vấn web" cho phép bạn truy xuất dữ liệu từ hầu hết mọi trang web mà không cần lập trình bổ sung.
Truy vấn web về cơ bản chạy một yêu cầu HTTP trực tiếp từ bên trong Excel và sao chép một số hoặc tất cả dữ liệu đã nhận (và định dạng tùy chọn) vào trang tính.
Sau khi xác định xong truy vấn web, bạn có thể làm mới nó bất kỳ lúc nào mà không cần rời khỏi excel. Vì vậy, bạn không phải thực sự "xuất" dữ liệu và lưu nó vào một tệp - bạn muốn làm mới dữ liệu giống như từ cơ sở dữ liệu.
Bạn thậm chí có thể sử dụng các tham số URL bằng cách để excel nhắc bạn về các tiêu chí lọc nhất định, v.v.
Tuy nhiên, khuyết điểm mà tôi nhận thấy cho đến nay là:
Đây là câu hỏi về cách tạo truy vấn web trong Excel. Nó liên kết đến trang Trợ giúp của Microsoft về Cách lấy dữ liệu bên ngoài từ một trang Web
Đây là một php nhưng bạn có thể thay đổi nó thành javascript:
<?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); ?>
Đầu tiên, tôi không khuyên bạn nên thử xuất Html và hy vọng rằng phiên bản Excel của người dùng sẽ chọn nó. Kinh nghiệm của tôi rằng giải pháp này đầy rẫy các vấn đề bao gồm sự không tương thích với máy khách Macintosh và gây ra lỗi cho người dùng rằng tệp được đề cập không có định dạng được chỉ định. Giải pháp thân thiện với người dùng, chống đạn nhất là giải pháp phía máy chủ, nơi bạn sử dụng thư viện để tạo tệp Excel thực và gửi lại tệp đó cho người dùng. Giải pháp tốt nhất tiếp theo và giải pháp phổ quát hơn sẽ là sử dụng định dạng Open XML. Tôi đã gặp phải một số vấn đề tương thích hiếm gặp với các phiên bản Excel cũ hơn nhưng nhìn chung, điều này sẽ cung cấp cho bạn giải pháp hoạt động trên mọi phiên bản Excel bao gồm cả máy Mac.
mozilla vẫn hỗ trợ 64 URI cơ sở. Điều này cho phép bạn soạn nội dung nhị phân động bằng cách sử dụng javascript:
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
nếu tệp excel của bạn không đẹp mắt (không có sơ đồ, công thức, macro), bạn có thể tìm hiểu định dạng và soạn các byte cho tệp của mình, sau đó mã hóa chúng bằng base64 và đưa vào href
Điều này thực sự đơn giản hơn bạn nghĩ: "Chỉ cần" sao chép bảng HTML (nghĩa là: Mã HTML cho bảng) vào khay nhớ tạm. Excel biết cách giải mã bảng HTML; nó thậm chí sẽ cố gắng duy trì các thuộc tính.
Phần khó là "sao chép bảng vào khay nhớ tạm" vì không có cách tiêu chuẩn nào để truy cập khay nhớ tạm từ JavaScript. Xem bài đăng trên blog này: Truy cập Bảng tạm Hệ thống bằng JavaScript - Chén Thánh?
Bây giờ tất cả những gì bạn cần là bảng dưới dạng HTML. Tôi đề xuất jQuery và phương thức html () .
Mã này chỉ dành cho IE vì vậy nó chỉ hữu ích trong những trường hợp bạn biết tất cả người dùng của mình sẽ sử dụng IE (chẳng hạn như trong một số môi trường công ty).
<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>
Các giả định:
url đã cho
chuyển đổi phải được thực hiện ở phía khách hàng
hệ thống là Windows, Mac và linux
Giải pháp cho Windows:
mã python mở cửa sổ tức là và có quyền truy cập vào nó: biến theurl chứa url ('http: //')
ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)
Lưu ý: nếu trang không thể truy cập trực tiếp nhưng đăng nhập, bạn sẽ cần phải xử lý điều này bằng cách nhập dữ liệu biểu mẫu và mô phỏng các hành động của người dùng với python
đây là ví dụ
from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw
cách thức tương tự để truy xuất dữ liệu từ trang web. Giả sử phần tử có id 'el1' chứa dữ liệu. truy xuất văn bản phần tử đến biến
el1 = ie.Document.all('el1').value
thì khi dữ liệu nằm trong biến python, bạn có thể mở màn hình excel theo cách tương tự bằng cách sử dụng python:
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
Giải pháp cho Mac:
chỉ mẹo: sử dụng AppleScript - nó có API đơn giản và tương tự như win32com.client Dispatch
Giải pháp cho Linux:
java.awt.Robot có thể hoạt động cho điều này nó có nhấp chuột, nhấn phím (có thể sử dụng phím nóng), nhưng không có API nào cho Linux mà tôi biết có thể hoạt động đơn giản như AppleScript
tìm kiếm đơn giản của google cho ra kết quả này:
Nếu dữ liệu thực sự là một trang HTML và KHÔNG được tạo bởi ASP, PHP hoặc một số ngôn ngữ kịch bản khác và bạn đang sử dụng Internet Explorer 6 và bạn đã cài đặt Excel trên máy tính của mình, chỉ cần nhấp chuột phải vào trang và xem thông qua menu. Bạn sẽ thấy "Xuất sang Microsoft Excel." Nếu tất cả các điều kiện này là đúng, hãy nhấp vào mục menu và sau một vài lời nhắc, nó sẽ được nhập vào Excel.
nếu bạn không thể làm điều đó, anh ấy đưa ra một phương pháp "kéo và thả" thay thế:
Có hai cách thực tế để thực hiện việc này tự động trong khi chỉ có một giải pháp có thể được sử dụng trong tất cả các trình duyệt. Trước hết, bạn nên sử dụng đặc tả xml mở để xây dựng trang tính excel. Có các plugin miễn phí của Microsoft làm cho định dạng này cũng có sẵn cho các phiên bản văn phòng cũ hơn. Xml mở là tiêu chuẩn kể từ office 2007. Hai cách hiển nhiên là phía máy chủ hoặc phía máy khách.
Việc triển khai phía máy khách sử dụng tiêu chuẩn CSS mới cho phép bạn lưu trữ dữ liệu thay vì chỉ URL của dữ liệu. Đây là một cách tiếp cận tuyệt vời vì bạn không cần bất kỳ cuộc gọi máy chủ nào, chỉ cần dữ liệu và một số javascript. Nhược điểm giết chết là microsoft không hỗ trợ tất cả các phần của nó trong phiên bản IE hiện tại (tôi không biết về IE9). Microsoft giới hạn dữ liệu là hình ảnh nhưng chúng tôi sẽ cần một tài liệu. Trong firefox nó hoạt động khá tốt. Đối với tôi, IE là điểm chết.
Cách khác là sử dụng triển khai bên máy chủ. Cần có nhiều triển khai XML mở cho tất cả các ngôn ngữ. Bạn chỉ cần vẽ một đồ thị. Trong hầu hết các trường hợp, đây sẽ là cách đơn giản nhất để sửa đổi Viewmodel để tạo ra Tài liệu nhưng chắc chắn bạn có thể gửi tất cả dữ liệu từ Clientside trở lại máy chủ và thực hiện tương tự.
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, '');
}