programing

웹 페이지에서 테이블을 Excel로 내보내려면 어떻게 해야 합니까?

topblog 2023. 10. 20. 13:24
반응형

웹 페이지에서 테이블을 Excel로 내보내려면 어떻게 해야 합니까?

웹 페이지에서 Excel로 테이블을 내보내려면 어떻게 해야 합니까?나는 수출품에 모든 형식과 색상이 포함되기를 원합니다.

테이블에서 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% 신뢰할 수 있는 크로스 브라우저 방법은 서버측 언어를 사용하여 코드에서 적절한 엑셀 파일을 처리하는 것입니다.제가 선택한 솔루션은 PHPExcel입니다. HTML 외에는 아무것도 제공하지 않을 때 브라우저에서 현대 버전의 엑셀로 포맷하여 내보내기를 긍정적으로 처리하는 것은 지금까지 발견한 유일한 솔루션입니다. 하지만 분명히 말씀드리지만, 첫 번째 솔루션만큼 쉽지는 않을 뿐만 아니라 약간의 리소스 독입니다.그러나 플러스 측면에서는 PDF로 직접 출력할 수도 있습니다.한번 구성하면 매번 작동합니다.

업데이트 - 2016년 9월 15일: "buttons"라는 새로운 플러그인을 사용하기 위해 TableTools가 단종되었습니다. 이 툴들은 이전의 TableTools 확장자와 동일한 기능을 수행하지만 설치하기가 훨씬 더 쉽고 현대적인 브라우저용 HTML5 다운로드를 사용합니다.HTML5 표준을 지원하지 않는 브라우저의 경우 원래 플래시 다운로드로 폴백할 수 있는 기능을 제공합니다.제가 2011년에 이 답변을 게시한 이후로 많은 댓글에서 알 수 있듯이, TableTools의 주요 약점이 해결되었습니다.개발자와 사용자 모두에게 대용량 데이터를 간단히 처리하기에 충분한 데이터 테이블을 추천할 수는 아직 없습니다.

예전에 엑셀 컨텐츠 타입으로 보내면 테이블로 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);

그리고 사실 엑셀 파일로 다운받을 수 있게 되었습니다.그러나 OpenOffice.org Writer에서 파일이 열려 있어 예상한 결과를 얻지 못했습니다.그것이 내 문제입니다.이 기계에는 엑셀이 없어서 더 잘 시도할 수가 없습니다.또한, 이 속임수는 6년 전에 구형 브라우저와 고풍스러운 버전의 MS Office에서 작동했기 때문에 오늘날 작동할 수 있을지는 정말 말할 수 없습니다.

어쨌든 위의 문서에서 나는 이론적으로 전체 문서를 엑셀 파일로 다운로드 할 수 있는 버튼을 추가했습니다.

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

파일에 저장하고 버튼을 클릭합니다.효과가 있는지 없는지 알고 싶으니, 효과가 없다고 해도 코멘트를 부탁드립니다.

이전 Excel 2003 XML 형식(OpenXML 이전)을 사용하여 원하는 XML을 포함하는 문자열을 만든 다음 클라이언트 측에서 데이터 URI를 사용하여 XSL 마임 형식을 사용하여 파일을 열거나 서버 측에서 Excel 마임 형식 "Content-Type: application/vnd.ms - excel"을 사용하여 클라이언트에 파일을 보낼 수 있습니다.

  1. Excel을 열고 원하는 서식과 색상으로 워크시트를 만듭니다.
  2. Excel 워크북을 "XML 스프레드시트 2003(*.xml)"으로 저장합니다.
  3. 결과 파일을 메모장과 같은 텍스트 편집기에서 열고 값을 응용프로그램의 문자열로 복사
  4. 데이터 uri와 함께 클라이언트 측 접근 방식을 사용한다고 가정하면 코드는 다음과 같습니다.
    
    <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>
    
    
  5. 그런 다음 문자열 바꾸기를 사용하여 워크시트 템플릿에 삽입할 행 모음을 만들 수 있습니다.
    
    <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>
    
    
  6. 정보가 수집되면 최종 문자열을 생성하고 데이터 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 콘텐츠에 대해 base64 인코딩을 수행해야 할 수도 있습니다.

Excel에는 "웹 쿼리"라는 잘 알려진 기능이 있어 추가 프로그래밍 없이 거의 모든 웹 페이지에서 데이터를 검색할 수 있습니다.

웹 쿼리는 기본적으로 Excel 내에서 HTTP 요청을 직접 실행하고 수신된 데이터의 일부 또는 전부(및 선택적으로 형식 지정)를 워크시트에 복사합니다.

웹 쿼리를 정의한 후 엑셀을 남기지 않고 언제든지 새로 고칠 수 있습니다.따라서 실제로 데이터를 "내보내기"하여 파일에 저장할 필요가 없습니다. 데이터베이스에서 데이터를 새로 고치는 것과 마찬가지로 데이터를 새로 고치는 것이 좋습니다.

특정 필터 기준 등에 대해 엑셀 프롬프트를 통해 URL 파라미터를 활용할 수도 있습니다.

하지만 지금까지 알아본 단점은 다음과 같습니다.

  • 자바스크립트가 실행되지 않아 동적으로 로드된 데이터에 접근할 수 없습니다.
  • URL 길이가 제한되어 있습니다.

여기 엑셀에서 웹 쿼리를 만드는 방법에 대한 질문이 있습니다.웹 페이지에서 외부 데이터를 가져오는 방법에 대한 Microsoft 도움말 사이트에 연결됩니다.

이것은 php이지만 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); ?>    

우선 html을 내보내는 것을 추천하지 않고 사용자의 Excel 인스턴스가 선택하기를 바랍니다.이 솔루션은 Macintosh 클라이언트와의 호환성이 없고 문제의 파일이 지정된 형식이 아니라는 오류를 사용자에게 던지는 등의 문제로 가득 차 있습니다.가장 방탄적이고 사용자 친화적인 솔루션은 라이브러리를 사용하여 실제 Excel 파일을 작성하고 이를 사용자에게 다시 전송하는 서버측 솔루션입니다.그 다음으로 가장 좋은 솔루션이자 보다 보편적인 솔루션은 Open XML 형식을 사용하는 것입니다.이전 버전의 Excel과 몇 가지 드문 호환성 문제가 발생했지만 전반적으로 이 문제는 Mac을 포함한 모든 버전의 Excel에서 작동하는 솔루션을 제공할 것입니다.

XML 열기

Mozilla는 여전히 기본 64 URI를 지원합니다.이를 통해 자바스크립트를 사용하여 바이너리 컨텐츠를 동적으로 작성할 수 있습니다.

<a href="data:application/vnd.ms-excel<base64 encoded binary excel content here>"> download xls</a>

만약 당신의 엑셀 파일이 아주 화려하지 않다면(다이어그램, 공식, 매크로가 없다면) 당신은 포맷을 파고들어 당신의 파일을 위해 바이트를 구성할 수 있습니다, 그리고 그것들을 base64로 인코딩하고 href에 넣을 수 있습니다.

https://developer.mozilla.org/en/data_URIs 을 참조

HTML 테이블을 "그냥" 복사하는 것보다 훨씬 간단합니다.테이블의 HTML 코드)를 클립보드에 입력합니다.Excel은 HTML 테이블을 해독하는 방법을 알고 있으며 속성을 보존하려고 할 뿐입니다.

자바스크립트에서 클립보드에 접근하는 표준 방법이 없기 때문에 어려운 부분은 "테이블을 클립보드에 복사"하는 것입니다.다음 블로그 게시물 보기:자바스크립트로 시스템 클립보드에 액세스 – 성배?

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

가정:

  1. 주어진 url

  2. 전환은 고객측에서 이루어져야 합니다.

  3. 시스템은 윈도우, 맥, 리눅스 입니다.

Windows용 솔루션:

ie 창을 열고 접근할 수 있는 python code: url 변수에 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를 가지고 있습니다.

리눅스용 솔루션:

java.awt.로봇은 클릭, 키 누르기(핫 키 사용 가능)를 사용할 수 있지만 AppleScript만큼 간단한 Linux용 API는 사용할 수 있는 API는 없습니다.

간단한 구글 검색 결과 다음과 같이 나타났습니다.

데이터가 실제로 HTML 페이지이고 ASP, PHP 또는 다른 스크립팅 언어로 작성되지 않았으며 Internet Explorer 6을 사용하고 있으며 컴퓨터에 Excel이 설치되어 있는 경우 페이지에서 마우스 오른쪽 버튼을 클릭하고 메뉴를 살펴보시기만 하면 됩니다."Microsoft Excel로 내보내기"가 표시됩니다.이 조건이 모두 맞는 경우 메뉴 항목을 클릭하면 몇 가지 프롬프트가 표시된 후 Excel로 가져옵니다.

만약 그렇게 할 수 없다면, 그는 다른 "drag 앤 드롭" 방법을 제시합니다.

http://www.mrkent.com/tools/converter/

그리고 이제 더 좋은 방법이 있습니다.

자바스크립트용 OpenXML SDK.

https://openxmlsdkjs.codeplex.com/

모든 브라우저에서 하나의 솔루션만 사용할 수 있지만 이를 자동으로 수행하는 실질적인 방법은 두 가지가 있습니다.우선 당신은 open xml 사양을 사용하여 엑셀 시트를 제작해야 합니다.Microsoft의 무료 플러그인을 사용할 수 있으며 이 형식을 이전 사무실 버전에서도 사용할 수 있습니다.open xml은 오피스 2007부터 표준입니다.두 가지 방법은 서버 측 또는 클라이언트 측이 분명합니다.

클라이언트 측 구현에서는 데이터에 대한 URL 대신 데이터를 저장할 수 있는 새로운 CSS 표준을 사용합니다.서버 호출이 필요 없고 데이터와 자바스크립트만 있으면 되기 때문에 이것은 훌륭한 접근법입니다.치명적인 단점은 마이크로소프트가 현재 IE(IE9은 잘 모릅니다) 릴리스에서 모든 부분을 지원하지 않는다는 것입니다.마이크로소프트는 데이터를 이미지로 제한하지만 우리는 문서가 필요할 것입니다.파이어폭스에서는 꽤 잘 작동합니다.제게는 IE가 킬링 포인트였습니다.

다른 방법은 서버측 구현을 사용하는 것입니다.모든 언어에 대해 오픈 XML을 많이 구현해야 합니다.하나만 그려주시면 돼요.대부분의 경우, 보기 모델을 수정하여 문서를 생성하는 가장 간단한 방법이지만, 클라이언트 사이드의 모든 데이터를 서버로 다시 보내고 동일한 작업을 수행할 수 있습니다.

   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, '');
   }

언급URL : https://stackoverflow.com/questions/5524143/how-can-i-export-tables-to-excel-from-a-webpage

반응형