2009-11-18 42 views
8

Tôi đang gặp sự cố khi xuất dữ liệu của mình sang excel, điều này là do một số mã mà các nhà phát triển khác trong nhóm của tôi đã thực hiện. Vì vậy, vấn đề chính là xuất dữ liệu sang Excel hoặc .cvs bằng cách sử dụng trang JSP nhưng không sử dụng bất kỳ mã HTML nào. Bất kỳ đề xuất nào cũng sẽ giúp tôi khám phá trong lĩnh vực đang phát triển của mình. Cảm ơn những nỗ lực của bạn.Trang JSP không có mã HTML để xuất dữ liệu sang trang tính Excel

Trả lời

16

Sử dụng tốt hơn Servlet cho việc này. Mã Java thô không thuộc về tệp JSP, chỉ đơn giản là công thức cho maintenance trouble.

Để bắt đầu, tạo ra một lớp tiện ích Java đơn giản mà mất ví dụ như một List<List<T>> hoặc một List<Data> (trong đó Data đại diện cho một hàng) thể hiện nội dung CSV và một OutputStream như các đối số phương pháp và viết logic mà hiện các dữ liệu sao chép nhiệm vụ.

Khi bạn làm việc đó, hãy tạo lớp Servlet lấy một số định danh tệp CSV làm tham số yêu cầu hoặc pathinfo (Tôi khuyên bạn nên sử dụng pathinfo như một trình duyệt web nhất định được phát triển bởi một nhóm trong Redmond sẽ không phát hiện được tên tệp/mimetype nếu không), sử dụng số nhận dạng để nhận được List<List<T>> hoặc List<Data> từ đâu đó và ghi nó vào số OutputStream của số HttpServletResponse cùng một bộ tiêu đề phản hồi chính xác.

Dưới đây là một kickoff ví dụ cơ bản:

public static <T> void writeCsv (List<List<T>> csv, char separator, OutputStream output) throws IOException { 
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8")); 
    for (List<T> row : csv) { 
     for (Iterator<T> iter = row.iterator(); iter.hasNext();) { 
      String field = String.valueOf(iter.next()).replace("\"", "\"\""); 
      if (field.indexOf(separator) > -1 || field.indexOf('"') > -1) { 
       field = '"' + field + '"'; 
      } 
      writer.append(field); 
      if (iter.hasNext()) { 
       writer.append(separator); 
      } 
     } 
     writer.newLine(); 
    } 
    writer.flush(); 
} 

Dưới đây là một ví dụ làm thế nào bạn có thể sử dụng nó:

public static void main(String[] args) throws IOException { 
    List<List<String>> csv = new ArrayList<List<String>>(); 
    csv.add(Arrays.asList("field1", "field2", "field3")); 
    csv.add(Arrays.asList("field1,", "field2", "fie\"ld3")); 
    csv.add(Arrays.asList("\"field1\"", ",field2,", ",\",\",\"")); 
    writeCsv(csv, ';', System.out); 
} 

Và bên trong một Servlet về cơ bản bạn có thể làm:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
    String filename = request.getPathInfo(); 
    List<List<Object>> csv = someDAO().list(); 
    response.setHeader("content-type", "text/csv"); 
    response.setHeader("content-disposition", "attachment;filename=\"" + filename + "\""); 
    writeCsv(csv, ',', response.getOutputStream()); 
} 

Bản đồ servlet này trên một cái gì đó như /csv/* và gọi nó là một cái gì đó như http://example.com/context/csv/filename.csv. Đó là cơ bản tất cả. Tên tệp trong pathinfo rất quan trọng vì một trình duyệt web nhất định được phát triển bởi một nhóm ở Redmond bỏ qua phần filename của tiêu đề Content-Disposition và sử dụng phần đường dẫn cuối cùng của URL thay thế.

+1

chắc chắn là một công việc cho một servlet. +1 – ChadNC

+0

Tôi đã thử một giải pháp tương tự như vậy nhưng tôi gặp sự cố khi tải tệp qua https. Tại sao nó không thể thông qua https ?. –

+0

Sự cố nằm ở một nơi khác. Hãy đặt câu hỏi của riêng bạn bằng cách nhấn nút 'Đặt câu hỏi' ở phía trên bên phải và giải thích chi tiết vấn đề. – BalusC

Các vấn đề liên quan