2009-11-18 54 views
8

我在将数据导出到Excel表单时遇到问题,这是因为我的团队中的其他开发人员所做的一些代码。所以主要的问题是使用JSP页面将数据导出到Excel或.cvs,但不使用任何HTML代码。 任何建议也可以帮助我探索在我的发展舞台上。感谢您的努力。没有用于将数据导出到Excel的HTML代码的JSP页面

回答

16

为此更好地使用Servlet。原始Java代码不属于JSP文件,这仅仅是maintenance trouble的配方。

首先,创建一个简单的Java工具类这需要例如List<List<T>>List<Data>(其中Data表示一行)表示CSV内容和OutputStream方法参数和写入逻辑它执行数据复制任务。

一旦你得到这个工作,创建一个Servlet类,它将一些CSV文件标识符作为请求参数或pathinfo(我建议使用pathinfo作为由雷德蒙德团队开发的某个webbrowser,否则将检测到filename/mimetype失败)使用标识符从某处获取List<List<T>>List<Data>,并沿着一组正确的响应标头将其写入HttpServletResponseOutputStream

这里有一个基本的开球例如:

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(); 
} 

这里有一个例子,你如何使用它:

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

和一个servlet中,你基本上可以做到:

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()); 
} 

地图这个servlet在/csv/*之类的东西上,并且像那样调用它。这基本上都是。 pathinfo中的文件名非常重要,因为Redmond团队开发的某个Web浏览器会忽略Content-Disposition标头的filename部分,而是使用URL的最后一个路径部分。

+1

绝对是一个servlet的工作。 +1 – ChadNC 2009-11-27 16:33:18

+0

我试过类似这样的解决方案,但我通过https获取文件时遇到了问题。 它为什么会通过https失败? – 2009-12-23 10:49:59

+0

问题在于别的地方。通过按右上方的“Ask Question”按钮询问您自己的问题,并详细说明问题。 – BalusC 2009-12-23 12:23:36