一、中文乱码问题

默认情况下,在windows上用excel打开csv文件时,并不是按utf-8码解析的,就算代码里设置了写入字符串为utf-8字符集,也可能乱码。

需要在文件头写入几个特殊的字节,做为utf-8的BOM头。

        /**
* utf-8的bom头
*/
byte[] UTF8_HEADER_BOM = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF};

建议导出后,用一些编辑工具查看16进制格式,确认前3个字节是否ef bb bf

二、大数字被显示为科学计数法的问题

一些产品编码,比如100000000001,打开后,会变成:

可在文本后加\t解决

三、海量数据写入时如何避免OOM

通常我们会把内容先拼成一个String,然后一次性写入,如果数据量巨大,比如上千万,一次性拼接很容易造成OOM。可以借用内存映射(NIO中的技术)优化。

        RandomAccessFile file = new RandomAccessFile(csvFileName, "rw");
FileChannel channel = file.getChannel();
MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), UTF8_HEADER_BOM.length);
mappedByteBuffer.put(UTF8_HEADER_BOM);

  

完整示例:

    /**
* csv写入示例(菩提树下的杨过 http://yjmyzz.cnblogs.com)
*
* @throws IOException
*/
private static void testCsv() throws IOException {
/**
* utf-8的bom头
*/
byte[] UTF8_HEADER_BOM = new byte[]{(byte) 0xEF, (byte) 0xBB, (byte) 0xBF}; String csvFileName = "D:\\temp\\test.csv";
FileUtils.deleteQuietly(new File(csvFileName)); RandomAccessFile file = new RandomAccessFile(csvFileName, "rw");
FileChannel channel = file.getChannel(); byte[] header = "编号,品名,时间戳\n".getBytes("UTF-8"); //写入utf8的bom头,防止打开csv时显示乱码
MappedByteBuffer mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), UTF8_HEADER_BOM.length);
mappedByteBuffer.put(UTF8_HEADER_BOM); //写入标题栏
mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), header.length);
mappedByteBuffer.put(header); //分批写入记录(每批1000条)-防止OOM
long timestamp = System.currentTimeMillis();
for (int i = 1; i <= 100; i++) {
StringBuilder sb = new StringBuilder();
for (int j = 1; j <= 1000; j++) {
sb.append(i * j + "\t,");
sb.append("产品" + j + ",");
sb.append(timestamp + "\t\n");
}
byte[] data = sb.toString().getBytes("UTF-8");
mappedByteBuffer = channel.map(FileChannel.MapMode.READ_WRITE, file.length(), data.length);
mappedByteBuffer.put(data);
} //关闭通道
channel.close();
}

导出效果:

csv文件导出注意事项的更多相关文章

  1. python使用pymongo访问MongoDB的基本操作,以及CSV文件导出

    1. 环境. Python:3.6.1 Python IDE:pycharm 系统:win7 2. 简单示例 import pymongo # mongodb服务的地址和端口号mongo_url = ...

  2. php 用csv文件导出大量数据初方案

    背景:接手的项目中支持导出一批数据,全数量在50W左右.在接手的时候看代码是直接一次查询MySQL获得数据,然后用header函数直接写入csv,用户开始导出则自动下载.但是,在全导出的时候,功能出现 ...

  3. CSV文件导出2

    public void exportCSVFile( HttpServletResponse response, ResultSet rs,String fileName,String headers ...

  4. csv文件导出

    参考博客:http://www.cnblogs.com/mingforyou/p/4103132.html 导入jar包javacsv.jar 链接:http://pan.baidu.com/s/1i ...

  5. ifix历史数据(H04/H08/H24)转换为CSV文件导出

    在最近的一次环保数据维护中,由于自己疏忽导致数据库中TP值并未有效记录,还好历史趋势有相关记录,问题是我该如何将.H24文件记录导出?在逛论坛后,无意发现一款工具解决了我的燃眉之急-HTD2CSV.e ...

  6. [转载] php用csv文件导出大量数据

    header ( "Content-type:application/vnd.ms-excel" ); header ( "Content-Disposition:fil ...

  7. 每日学习心得:Linq解决DataTable按照某一列的值排序问题/DataTable 导出CSV文件/巧用text-overflow解决数据绑定列数据展示过长问题

    2013-8-5 1 Linq解决DataTable按照某一列的值排序 在之前的总结中提到过对拼接而成的复合的DataTable按照某一列值的大小排序,那个主要的思想是在新建表结构时将要排序的那一列的 ...

  8. thinkphp导出csv文件,用表格输出excel

    1.thinkphp导出csv文件 导出csv文件可能就那几行代码,今天有个问题困扰我好久,就是导出之后出现一些html代码,这个不应该,view里面是空的,controller中最后也没有$this ...

  9. es实战之数据导出成csv文件

    从es将数据导出分两步: 查询大量数据 将数据生成文件并下载 本篇主要是将第二步,第一步在<es实战之查询大量数据>中已讲述. csv vs excel excel2003不能超过6553 ...

  10. Java 导出Excel xlsx、xls, CSV文件

    通用导出功能: 1.支持Excel xlsx.xls 2.支持CSV文件导出 3.数据库查询分页导出.内存导出 4.支持大批量数据导出 使用步骤如下 导入jar <dependency> ...

随机推荐

  1. Android去掉默认的标题栏

    去掉默认的标题栏:在onCreate方法里添加supportRequestWindowFeature(Window.FEATURE_NO_TITLE); @Override protected voi ...

  2. 工具 | ysoSimple

    0x00 简介 ysoSimple是一款简易的Java漏洞利用工具,集成Java反序列化,Hessian反序列化,XStream反序列化,SnakeYaml反序列化,Shiro550,JSF反序列化, ...

  3. 【工具】FFmpeg|压缩视频,500MB变25MB(有损,支持 Windows、Linux、macOS 各个平台)

    参考: 如何将一分钟长的1080p视频压缩至5MB以内?-知乎-滔滔清风 近期HEVC扩展备用安装方法-B站-悲剧天下 总共三个步骤,安装FFmpeg.运行指令.打开视频. 亲测 500MB 变 25 ...

  4. 【BUG】PHP Warning: ‘C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll‘ 14.0 is not compatible with this PHP bu

      当使用PHP8.0时,你可能会遇到这个报错: PHP Warning: 'C:\\WINDOWS\\SYSTEM32\\VCRUNTIME140.dll' 14.0 is not compatib ...

  5. CANopen TPDO 配置详解:对象 1800h、1A00h 与实践指南

    CANopen TPDO 配置详解:对象 1800h.1A00h 与实践指南 目录 CANopen TPDO 配置详解:对象 1800h.1A00h 与实践指南 目录 引言 TPDO 通讯参数详解 ( ...

  6. 1+2+...+n

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M 题目描述 求1+2+3+...+n,要求不能使用乘除法.for.while.if.else.switch.cas ...

  7. excel/wps, 转code128字体宏, 部分字符串出现空格, 导致条码断裂无法扫描的解决方案

    原宏是网上抄的, 传播比较广的那个. 后来发现, 部分条码出现空格断裂, 导致PDA无法扫描, 经搜索在一个帖子里, 发现是因为: 宏计算条码时, 会出现校验位刚好是空格的情况, 而空格在code12 ...

  8. 【pr】眨眼特效

    来源 这个后半段 步骤 新建一段黑场视频 效果->网格化->边角的两个数值调整很大(4000,4000),现在黑场只剩下一个白色十字架. 效果控件->网格->锚点->第一 ...

  9. 「Note」数据结构方向 - 数据结构进阶

    1. 平衡树(FHQ-Treap) 1.1. 介绍 功能强大的平衡树,以至于我根本没学 Treap 以及 Splay(LCT 里的另谈),缺点就大概是常数大. FHQ-Treap 核心操作在于分裂与合 ...

  10. Python基础—初识函数(二)

    1.给函数参数增加元信息 写好一个函数,然后想为这个函数的参数增加一些额外的信息,这样的话其他使用者就能清楚的知道这个函数应该怎么使用. 使用函数参数注解是一个很好的办法,它能提示程序员应该怎样正确使 ...