一。构建CsvUtil
.csv格式可以导出数据行数没有限制,如果打开方式选择的EXCEL格式则会受到Excel的最大行数的限制,但是数据依然是存在的,如果是用txt或者使用notepad打开则可以显示所有的数据
<dependency>
<groupId>net.sourceforge.javacsv</groupId>
<artifactId>javacsv</artifactId>
<version>2.0</version>
</dependency>
public class CsvUtil {
public interface WriteCsv {
void write(CsvWriter csvWriter) throws Exception;
}
public static void writeCsv(String fileName,HttpServletResponse response, CsvUtil.WriteCsv writeCsv){
try {
// 创建临时文件
File tempfile = File.createTempFile(fileName, ".csv");
// 创建 CsvWriter 对象
CsvWriter csvWriter = new CsvWriter(tempfile.getCanonicalPath(),',', Charset.forName("GBK"));
// 接口需要实现的方法
writeCsv.write(csvWriter);
// 关闭 CsvWriter 对象
csvWriter.close();
// 获取写入数据的临时文件
File fileLoad=new File(tempfile.getCanonicalPath());
// 返回给前端
CsvUtil.downLoadCsv(fileName+".csv", fileLoad, response);
}catch (Exception e){
e.printStackTrace();
}
}
public static void downLoadCsv(String fileName, File fileLoad, HttpServletResponse response) {
try {
byte[] b=new byte[1024];
OutputStream out=response.getOutputStream();
response.reset();
response.setContentType("application/csv");
response.setHeader("content-disposition", "attachment; filename="+ URLEncoder.encode(fileName, "UTF-8"));
Long filelength=fileLoad.length();
response.setHeader("Content_Length",String.valueOf(filelength));
FileInputStream fileInputStream=new FileInputStream(fileLoad);
int n;
while ((n = fileInputStream.read(b)) != -1) {
out.write(b, 0, n); //每次写入out1024字节
}
fileInputStream.close();
out.close();
} catch (IOException e) {
try {
throw new Exception(e.getMessage());
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
}
二、在Controller层调用
controller层定义返回值为void
String[] headers={"列名1","列名2","列名3","列名4","列名5","列名6","列名7","列名8"};
// 调用service层获取list集合
List<T> list = Service.getList();
CsvUtil.writeCsv("文件名", response, new CsvUtil.WriteCsv() {
@Override
public void write(CsvWriter csvWriter) throws Exception {
csvWriter.writeRecord(headers1);
if (list!=null && !list.isEmpty()){
// 遍历List集合,将每条数据对应写入
for (DiguaUserActionTO data:list) {
csvWriter.write(data.getResName());
csvWriter.write(data.getPv3());
csvWriter.write(data.getUv3());
csvWriter.write(data.getPv15());
csvWriter.write(data.getUv15());
csvWriter.write(date);
csvWriter.endRecord();
}
}
}
});
三、以流的形式输出到指定目录
public static void downLoadCsv(String fileName, File fileLoad){
try {
byte[] b=new byte[1024];
FileOutputStream out = new FileOutputStream(fileName);
FileInputStream fileInputStream=new FileInputStream(fileLoad);
int n;
while ((n = fileInputStream.read(b)) != -1) {
out.write(b, 0, n); //每次写入out1024字节
}
fileInputStream.close();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
解决数字超过12位后,excel打开数字科学计数的问题:
- csvWriter.writeRecord(Array,true)
- 每个Array元素中添加\t制表符