웹 페이지에서 Excel로 표를 내보내려면 어떻게해야합니까? 내보내기에 모든 서식과 색상이 포함되기를 원합니다.
<td style="background-color: ...
웹 페이지에서 Excel로 표를 내보내려면 어떻게해야합니까? 내보내기에 모든 서식과 색상이 포함되기를 원합니다.
<td style="background-color: ...
답변:
멀리서 보면 테이블에서 Excel로 가장 깨끗하고 가장 쉽게 내보낼 수있는 것은 Jquery DataTables Table Tools 플러그인입니다. 데이터를 정렬, 필터링, 정렬 및 페이징하는 그리드가 제공되며 몇 줄의 추가 코드와 두 개의 작은 파일이 포함되어있어 Excel, PDF, CSV, 클립 보드 및 프린터로 내보낼 수 있습니다.
다음은 필요한 모든 코드입니다.
$(document).ready( function () {
$('#example').dataTable( {
"sDom": 'T<"clear">lfrtip',
"oTableTools": {
"sSwfPath": "/swf/copy_cvs_xls_pdf.swf"
}
} );
} );
따라서 배포가 빠르고 브라우저 제한이 없으며 서버 측 언어가 필요하지 않으며 무엇보다도 이해하기 쉽습니다. 그것은 윈-윈입니다. 그러나 한 가지 제한 사항은 엄격한 열 형식 지정입니다.
서식과 색상이 절대적인 거래를 방해한다면, 제가 찾은 유일한 100 % 신뢰할 수있는 크로스 브라우저 방법은 서버 측 언어를 사용하여 코드에서 적절한 Excel 파일을 처리하는 것입니다. 내 솔루션은 PHPExcel 입니다. HTML 만 제공하면 모든 브라우저에서 최신 버전의 Excel로 서식을 지정하여 내보내기를 적극적으로 처리하는 유일한 솔루션입니다 . 하지만 명확히하겠습니다. 첫 번째 솔루션만큼 쉽지는 않으며 리소스를 많이 사용하기도합니다. 그러나 플러스 측면에서는 PDF로 직접 출력 할 수도 있습니다. 그리고 일단 구성하면 매번 작동합니다.
업데이트 -2016 년 9 월 15 일 : TableTools는 " 버튼 " 이라는 새 플러그인을 사용하여 중단되었습니다. 이러한 도구는 이전 TableTools 확장과 동일한 기능을 수행하지만 설치가 훨씬 쉽고 최신 브라우저 용 HTML5 다운로드를 사용합니다. HTML5 표준을 지원하지 않는 브라우저를 위해 원래 Flash 다운로드로 대체 할 수있는 기능이 있습니다. 2011 년에이 응답을 게시 한 이후 많은 댓글에서 알 수 있듯이 TableTools의 주요 약점이 해결되었습니다. 개발자와 사용자 모두에게 단순히 대량의 데이터를 처리하기에 충분한 DataTables를 여전히 권장하지 않습니다.
오래 전에 Excel 콘텐츠 형식으로 보내면 Excel이 표가있는 HTML 파일을 열 수 있다는 것을 발견했습니다. 위의 문서를 고려하십시오.
<!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>
다음 북마크릿을 실행했습니다.
javascript:window.open('data:application/vnd.ms-excel,'+document.documentElement.innerHTML);
사실 Excel 파일로 다운로드 할 수 있습니다. 그러나 예상 한 결과를 얻지 못했습니다. 파일이 OpenOffice.org Writer에서 열려있었습니다. 이것이 내 문제입니다.이 컴퓨터에는 Excel이 없어서 더 잘 시도 할 수 없습니다. 또한이 트릭은 6 년 전에 구형 브라우저와 MS Office의 골동품 버전에서 작동했기 때문에 오늘 작동 할 것인지 말할 수 없습니다.
어쨌든 위의 문서에서 이론상 전체 문서를 Excel 파일로 다운로드하는 버튼을 추가했습니다.
<!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>
파일에 저장하고 버튼을 클릭하십시오. 나는 것 사랑 은 일을하거나하지 않을 경우 심지어는 작동하지 않았다 말하는에 대한 언급을 요청할 수 있도록, 알고.
document.getElementById('id').innerHTML
하여 테이블 만 선택적으로 가져 오십시오. 그렇지 않으면 모든 항목이 스프레드 시트로 내보내집니다. 그냥 제목에 모두와 함께 HTML을 새 창을 엽니 다하지만 오래된 IE에서 작동하지 않습니다
이전 Excel 2003 XML 형식 (OpenXML 이전)을 사용하여 원하는 XML이 포함 된 문자열을 만든 다음 클라이언트 측에서 데이터 URI를 사용하여 XSL MIME 형식을 사용하여 파일을 열거 나 파일을 보낼 수 있습니다. 서버 측에서 Excel mimetype "Content-Type : application / vnd.ms-excel"을 사용하여 클라이언트에 전송합니다.
<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>
정보가 수집되면 최종 문자열을 만들고 데이터 URI를 사용하여 새 창을 엽니 다.
<script type="text/javascript"> var worksheet = worksheet_template.replace('{{ROWS}}', row_data);
window.open('data:application/vnd.ms-excel,'+worksheet); </script>
이전 브라우저는 데이터 URI 체계를 지원하지 않으므로이를 지원하지 않는 브라우저에 대해 파일 서버 측을 생성해야 할 수도 있습니다.
데이터 URI 콘텐츠에 대해 base64 인코딩을 수행해야 할 수도 있습니다.이 경우 js 라이브러리 가 필요할 수 있으며 데이터 URI의 MIME 유형 뒤에 '; base64'문자열을 추가해야합니다.
Excel에는 추가 프로그래밍없이 거의 모든 웹 페이지에서 데이터를 검색 할 수있는 "웹 쿼리"라는 약간 알려진 기능이 있습니다.
웹 쿼리는 기본적으로 Excel 내에서 직접 HTTP 요청을 실행하고 수신 된 데이터의 일부 또는 전체를 워크 시트에 복사합니다.
웹 쿼리를 정의한 후에는 Excel을 종료하지 않고도 언제든지 새로 고칠 수 있습니다. 따라서 실제로 데이터를 "내보내고"파일에 저장할 필요가 없습니다. 데이터베이스 에서처럼 데이터를 새로 고치는 것이 좋습니다.
Excel에서 특정 필터 기준 등을 묻는 메시지를 표시하여 URL 매개 변수를 사용할 수도 있습니다.
그러나 지금까지 알아 차린 단점은 다음과 같습니다.
다음 은 Excel에서 웹 쿼리를 만드는 방법에 대한 질문입니다. 웹 페이지에서 외부 데이터를 가져 오는 방법에 대한 Microsoft 도움말 사이트로 연결됩니다.
이것은 PHP이지만 자바 스크립트로 변경할 수 있습니다.
<?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); ?>
첫째, Html 내보내기를 시도 하지 않고 사용자의 Excel 인스턴스가 선택하기를 바랍니다. 이 솔루션은 Macintosh 클라이언트와의 비 호환성을 포함하여 문제가 있으며 문제의 파일이 지정된 형식이 아니라는 오류를 사용자에게 던지는 내 경험입니다. 가장 방탄하고 사용자 친화적 인 솔루션은 라이브러리를 사용하여 실제 Excel 파일을 작성하고 사용자에게 다시 보내는 서버 측 솔루션입니다. 차선책이자보다 보편적 인 솔루션은 Open XML 형식을 사용하는 것입니다. 이전 버전의 Excel과 몇 가지 드문 호환성 문제가 발생했지만 전체적으로 Mac을 포함한 모든 버전의 Excel에서 작동하는 솔루션을 제공 할 것입니다.
mozilla는 여전히 기본 64 URI를 지원합니다. 이를 통해 자바 스크립트를 사용하여 바이너리 콘텐츠를 동적으로 구성 할 수 있습니다.
<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>
엑셀 파일이 그다지 화려하지 않은 경우 (다이어그램, 공식, 매크로가 없음) 형식을 파고 파일의 바이트를 구성한 다음 base64로 인코딩하고 href에 넣을 수 있습니다.
이것은 실제로 생각했던 것보다 더 간단합니다. "그냥"HTML 테이블 (즉 : 테이블의 HTML 코드)을 클립 보드에 복사합니다. Excel은 HTML 표를 디코딩하는 방법을 알고 있습니다. 속성을 보존하려고 시도 할 것입니다.
어려운 부분은 자바 스크립트에서 클립 보드에 액세스하는 표준 방법이 없기 때문에 "테이블을 클립 보드로 복사"하는 것입니다. 이 블로그 게시물 : JavaScript로 시스템 클립 보드 액세스 – 성배?
이제 HTML로 된 테이블 만 있으면됩니다. jQuery와 html () 메서드를 제안 합니다.
이 코드는 IE 전용이므로 모든 사용자가 IE를 사용할 것이라는 것을 알고있는 상황에서만 유용합니다 (예 : 일부 기업 환경).
<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>
가정 :
주어진 URL
변환은 클라이언트 측에서 수행되어야합니다.
시스템은 Windows, Mac 및 Linux입니다.
Windows 용 솔루션 :
ie 창을 열고 액세스 할 수있는 python 코드 : theurl 변수에는 url ( 'http : //')이 포함됩니다.
ie = Dispatch("InternetExplorer.Application")
ie.Visible = 1
ie.Navigate(theurl)
참고 : 페이지에 직접 액세스 할 수 없지만 로그인 한 경우 양식 데이터를 입력하고 Python으로 사용자 작업을 에뮬레이션하여이를 처리해야합니다.
여기에 예가 있습니다
from win32com.client import Dispatch
ie.Document.all('username').value=usr
ie.Document.all('password').value=psw
웹 페이지에서 데이터를 검색하는 것과 동일한 방식입니다. ID가 'el1'인 요소에 데이터가 포함되어 있다고 가정 해 보겠습니다. 변수에 대한 요소 텍스트 검색
el1 = ie.Document.all('el1').value
그런 다음 데이터가 python 변수에 있으면 python을 사용하여 비슷한 방식으로 Excel 화면을 열 수 있습니다.
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 용 솔루션 :
팁 : AppleScript 사용-win32com.client Dispatch와 같은 간단하고 유사한 API가 있습니다.
Linux 용 솔루션 :
java.awt.Robot은 클릭, 키 누름 (단축키를 사용할 수 있음)이 있으면 작동 할 수 있지만 AppleScript만큼 간단하게 작동 할 수있는 Linux 용 API는 없습니다.
간단한 Google 검색이 다음과 같이 나타났습니다.
데이터가 실제로 HTML 페이지이고 ASP, PHP 또는 다른 스크립팅 언어로 생성되지 않았고 Internet Explorer 6을 사용 중이고 컴퓨터에 Excel이 설치되어있는 경우 페이지를 마우스 오른쪽 단추로 클릭하고 메뉴를 통해. "Microsoft Excel로 내보내기"가 표시되어야합니다. 이러한 조건이 모두 참이면 메뉴 항목을 클릭하고 몇 가지 프롬프트 후에 Excel로 가져옵니다.
그렇게 할 수 없다면 그는 대체 "끌어서 놓기"방법을 제공합니다.
모든 브라우저에서 하나의 솔루션 만 사용할 수있는 반면이를 자동으로 수행하는 실질적인 두 가지 방법이 있습니다. 우선 오픈 xml 사양을 사용하여 엑셀 시트를 작성해야합니다. 이전 Office 버전에서도이 형식을 사용할 수 있도록하는 Microsoft의 무료 플러그인이 있습니다. 오픈 xml은 Office 2007 이후 표준입니다. 두 가지 방법은 서버 측 또는 클라이언트 측에서 분명합니다.
클라이언트 측 구현은 데이터에 대한 URL 대신 데이터를 저장할 수있는 새로운 CSS 표준을 사용합니다. 이것은 서버 호출이 필요하지 않고 데이터와 일부 자바 스크립트가 필요없는 훌륭한 접근 방식입니다. 죽이는 단점은 마이크로 소프트가 현재 IE (IE9에 대해 잘 모릅니다) 릴리스에서 모든 부분을 지원하지 않는다는 것입니다. Microsoft는 데이터를 이미지로 제한하지만 문서가 필요합니다. 파이어 폭스에서는 꽤 잘 작동합니다. 나에게 IE는 킬링 포인트였습니다.
다른 방법은 서버 측 구현을 사용하는 것입니다. 모든 언어에 대한 개방형 XML 구현이 많이 있어야합니다. 하나만 잡으면됩니다. 대부분의 경우 문서를 생성하도록 Viewmodel을 수정하는 가장 간단한 방법이지만 Clientside의 모든 데이터를 다시 서버로 보내고 동일한 작업을 수행 할 수 있습니다.
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, '');
}