最近在电信做业务的时候发现有一个导出csv文件的需求,一般导出使用POI直接导出excel即可,excel2007已经支持最多104.8万条记录,基本可以满足需求,为了尝试下导出csv文件,因此采用了导出csv文件的实现,csv即为逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),可以使用excel直接打开预览。
下面结合所使用的功能进行说明:
首先创建一个CsvUtil.java类,包括删除已生成的csv文件、测试代码,代码如下:
public class CsvUtils {
private static final org.apache.commons.logging.Log LOG = LogFactory
.getLog(CsvUtils.class);
/**
* 生成为CVS文件
*
* @param exportData
* 源数据List
* @param map
* csv文件的列表头map
* @param outPutPath
* 文件路径
* @param fileName
* 文件名称
* @return
*/
@SuppressWarnings("rawtypes")
public static File createCSVFile(List exportData, LinkedHashMap map,
String outPutPath, String fileName) {
File csvFile = null;
BufferedWriter csvFileOutputStream = null;
try {
File file = new File(outPutPath);
if (!file.exists()) {
file.mkdir();
}
// 定义文件名格式并创建
csvFile = File.createTempFile(fileName, ".csv",
new File(outPutPath));
LOG.debug("csvFile:" + csvFile);
// UTF-8使正确读取分隔符","
csvFileOutputStream = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(csvFile), "GBK"), 1024);
LOG.debug("csvFileOutputStream:" + csvFileOutputStream);
// 写入文件头部
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
.next();
csvFileOutputStream
.write("" + (String) propertyEntry.getValue() != null ? (String) propertyEntry
.getValue() : "" + "");
if (propertyIterator.hasNext()) {
csvFileOutputStream.write(",");
}
}
csvFileOutputStream.newLine();
// 写入文件内容
for (Iterator iterator = exportData.iterator(); iterator.hasNext();) {
Object row = (Object) iterator.next();
for (Iterator propertyIterator = map.entrySet().iterator(); propertyIterator
.hasNext();) {
java.util.Map.Entry propertyEntry = (java.util.Map.Entry) propertyIterator
.next();
csvFileOutputStream.write((String) BeanUtils.getProperty(
row, (String) propertyEntry.getKey()));
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;
}
/**
* 下载文件
*
* @param response
* @param csvFilePath
* 文件路径
* @param fileName
* 文件名称
* @throws IOException
*/
public static void exportFile(HttpServletResponse response,
String csvFilePath, String fileName) throws IOException {
// response.setHeader("Content-type", "application-download");
FileInputStream in = null;
OutputStream out = response.getOutputStream();
byte[] buffer = new byte[1024];
int len = 0;
response.setContentType("text/csv;charset=UTF-8");
response.setHeader("Content-Disposition", "attachment;filename="
+ URLEncoder.encode(fileName, "UTF-8"));
response.setCharacterEncoding("UTF-8");
try {
in = new FileInputStream(csvFilePath);
while ((len = in.read(buffer)) > 0) {
out.write(buffer, 0, len);
}
out.flush();
} catch (FileNotFoundException e) {
LOG.error("获取文件错误!");
} finally {
if (in != null) {
try {
in.close();
out.close();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
}
/**
* 导出
*
* @param response
* @param fileName
* @return
* @throws IOException
*/
public static void downloadFile(HttpServletRequest request,
HttpServletResponse response, String uri) throws IOException {
// 获取服务其上的文件名称
File file = new File(uri);
String name = new SimpleDateFormat("yyyyMMddHHmmss").format(new Date())
+ ".zip";
StringBuffer sb = new StringBuffer();
sb.append("attachment; filename=").append(name);
response.setHeader("Expires", "0");
response.setHeader("Cache-Control",
"must-revalidate, post-check=0, pre-check=0");
response.setHeader("Pragma", "public");
response.setContentType("application/x-msdownload;charset=UTF-8");
response.setHeader("Content-Disposition", new String(sb.toString()
.getBytes(), "ISO8859-1"));
// 将此文件流写入到response输出流中
FileInputStream inputStream = new FileInputStream(file);
OutputStream outputStream = response.getOutputStream();
byte[] buffer = new byte[1024];
int i = -1;
while ((i = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, i);
}
outputStream.flush();
outputStream.close();
inputStream.close();
}
/**
* 删除该目录filePath下的所有文件
*
* @param filePath
* 文件目录路径
*/
public static void deleteFiles(String filePath) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
files[i].delete();
}
}
}
}
/**
* 删除单个文件
*
* @param filePath
* 文件目录路径
* @param fileName
* 文件名称
*/
public static void deleteFile(String filePath, String fileName) {
File file = new File(filePath);
if (file.exists()) {
File[] files = file.listFiles();
for (int i = 0; i < files.length; i++) {
if (files[i].isFile()) {
if (files[i].getName().equals(fileName)) {
files[i].delete();
return;
}
}
}
}
}
/**
* 下载csv文件
* @param path
* @param response
*/
private void download(String path, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(
response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=gb2312");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
/**
* 测试数据
*
* @param args
*/
@SuppressWarnings({ "rawtypes", "unchecked" })
public static void main(String[] args) {
List exportData = new ArrayList<Map>();
Map row1 = new LinkedHashMap<String, String>();
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.put("1", "11");
row1.put("2", "12");
row1.put("3", "13");
row1.put("4", "14");
exportData.add(row1);
LinkedHashMap map = new LinkedHashMap();
map.put("1", "第一列");
map.put("2", "第二列");
map.put("3", "第三列");
map.put("4", "第四列");
String path = "E:/export/";
String fileName = "文件导出";
File file = CsvUtils.createCSVFile(exportData, map, path, fileName);
String fileName2 = file.getName();
LOG.debug("文件名称:" + fileName2);
}
}
由于在main方法中不能直接调用下载的方法,因此单独创建一个类来完成相关功能,创建类ExportCsvController.java,代码如下
public class ExportCsvController {
@Autowired
AccessDetailExportService accessDetailExportService;
private static final Log LOG = LogFactory.getLog(ExportCsvController.class);
@RequestMapping(value = "/exportHistory")
@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
public void exportHistory(HttpServletRequest request,
HttpServletResponse response, AccessDetailBean accessDetailBean)
throws IOException {
HttpSession session = request.getSession();
UserBean userBean = (UserBean) session.getAttribute("userbean");
if (!CommonUtil.isAdmin(userBean)) {
if (userBean == null) {
throw new RuntimeException("登陆失效,请重新登陆");
}
accessDetailBean.setUsername(userBean.getName());
}
LOG.debug("-----访问历史监控导出开始-----");
String realPath = request.getRealPath("/WEB-INF/export"); // 获取绝对路径
String path = realPath.replace("\\", "/");
String fileName = "history_"; // 定义文件名称
List exportData = new ArrayList<Map>();
Map row = new LinkedHashMap<String, String>();
LinkedHashMap map = new LinkedHashMap();
map.put("1", "用户");
map.put("2", "访问时间");
map.put("3", "ip");
map.put("4", "访问的服务");
map.put("5", "消耗时间(毫秒)");
map.put("6", "状态");
map.put("7", "长度");
int count = accessDetailExportService
.queryHistoryCount(accessDetailBean);
LOG.debug("访问历史监控总条数:" + count);
if (count <= 100000) { // 如果查询总数大于10万条,不予导出
// 查询访问历史记录
List<AccessDetailBean> detailList = accessDetailExportService
.queryHistoryInfo(accessDetailBean);
LOG.debug("-----访问历史监控数据条数-----" + detailList.size());
for (AccessDetailBean detail : detailList) { // 执行导出操作
row = new LinkedHashMap<String, String>();
row.put("1", detail.getUsername()); // 用户名
row.put("2", dateConvert(detail.getAccesstime())); // 访问时间
row.put("3", detail.getClientip()); // 访问ip
row.put("4", detail.getService()); // 访问的服务
row.put("5", detail.getCosttime()); // 消耗时间
row.put("6", statusConvert(detail.getStatus())); // 状态
row.put("7", detail.getLength()); // 长度
exportData.add(row);
}
File file = CsvUtils.createCSVFile(exportData, map, realPath,
fileName);
String fileName2 = file.getName();
LOG.debug("文件名称:" + fileName2);
this.download(path + "/" + fileName2, response);
} else { // 大于10万条不予导出
CommonUtil.writeResult(response, "记录条数大于10万,导出失败,请添加条件过滤后重试!");
}
LOG.debug("-----访问历史监控导出结束-----");
}
@RequestMapping(value = "/exportSummary")
@SuppressWarnings({ "rawtypes", "unchecked", "deprecation" })
public void exportSummary(HttpServletRequest request,
HttpServletResponse response,
AccessDetailSummaryBean accessDetailSummaryBean) throws IOException {
HttpSession session = request.getSession();
UserBean userBean = (UserBean) session.getAttribute("userbean");
if (!CommonUtil.isAdmin(userBean)) {
if (userBean == null) {
throw new RuntimeException("登陆失效,请重新登陆");
}
}
LOG.debug("-----访问历史监控导出开始-----");
String realPath = request.getRealPath("/WEB-INF/export"); // 获取绝对路径
String path = realPath.replace("\\", "/");
String fileName = "summary_"; // 定义文件名称
List exportData = new ArrayList<Map>();
Map row = new LinkedHashMap<String, String>();
LinkedHashMap map = new LinkedHashMap();
map.put("1", "访问者");
map.put("2", "访问的服务");
map.put("3", "ip");
map.put("4", "访问key次数");
map.put("5", "获取数据次数");
map.put("6", "获取数据成功次数");
map.put("7", "获取数据失败次数");
map.put("8", "总次数");
map.put("9", "数据大小");
int count = accessDetailExportService
.querySummaryCount(accessDetailSummaryBean);
LOG.debug("访问历史统计记录总条数:" + count);
if (count <= 100000) { // 如果查询总数大于10万条,不予导出
// 查询访问历史记录
List<AccessDetailSummaryBean> summaryList = accessDetailExportService
.querySummaryInfo(accessDetailSummaryBean);
LOG.debug("-----访问历史监控数据条数-----" + summaryList.size());
for (AccessDetailSummaryBean summary : summaryList) { // 执行导出操作
row = new LinkedHashMap<String, String>();
row.put("1", summary.getVisitor()); // 访问者
row.put("2", summary.getVisitedServer()); // 访问的服务
row.put("3", summary.getClientIp()); // ip
row.put("4", summary.getVisitKeyTime()); // 访问key次数
row.put("5", summary.getGainDataTime()); // 获取数据次数
row.put("6", summary.getSuccessTime()); // 获取数据成功次数
row.put("7", summary.getFailTime()); // 获取数据失败次数
row.put("8", summary.getSumTime()); // 总次数
row.put("9", summary.getDataVolume()); // 数据大小
exportData.add(row);
}
File file = CsvUtils.createCSVFile(exportData, map, path, fileName);
String fileName2 = file.getName();
LOG.debug("文件名称:" + fileName2);
this.download(path + "/" + fileName2, response);
} else { // 大于10万条不予导出
CommonUtil.writeResult(response, "记录条数大于10万,导出失败,请添加条件过滤后重试!");
}
LOG.debug("-----访问历史监控导出结束-----");
}
/**
* 成功失败状态转换
*
* @param status
* @return
*/
public String statusConvert(Integer status) {
String flag = null;
if (status == 0) {
flag = "成功";
} else {
flag = "失败";
}
return flag;
}
/**
* 日期格式转换
*
* @param date
* @return
*/
public String dateConvert(long date) {
// 设置日期格式
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
// 转为日期格式
Date newDate = new Date(date);
// 最终日期
String finalDate = sdf.format(newDate);
return finalDate;
}
/**
* 下载csv文件
* @param path
* @param response
*/
private void download(String path, HttpServletResponse response) {
try {
// path是指欲下载的文件的路径。
File file = new File(path);
// 取得文件名。
String filename = file.getName();
// 以流的形式下载文件。
InputStream fis = new BufferedInputStream(new FileInputStream(path));
byte[] buffer = new byte[fis.available()];
fis.read(buffer);
fis.close();
// 清空response
response.reset();
// 设置response的Header
response.addHeader("Content-Disposition", "attachment;filename="
+ new String(filename.getBytes()));
response.addHeader("Content-Length", "" + file.length());
OutputStream toClient = new BufferedOutputStream(
response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=gb2312");
toClient.write(buffer);
toClient.flush();
toClient.close();
} catch (IOException ex) {
ex.printStackTrace();
}
}
对于页面可以直接通过jsp+JavaScript来完成:
<a href="javascript:void(0);" class="easyui-linkbutton"
data-options="iconCls:'icon-save',plain:false"
onclick="exportHistory();">导出</a>
/**导出访问历史记录*/
function exportHistory() {
var username = $('#username').val();
var accesstimeStart=$('#accesstimeStart').datebox('getValue');
var accesstimeEnd=$('#accesstimeEnd').datebox('getValue');
var clientip = $('#clientip').val();
var service = $('#service').val();
var status = $('#status').val();
var costtimeStart = $('#costtimeStart').val();
var costtimeEnd = $('#costtimeEnd').val();
window.location.href = $("#proPath").val() + "/export/exportHistory?username=" + username + "&accesstimeStart=" + accesstimeStart +
"&accesstimeEnd=" + accesstimeEnd + "&clientip=" + clientip + "&service=" + service + "&costtimeStart=" +costtimeStart
+ "&costtimeEnd" + costtimeEnd;
}
至此一个导出并下载csv文件的功能即实现了。
相关推荐
2.生成csv,中文无乱码,数据不会科学计数法; 3.支持大数据下载; 4.后台服务java语言实现,前端不限制; 5.前端代码: [removed]void(0)" class="layui-btn"> <i class="fa fa-refresh"> 导出Excel ...
首先,我们需要了解如何在Java中生成CSV文件。CSV文件主要由一系列行组成,每行包含一个或多个以逗号分隔的值。在Java中,我们可以使用`BufferedWriter`或者`PrintWriter`来创建和写入这些文件。例如: ```java ...
下面将详细解释如何使用Java生成CSV文件,以`CSVUtils`类为例进行说明。 首先,`CSVUtils`类通常包含用于生成CSV文件的核心方法。在给出的代码中,`createCSVFile`方法是生成CSV文件的主要入口。该方法接收四个参数...
在Java编程中,导出CSV(Comma Separated Values)和Excel...总之,Java提供了丰富的库来处理CSV和Excel文件,通过适当的方法,可以轻松地实现在服务器端生成文件并直接下载到客户端,而无需在服务器上保存临时文件。
Java生成CSV文件的核心在于将数据逐行写入文件,每行数据由字段值(通过反射获取)组成,并以逗号分隔。通过使用`OutputStreamWriter`和`FileOutputStream`,我们可以控制文件的编码和输出。这个过程不仅高效,而且...
- **灵活性**:Java可以灵活地控制文件的生成过程,例如自定义分隔符、编码、换行符等。 - **可扩展性**:Java代码可以轻松处理大量数据,适合批处理任务。 - **跨平台兼容**:CSV文件在任何操作系统上都能正确...
本教程将详细介绍如何使用POI库在Java中读取Excel文件,并通过Web服务器提供给用户下载。 首先,我们需要在项目中引入Apache POI的jar包。你可以通过Maven或Gradle来管理依赖。如果是Maven,可以在pom.xml文件中...
- 导出数据:从数据库查询结果生成CSV文件,通常涉及遍历查询结果集,然后逐行写入CSV文件。 4. **Servlet实现CSV文件导出**: - 创建HTTP响应:使用Servlet响应对象设置正确的MIME类型(如`text/csv`)和文件...
4. **文件保存与输出**:生成每个文档后,需要将其保存到本地或者服务器的指定位置,或者直接以流的形式发送给客户端下载。PageOffice提供了丰富的文件操作接口,可以方便地完成这一步。 5. **优化性能**:在处理...
- **安装**:首先,你需要下载并安装FusionCharts的Java库,将其添加到项目类路径中。 - **集成**:然后,通过Java代码导入必要的包,初始化FusionCharts对象,并设置图表的属性,如标题、数据源、图例等。 - **...
在这个实例中,我们将探讨如何使用Servlet来生成CSV(Comma Separated Values)文件,这是一种常见的数据交换格式,广泛应用于数据导入和导出操作。CSV文件易于读取,支持多种应用程序,如电子表格软件。 首先,...
通过编写Java程序,连接到Chrome的浏览历史数据库,提取数据,然后将其写入文本文件,可以实现“获取浏览器上网记录并生成文本”的目标。在实际应用中,还应考虑到隐私保护和合规性,确保数据的安全使用。
React获取Java后台文件流并下载Excel文件流程解析是指在React前端应用程序中,通过axios库发送POST请求到Java后台服务器,以获取Excel文件流,并将其下载到本地计算机中。该过程涉及到Java后台服务器的响应头设置、...
标题中的“jasperreport生成pdf实现下载与打印”是指使用JasperReports库来创建PDF报告,并提供下载和打印功能。JasperReports是一个开源的Java报表工具,它允许开发者设计、生成和导出各种类型的报表,包括PDF、...
例如,可以使用Apache POI库来生成Excel文件,或者使用OpenCSV库来生成CSV文件。生成文件后,可以调用上面提到的下载方法来提供下载。 总的来说,"struts2文件上传下载"涵盖了Web开发中的基础功能,对于任何需要...
在描述中提到,通常在Web应用中,通过创建CSV文件并以MIME类型返回给浏览器来间接访问Excel文件,但这并不允许对Excel进行直接操作。文章介绍了一个名为Java Excel API的开源项目,它使得Java开发者能够方便地处理...
- **动态生成下载内容**:不同于传统的文件下载,这里的“动态生成”意味着文件内容可能不是预先存在的,而是根据某些条件在服务器端即时生成的,比如从数据库中提取数据,组合成Excel或CSV格式供用户下载。...
使用Grails的`response`对象,设置合适的HTTP头信息,指示浏览器下载文件。然后,使用`response.outputStream`写入CSV内容。例如: ```groovy response.contentType = "text/csv" response.setHeader("Content-...
例如,服务器端可能需要生成HTML、JSON或CSV文件并提供给客户端下载。这通常通过HTTP响应头的控制实现,比如设置`Content-Disposition`为`attachment`来触发浏览器的下载行为。 另外,`java.nio`包提供了更高级的...
这个Action接收文件名作为参数,并返回一个`FilePathResult`,指示浏览器下载指定路径的文件。同时,我们使用自定义的`DeleteFileAttribute`过滤器确保文件在下载完成后被删除。 ```csharp [HttpGet] ...