没有HTML代码的JSP页面,用于将数据导出到Excel表格

8
我在导出数据到Excel表格时遇到了问题,这是由于我的团队中的其他开发人员编写的一些代码。因此,主要问题是如何使用JSP页面将数据导出到Excel或.cvs,但不使用任何HTML代码。 任何建议都可以帮助我在开发领域探索。感谢您的努力。
1个回答

16
最好使用Servlet来完成这个任务。将原始Java代码放在JSP文件中会导致维护问题,这是一个简单的做法,详情请参见此处
首先,创建一个简单的Java实用类,该类以List<List<T>>List<Data>(其中Data表示一行)表示CSV内容,以OutputStream作为方法参数,并编写执行数据复制任务的逻辑。
一旦您完成了这项工作,请创建一个Servlet类,该类将某个CSV文件标识符作为请求参数或pathinfo(我建议使用pathinfo,因为由Redmond团队开发的某些Web浏览器无法检测到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/*之类的内容,并将其称为http://example.com/context/csv/filename.csv。基本上就是这样。路径信息中的文件名很重要,因为由Redmond团队开发的某些Web浏览器会忽略Content-Disposition头中的filename部分,并使用URL的最后一个路径部分。


1
绝对是一个servlet的工作。+1 - ChadNC
我尝试了类似的解决方案,但在通过https获取文件时遇到了问题。为什么会在https中失败? - David García González
问题出在其他地方。请按右上角的“提问”按钮提出您自己的问题,并详细阐述问题。 - BalusC

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接