`
hugang357
  • 浏览: 188358 次
  • 性别: Icon_minigender_2
  • 来自: 深圳
社区版块
存档分类
最新评论

一个用servlet实现导出csv文件的实例

    博客分类:
  • java
阅读更多
Java采用反射导出CSV文件替代导出Excel


package com.resoft.prophet.util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.beanutils.BeanUtils;
/**
* @作者: jack
* @日期: 2011-05-19
* @描述: CSV导出工具
*/
public class CSVUtils {
/**
* 导出为CVS文件
* 
* @param exportData
*/
public static File createCSVFile(List exportData, LinkedHashMap rowMapper, String outPutPath) {
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try {
csvFile = File.createTempFile("temp", ".csv", new File(outPutPath));
// GB2312使正确读取分隔符","
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(csvFile), "GB2312"),
1024);
// 写入文件头部
for (Iterator propertyIterator = rowMapper.entrySet().iterator(); propertyIterator.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
csvFileOutputStream.write("\"" + propertyEntry.getValue().toString() + "\"");
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
csvFileOutputStream.newLine();
// 写入文件内容
for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
Object row = (Object) iterator.next();
for (Iterator propertyIterator = rowMapper.entrySet().iterator(); propertyIterator.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator.next();
csvFileOutputStream.write("\""
+ BeanUtils.getProperty(row, propertyEntry.getKey().toString()).toString() + "\"");
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
if (iterator.hasNext()) {
csvFileOutputStream.newLine();
}
}
csvFileOutputStream.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
csvFileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
return csvFile;
}
/**
* 导出为CSV文件
* 
* @param response
* @param exportData
* @param propertyNames
* @param fileName
* @param outputPath
* @throws FileNotFoundException
*/
public static void exportToCSVFile(HttpServletResponse response, List exportData, LinkedHashMap rowMapper,
String fileName, String outputPath) throws FileNotFoundException {
File csvFile = createCSVFile(exportData, rowMapper, outputPath);
FileUtils.downFile(response, fileName, new FileInputStream(csvFile));
csvFile.delete();
}
public static void main(String[] args) {
List exportData = new ArrayList<Map>();
Map row1 = new LinkedHashMap<String, String>();
row1.put("1", "11");
row1.put("2", "12");
row1.put("3", "13");
row1.put("4", "14");
exportData.add(row1);
row1 = new LinkedHashMap<String, String>();
row1.put("1", "21");
row1.put("2", "22");
row1.put("3", "23");
row1.put("4", "24");
exportData.add(row1);
List propertyNames = new ArrayList();
LinkedHashMap map = new LinkedHashMap();
map.put("1", "第一列");
map.put("2", "第二列");
map.put("3", "第三列");
map.put("4", "第四列");
CSVUtils.createCSVFile(exportData, map, "c:/");
}
}

   上述为导出为csv的代码,rowmapper存储列头以及数据的属性字符串,通过反射,得到bean中的属性值,此hashmap为linkedhashmap,确保列头有序,该代码可以从IBatis中得到List<Map>,List<实体类>,然后统一导出。

   注意:需要注意的是写入文件时指定的是GB2312的编码,如果指定为UTF-8的编码,采用Excel打开为乱码,如果不写编码,默认为操作系统的编码,导出后采用Editplus打开为GB3212编码,考虑到服务器的默认编码可能不是客户端的中文操作系统的GB2312的编码,因此我们显示指定编码为GB2312。如果设置为UTF-8编码,Excel之所以为乱码,应该是Office程序按照操作系统的编码读取文件。

          如果采用UNICODE编码,逗号可能无法正确解析,数据将合并为一列

   对于ANSI编码用Excel可以正确打开无乱码,如果是中文windows平台,据说会转译为GB312,如果是日文的操作系统,转译为日文编码。

   对于ANSI编码和GB2312编码的区别,需要再研究。

   最近一直探索大数据量导出Excel的方案,采用导出为csv是一种比较变通的方式。

分享到:
评论
1 楼 Errorize 2014-10-13  
   

相关推荐

    CSV文件操作

    在给定的压缩包中的"一个用servlet实现导出csv文件的实例 - Java编程.mht"文件,很可能是提供了一个使用Servlet导出CSV文件的示例代码。要深入理解这个实例,你需要打开文件查看具体的Java代码,学习如何在Servlet中...

    servlet经典案例回顾增删改查

    - Servlet可能提供导出数据到CSV或Excel的功能。当用户请求导出时,Servlet会生成包含所有或特定记录的文件内容。 - 使用`OutputStream`将数据写入响应流,设置合适的MIME类型和文件名,使浏览器能够下载文件。 ...

    JasperReport+Servlet Web应用之:打印

    描述中提到"我的实例没有jar包",意味着作者可能在博客中分享了一个不包含具体库文件(如JasperReport和Servlet相关的jar包)的示例项目,而是提供了如何配置和使用这些库的指导。通常,开发者需要自行下载必要的...

    如何在jsp导出到Excel文件

    在JSP环境下实现文件导出至Excel的第一种方法较为简单,主要通过修改JSP页面的`Content-Type`属性来完成。`Content-Type`属性用于指定响应的数据类型,浏览器接收到这一信息后,会根据相应的类型处理数据。 **具体...

    java servlet写的电子商城

    Java Servlet技术是Web...总的来说,这个Java Servlet电子商城项目涵盖了Web开发的多个关键领域,包括用户认证、购物行为管理、支付集成、订单处理、邮件服务和数据展示,是学习和实践Servlet技术的一个很好的实例。

    displaytag标签相关文档、源码、实例

    DisplayTag是一个开源的Java Web开发库,用于生成复杂的表格,提供了很多高级功能,如排序、分页、国际化、导出等。它简化了在Web应用中处理表格展示的工作,极大地提高了开发效率。以下是对DisplayTag标签、源码、...

    JasperReport + Servlet Web应用之:HTML显示报表内容

    JasperReport是一个用Java编写的开源报表库,它允许开发人员设计、填充并输出各种类型的报表,如PDF、HTML、Excel、CSV等。JasperReport支持复杂的报表设计,包括分组、排序、计算以及自定义样式。报表模板通常以....

    Web报表开发技术-Eclipse Birt开发技术实例

    2. **创建报表项目**:在Eclipse中新建一个Birt报表项目,这将包含报表设计文件和相关的资源文件。 3. **设计报表**:使用Birt设计器,选择数据源(如数据库、XML文件或Web服务),编写SQL查询或使用现有数据集。...

    Java使用poi jar包读取以及web下载excle文件

    Apache POI 是一个流行的开源库,允许Java程序读写Microsoft Office格式的文件,包括Excel(.xlsx 和 .xls)。本教程将详细介绍如何使用POI库在Java中读取Excel文件,并通过Web服务器提供给用户下载。 首先,我们...

    基于java技术web环境下EXCEL的应用.pdf

    文章通过对Excel对象模型的介绍,展示了如何利用JavaBean实现Web应用中的数据处理,以及如何通过Servlet处理HTTP请求,最终将数据导出为Excel文件或从Excel文件导入数据到Web应用中。文章中举例说明了如何使用这些...

    Web报表开发技术-JFreeReport开发技术实例

    首先,JFreeReport的核心特性包括自定义模板设计、多种数据源支持(如数据库、CSV文件等)、图表生成以及灵活的数据格式化。它的灵活性和易用性使得开发者能够快速构建报表,而无需深入学习复杂的报表语言或API。 ...

    jsp mysql学生管理系统(有文档)

    “jsp mysql学生管理系统”是一个典型的Web应用程序实例,展示了JSP与MySQL如何协同工作以实现数据的动态管理和交互。通过学习和实践此类项目,开发者可以加深对Web开发、数据库管理和软件架构设计的理解,同时为更...

    JAVA实现工资管理系统

    4. 报表生成:系统应具备生成工资单和工资统计报表的能力,可能使用Java的I/O流进行文件操作,导出CSV或PDF格式的报表。 四、设计模式与原则 1. 单例模式:用于数据库连接池,确保在整个应用程序中只有一个数据库...

    ssm+easyui小案例

    6. **数据导入导出**:在业务场景中,用户可能需要导入或导出数据,例如CSV或Excel文件。在SSM+EasyUI案例中,可以通过文件上传功能接收用户上传的文件,然后利用Java处理这些文件并将其导入到数据库。反之,导出...

    基于jasperreport的java报表组件

    JasperReport是一个用Java编写的报表库,它可以生成PDF、HTML、XLS、CSV等多种格式的报表。它的灵活性在于可以通过XML设计报表模板,使得非技术人员也能进行报表布局和样式的设计。 2. **iReport集成** iReport是...

    JasperReports 报表

    1. **子报表**:允许在一个报表中嵌套另一个报表,实现复杂报表结构。 2. **图表**:JasperReports支持各种图表类型,如柱状图、饼图、线图等,可以直接从数据源生成。 3. **参数传递**:报表可以接受外部参数,...

    JasperReports,iReport制作报表

    这可能包括创建一个Servlet,该Servlet接收请求,生成报表,然后将其以特定格式返回给浏览器。在这样的项目中,你可能会看到以下关键代码片段: 1. 加载报表模板: ```java InputStream reportStream = getClass()....

    studio-3t-x64.msi.zip

    "studio-3t-x64.msi.zip"文件是一个包含32位(x86)版本的Studio 3T安装程序的压缩包,其主要子文件"studio-3t-x64.msi"是Windows操作系统上的MSI安装程序。这个安装程序使得用户能够在Windows环境下便捷地安装和配置...

    JSP基于JSP的学生信息管理系统(源代码+文档).rar

    这个基于JSP的学生信息管理系统是一个典型的JavaWeb应用实例,它展示了如何利用JSP、Servlet、数据库等技术实现一个完整的管理信息系统。通过学习和分析这个系统,开发者可以加深对JavaWeb开发的理解,提升实际项目...

Global site tag (gtag.js) - Google Analytics