1

HTMLテーブルをExcelにエクスポートするのに問題があります。これが私が試したものです。

window.open('data:application/vnd.ms-excel,' + encodeURIComponent($('#myTableDiv').html()));

Chrome では驚くほど機能しますが、Internet Explorer では機能しません。URLにデータがある新しいタブに移動するだけです(IE10で試しました)。そこで、IE をチェックしてから、IE ブラウザ用の ActiveXObject メソッドを使用してみました。

var objExcel = new ActiveXObject ("Excel.Application");

しかし、オブジェクトの作成時にエラーが発生し、コンピューターに Excel 2013 がインストールされています。この方法はあまり信頼できないようです。

だから今、私はサーバーサイド言語(JSP)でそれを試しています。

これが私の現在の試みです。

$('.toExcel').click(function(){
    $.post('controllers/excel.jsp?tableHTML=' + encodeURIComponent($('#myTableDiv').html()), function(data) {   

    });
});

そして私のJSP

<!DOCTYPE html>
<%@ page import="java.io.PrintWriter" %>  
<%@ page contentType="application/excel" language="java" %>  
<%    
   response.reset();  
   response.setHeader("Content-Type", "application/vnd.ms-excel");
   response.setHeader("Content-Disposition", "attachment;filename=\"report.xls\"");  
   PrintWriter op = response.getWriter();  
   String CSV = request.getParameter("tableHTML");   
   op.write(CSV);  
%>  

これには少なくともいくつかの問題があることを私は知っています。

  1. URL に投稿するとき、ダウンロード プロンプトはありません。
  2. パラメーターとして収まる HTML は非常に限られています

Chrome でリクエスト URL に移動すると、ファイルがダウンロードされます。IE 10 でリクエスト URL に移動すると、次のエラーが表示されます。

  HTML1527: DOCTYPE expected. The shortest valid doctype is "<!DOCTYPE html>". 
  excel.jsp, line 1 character 1

すべてのブラウザで機能する信頼性の高いソリューションを教えてくれる人はいますか?

4

2 に答える 2

0

JSPとを使用した 1 つのソリューションJavaScript

  1. Excel JS 関数にエクスポートします。Pass in table ID

    function exportToExcel(intable){
        intable = document.getElementById(intable);
        this.table = intable.cloneNode(true);
        var cform = document.createElement("form");
        cform.style.display = "none";
        cform.setAttribute("method","POST");
        cform.setAttribute("action","exporttoexcel.jsp");
        cform.setAttribute("name","ExcelForm");
        cform.setAttribute("id","ExcelForm");
        cform.setAttribute("enctype","MULTIPART/FORM-DATA");
        cform.encoding="multipart/form-data";
        var ta = document.createElement("textarea");
        ta.name = "ExcelTable";
        var tabletext = this.table.outerHTML;
        ta.defaultValue = tabletext;
        ta.value = tabletext;
        cform.appendChild(ta);
        intable.parentNode.appendChild(cform);
        cform.submit();
        //clean up
        ta.defaultValue = null;
        ta = null;
        tabletext = null;
        this.table = null;
    }
    
  2. そしてcodeexporttoexcel.jsp

    <%@ page import="java.util.*"%>
    <%@ page import="java.io.*" %> 
    <%@ page import="org.apache.commons.fileupload.*" %>
    <%@ page import="org.apache.commons.fileupload.disk.*" %>
    <%@ page import="org.apache.commons.fileupload.servlet.*" %>
    <%
    response.setContentType("application/vnd.ms-excel");
    response.setHeader("Content-Disposition","attachment; filename=" + "MyReport.xls" );
    boolean isMultipart = ServletFileUpload.isMultipartContent(request);
    Iterator pit = null;
    DiskFileItem dfi = null;
    String line = ""; 
    if(isMultipart){
        //      Create a factory for disk-based file items
        FileItemFactory factory = new DiskFileItemFactory();
    
        //      Create a new file upload handler
        ServletFileUpload upload = new ServletFileUpload(factory);
    
        //      Parse the request
        File f = null;
        dfi = null;
        List items = null;
        items = upload.parseRequest(request);
        pit = items.iterator();
    
     }
     if(isMultipart){
        while(pit.hasNext()){
            dfi = (DiskFileItem)pit.next();
            String name = dfi.getFieldName();
            if (name.equalsIgnoreCase("ExcelTable")){
                InputStream is = dfi.getInputStream();
                BufferedReader br = new BufferedReader(new InputStreamReader(is));
                while((line = br.readLine()) != null){
                    out.println(line);
                }                                   
            }
         }
      }else{
        Enumeration params = request.getParameterNames();
        while(params.hasMoreElements()){
            String par = (String)params.nextElement();
            out.println(par+"<br>");
            out.println(request.getParameter(par));
        }
      }
    %>
    
于 2013-11-25T20:20:37.603 に答える