当前位置:  开发笔记 > 编程语言 > 正文

JSP生成Excel电子表格(XLS)下载

如何解决《JSP生成Excel电子表格(XLS)下载》经验,为你挑选了2个好方法。

我有这个应用程序,我正在JSP中开发,我希望以XLS(MS Excel格式)从数据库中导出一些数据.

是否可以在tomcat下编写一个文件,好像它是一个普通的Java应用程序,然后生成一个指向该文件的链接?或者我是否需要使用特定的API?

这样做会有我的许可问题吗?



1> Kevin..:

虽然您可以使用JExcelAPI等完整的库,但如果将响应MIME类型设置为"application/vnd.ms-excel",Excel也会读取CSV和纯HTML表.

根据电子表格的复杂程度,CSV或HTML可以在没有第三方库的情况下为您完成工作.



2> BalusC..:

不要使用具有application/vnd.ms-excel内容类型的纯HTML表.然后,您基本上使用错误的内容类型欺骗Excel,这会导致最新Excel版本中的失败和/或警告.当您编辑并将其保存在Excel中时,它还会弄乱原始HTML源代码.只是不要这样做.

CSV依次是一种标准格式,它可以毫无问题地享受Excel的默认支持,实际上生成简单且内存效率高.虽然有图书馆出来,但实际上你也可以轻松地在不到20行中写出一个(对于那些无法抗拒的人来说很有趣).您只需遵守RFC 4180规范,该规范基本上只包含3个规则:

    字段用逗号分隔.

    如果字段中出现逗号,则该字段必须用双引号括起来.

    如果字段中出现双引号,则该字段必须用双引号括起来,并且字段中的双引号必须由另一个双引号转义.

这是一个启动示例:

public static  void writeCsv (List> csv, char separator, OutputStream output) throws IOException {
    BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(output, "UTF-8"));
    for (List row : csv) {
        for (Iterator 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> csv = new ArrayList>();
    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中(是的,Servlet,不要使用JSP!)你基本上可以这样做:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    String filename = request.getPathInfo().substring(1);
    List> csv = someDAO().findCsvContentFor(filename);
    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.就这样.

请注意,我添加了分别指定分隔符的可能性,因为它可能取决于所使用的语言环境,Excel是否接受逗号,或分号;作为CSV字段分隔符.请注意,我还将文件名添加到URL pathinfo,因为Redmond的团队开发的某个Web浏览器不会使用正确的文件名保存下载.

推荐阅读
喜生-Da
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有