`

[Java]如何使CSV内的中文支持EXCEL格式(UTF-8 BOM)

    博客分类:
  • Java
阅读更多

1.EXCEL比较特殊,使用的是UTF-8 BOM的格式,而使用apache Commons csv library用的是UTF-8,会使中文乱码.

 

2.解决办法有二:

核心是写入byte[]的头:{ (byte) 0xEF, (byte) 0xBB, (byte) 0xBF }

第一种是先新建一个文件,写入头,然后再拼接CSVPrinter的内容:

//Add UTF-8 BOM header
			File csvFile = new File(csv_path);
			try {
				fos = new FileOutputStream(csvFile, false);
				fos.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
				fos.flush();
			} catch (FileNotFoundException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			//Write CSV
			try (Writer out = new FileWriter(csv_path,true); 
					CSVPrinter printer = new CSVPrinter(out, CSVFormat.EXCEL.withQuote(null).withHeader(
							csvSP.getSearchTime(),searchCriteria
							));
					CSVPrinter printers = new CSVPrinter(out, CSVFormat.EXCEL.withHeader(
							Constant.Col_REQ_ID,Constant.Col_SENDER_DOMAIN,Constant.Col_SENDER,Constant.Col_RECEIVER_DOMAIN,
							Constant.Col_RECIPIENT,Constant.Col_RECIPIENT_IMEI,Constant.Col_RECIPIENT_OPER_CODE,Constant.Col_DIRECTION,
							Constant.Col_CHANNEL,Constant.Col_SUBMIT_TIME,Constant.Col_DELIVER_TIME,Constant.Col_MSG_STATUS,
							Constant.Col_TEXT_CONTENT,Constant.Col_MEDIA_FILE
							))
				) {
				for (CsvModel csv : csvResult) {
					List<String> records = new ArrayList<>();
					records.add(csv.getRequestId());
					records.add(csv.getSenderDomain());
					records.add(csv.getSenderNo());
					printers.printRecord(records);
				}		

 通过new FileWriter(csv_path,true)保持原来内容并拼接.

 

第二种则完全不用Commons,自己拼接:

 

public static void SaveInformativeFile(String content, String Path, String fileName, boolean isFirst) {
		OutputStreamWriter fw = null;
		BufferedWriter writer = null;
		if (content == null || content.equals("")) {
			return;
		}
		try {
			String filepath = Path + File.separator + fileName;
			File informativeFile = new File(filepath);

			FileOutputStream fos = null;
			if (isFirst) {
				fos = new FileOutputStream(informativeFile, false);

				fos.write(new byte[] { (byte) 0xEF, (byte) 0xBB, (byte) 0xBF });
				fos.flush();
			} else {
				fos = new FileOutputStream(informativeFile, true);
			}

			fw = new OutputStreamWriter(fos, "UTF-8");
			writer = new BufferedWriter(fw);
			if (isFirst) {
				String title = "\"" + "ZONE" + "\",\"" + "TACKING ID" + "\",\"" + "CAMPAIGN CD" + "\",\"" + "CHANNEL"
						+ "\",\"" + "SMS SENDER" + "\",\"" + "START DATE" + "\",\"" + "END DATE" + "\",\""
						+ "MESSAGE CODE" + "\"" + "\n";
				writer.write(title);
				writer.flush();
			}

			writer.write(content);
			writer.flush();
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (writer != null) {
				try {
					writer.close();
				} catch (IOException e) {
					e.printStackTrace();
				}
			}
		}
	}

 

 

分享到:
评论

相关推荐

    Java避免UTF-8的csv文件打开中文出现乱码的方法

    Java避免UTF-8的csv文件打开中文出现...Java避免UTF-8的csv文件打开中文出现乱码的方法是使用UTF-16LE编码格式,并在文件头部输出BOM。同时,需要考虑Excel版本的兼容性问题,以确保csv文件可以正确地被打开和读取。

    bat脚本将csv格式UTF-8批量转ANSI

    这是因为Excel默认可能不支持或识别UTF-8编码,尤其是不带BOM(Byte Order Mark)的UTF-8文件。解决这个问题的方法是将这些文件转换为Excel更友好的ANSI编码。 在提供的文件列表中,有两个批处理脚本文件: 1. `run...

    添加或删除 xml CSV UTF-8 bom头文件

    添加或删除 xml CSV UTF-8 bom头文件

    C#写入文件加上bom头,主要适用于utf8文件

    在UTF-8编码中,BOM是一个由三个字节组成的序列:0xEF, 0xBB, 0xBF,它位于文件的开头,用来表明该文件采用的是UTF-8编码。在C#编程中,有时我们需要在写入UTF-8文件时添加这个BOM头,以确保其他程序或系统能正确...

    将csv文件ANSI格式转UTF-8

    标题"将csv文件ANSI格式转UTF-8"指的是一个转换过程,其中ANSI是Windows操作系统中默认的编码格式,通常代表本地化版本的ASCII,而UTF-8是一种更通用的Unicode编码,可以表示世界上几乎所有的字符集。 描述中的...

    Excel格式转换工具-标准版.7z CSV-EXCEL-PDF-WORD 各种文件格式互转

    CSV-EXCEL-PDF-WORD 各种文件格式互转 CSV-EXCEL-PDF-WORD 各种文件格式互转 CSV-EXCEL-PDF-WORD 各种文件格式互转 CSV-EXCEL-PDF-WORD 各种文件格式互转 CSV-EXCEL-PDF-WORD 各种文件格式互转 CSV-EXCEL-PDF-WORD ...

    Python使用pandas读取csv文件支持utf-8和gbk编码自动识别

    Python 简单使用 pandas 读取excel 的 csv文件处理,支持utf-8和gbk编码自动识别。

    utf-8 去除bom头文件

    "BOM"是Byte Order Mark的缩写,UTF-8的BOM头是一个特殊的三位字节序列(0xEF, 0xBB, 0xBF),用于标识文件是以UTF-8编码的。然而,在某些情况下,这个BOM头可能会引起问题,例如在编程或文本处理时,因此我们需要...

    VBA Fans读取和写入UTF-8格式文本文件

    如果频繁处理UTF-8文件,可以考虑使用如`VBA7.Filesystem`这样的库,它提供了对UTF-8文件更方便的支持。 7. **实际应用** 这种技术在处理CSV文件、日志文件或从网络下载的文本数据时非常有用,特别是当这些数据...

    java获取文件编码(判断有无BOM)

    BOM是UTF-8、UTF-16和UTF-32等编码格式中的一个可选标记,用于告知解析器文件的编码类型。例如,UTF-8的BOM是三个字节(0xEF, 0xBB, 0xBF),而UTF-16LE和UTF-16BE的BOM分别是两个字节(0xFF, 0xFE)和(0xFE, 0xFF...

    批量文件转码工具(支持 GBK,UTF-8 转换)

    在这个场景中,我们讨论的是一个专门用于批量转换的工具,它支持GBK和UTF-8这两种常见的字符编码格式。 GBK编码是GB2312编码的扩展,主要在中国大陆广泛使用,涵盖了大部分简体中文字符。UTF-8则是一种国际通用的...

    文本文件编码转换:ANSI、Unicode、UTF-8相互转换(修改版)

    ANSI --&gt; UTF-8 Unicode --&gt; ANSI Unicode --&gt; UTF-8 UTF-8 --&gt; ANSI UTF-8 --&gt; Unicode UTF-8 --&gt; Unicode big endian ansi转别的,不检验BOM,一律作为ansi编码进行转换 unicode转别的,首先检验BOM,不合格不...

    zh-cn-utf8

    3. **数据库连接**:在连接MySQL等数据库时,应设置字符集为`utf8mb4`,这是MySQL对UTF-8的扩展,支持四字节的Unicode字符,包括表情符号。 4. **HTML meta标签**:在HTML文档的`&lt;head&gt;`部分添加`&lt;meta charset="...

    UTF8-无BOM转为UTF16LE

    例如,"phonebook_export_unicode_L.csv"可能是使用UTF16LE编码的电话簿数据,而"phonebook_export_utf8.csv"和"phonebook_export_utf8_noBOM.csv"则是使用UTF8编码的,后者没有BOM。 在实际应用中,例如在跨平台的...

    java实现批量excel转csv

    java实现批量excel转csv,其中csv文件为utf-8格式,支持直接导入数据库。

    自动拆分csv文件,并存储为utf-8格式的csv文件

    python使用pandas,根据输入分组名,自动分割csv文件,并存储为utf-8格式,多少种分组就自动存多少个文件,即开即用 也可做为pandas操作csv文件的学习材料,代码几乎每条语句都有注释

    jmeter5.0官网utf-8编码

    - 在处理国际化内容时,UTF-8编码是标准选择,因为它支持几乎所有的字符集,包括中文字符。 - 如果JMeter的源码不是以UTF-8编码,可能会导致在处理包含非ASCII字符的请求或响应时出现乱码。 - 修改为UTF-8编码后...

    Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题

    ### Python利用 utf-8-sig 编码格式解决写入 csv 文件乱码问题 #### 一、背景介绍 在处理包含非英文字符的数据时,尤其是使用 Python 的 `csv` 模块来操作 CSV 文件时,可能会遇到字符编码问题,导致中文等非英文...

    java读写csv文件,中文乱码问题

    4. **处理BOM头**:UTF-8有带BOM和不带BOM两种形式,如果文件开头带有BOM标记,可能需要在读取时进行特殊处理,因为某些库可能不支持带BOM的UTF-8。 5. **使用第三方库**:有一些Java库,如OpenCSV、Apache Commons...

Global site tag (gtag.js) - Google Analytics