JAVA导出CSV文件

这篇博客主要记录了使用JAVA进行CSV文件导出的过程,包括选择的类库、工具包和具体的调用方法。虽然简单,但作为备忘和分享,有助于理解JAVA导出CSV的基本操作。

自己备忘、顺便分享。方便你我他

类库

//我用的gradle 用maven的同志自己改一下。版本用哪个都一样。
compile('org.apache.commons:commons-csv:1.6')

工具包

我用的GBK格式,需要的自己改成UTF-8或者其他

import org.apache.commons.csv.CSVFormat;
import org.apache.commons.csv.CSVParser;
import org.apache.commons.csv.CSVPrinter;
import org.apache.commons.csv.CSVRecord;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;
import lombok.extern.slf4j.Slf4j;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@Slf4j
public class CsvUtil {
   
   
	// CSV文件分隔符
	private final static String NEW_LINE_SEPARATOR = "\n";
	/** CSV文件列分隔符 */
	private static final String CSV_COLUMN_SEPARATOR = ",";
	/** CSV文件列分隔符 */
	private static final String CSV_RN = "\r\n";

	/**
	 * 写入csv文件
	 * @param headers  列头
	 * @param data     数据内容
	 * @param filePath 创建的csv文件路径
	 * @throws IOException
	 **/
	public static void writeCsvWithHeader(String[] headers, List<Object[]> data, String filePath) {
   
   
		// 初始化csvformat
		CSVFormat format = CSVFormat.DEFAULT.withHeader(headers);
		try {
   
   
			// 根据路径创建文件,并设置编码格式
			FileOutputStream fos = new FileOutputStream(filePath);
			OutputStreamWriter osw = new OutputStreamWriter(fos, "GBK");
			// 创建CSVPrinter对象
			CSVPrinter printer = new CSVPrinter(osw, format);

			if (null != data) {
   
   
				// 循环写入数据
				for (Object[] lineData : data) {
   
   
					printer.printRecord(lineData);
				}
			}
			printer.flush();
			printer.close();
		} catch (IOException e) {
   
   
			e.printStackTrace()
Java实现导出CSV文件有以下两种常见场景: ### 导出到本地文件 可以直接通过输出流进行相应的数据导出,要注意“,”的问题,因为CSV文件是以逗号进行判断每个单元格。以下是示例代码: ```java import java.io.BufferedWriter; import java.io.FileWriter; import java.io.IOException; import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; public class CsvExporter { /** * 导出cvs * @param headers * @param infos * @param csvFile */ public void exportCvs(String[] headers, List<LinkedHashMap<String, Object>> infos, String csvFile) { try (BufferedWriter bw = new BufferedWriter(new FileWriter(csvFile))) { // 写入表头 bw.write(String.join(",", headers)); bw.newLine(); // 写入数据 for (Map<String, Object> info : infos) { List<String> valueList = new ArrayList<>(); for (Object value : info.values()) { if (value == null) { valueList.add(""); } else { valueList.add(value.toString()); } } for (Object data : valueList) { StringBuffer sb = new StringBuffer(); String rowStr = sb.append("\"").append(data).append("\",").toString(); bw.write(rowStr); } bw.newLine(); } } catch (IOException e) { e.printStackTrace(); } } } ``` 调用示例: ```java import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; public class Main { public static void main(String[] args) { CsvExporter exporter = new CsvExporter(); String[] headers = {"Name", "Age"}; List<LinkedHashMap<String, Object>> infos = new ArrayList<>(); LinkedHashMap<String, Object> info1 = new LinkedHashMap<>(); info1.put("Name", "John"); info1.put("Age", 25); infos.add(info1); LinkedHashMap<String, Object> info2 = new LinkedHashMap<>(); info2.put("Name", "Jane"); info2.put("Age", 30); infos.add(info2); String csvFile = "test.csv"; exporter.exportCvs(headers, infos, csvFile); } } ``` ### Web下载CSV Web下载CSV的原理和输出到本地一致,就是将`HttpServletResponse`的流内容(writer)写入到浏览器,前提是该`response`的`header`中`content-Type`要告诉浏览器以下载模式接受,具体参数参见http://blog.youkuaiyun.com/bluefish625/article/details/6659288 [^2]。 ### 编码问题 Excel在读取CSV的时候是通过读取文件头上的BOM来识别编码的,这导致如果生成CSV文件的平台输出无BOM头编码的CSV文件(例如UTF - 8,在标准中默认是可以没有BOM头的),Excel只能自动按照默认编码读取,不一致就会出现乱码问题 [^3]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值