你是否需要将网页上的数据保存到Excel中?很多时候,我们只是想快速导出一些数据,不想引入复杂的库。其实用纯JavaScript就能轻松实现这个功能,而且效果很好。
CSV是一种简单的文件格式,用逗号分隔数据,每行代表一条记录。Excel可以直接打开这种文件,把它显示成表格形式。
实现CSV导出只需要三个步骤:
把数据转换成CSV格式的文本
创建文件对象
触发浏览器下载
下面是完整的代码示例:
// 示例数据:文章列表
const posts = [
  {
    id: 1,
    title: '用 Vite 搭建 react 18 项目',
    link: 'https://example.com/vite-react18',
    img: 'https://example.com/cover/vite-react.jpg',
    views: 12034
  },
  {
    id: 2,
    title: 'Tailwind css 3 响应式布局技巧',
    link: 'https://example.com/tailwind-layout',
    img: 'https://example.com/cover/tailwind.jpg',
    views: 8721
  },
  {
    id: 3,
    title: '深入浅出浏览器事件循环',
    link: 'https://example.com/event-loop',
    img: 'https://example.com/cover/event-loop.jpg',
    views: 15003
  }
];
// 表头映射
const headers = ['id', '名称', '链接', '图片', '阅读'];
// 处理特殊字符,防止CSV格式错误
function escapeCSV(value) {
  const str = String(value);
  // 如果包含逗号、引号或换行符,需要用引号包围
  if (str.includes(',') || str.includes('"') || str.includes('\n')) {
    return `"${str.replace(/"/g, '""')}"`;
  }
  return str;
}
// 生成CSV内容
const csvContent = [
  headers.join(','), // 表头行
  ...posts.map(item => [
    escapeCSV(item.id),
    escapeCSV(item.title),
    escapeCSV(item.link),
    escapeCSV(item.img),
    escapeCSV(item.views)
  ].join(','))
].join('\n');
// 添加BOM头,解决Excel中文乱码问题
const bom = '\uFEFF';
const blob = new Blob([bom + csvContent], { type: 'text/csv;charset=utf-8;' });
// 创建下载链接
const link = document.createElement('a');
const url = URL.createObjectURL(blob);
link.href = url;
link.download = `文章信息_${new Date().toISOString().slice(0, 10)}.csv`;
link.style.display = 'none';
// 触发下载
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
URL.revokeObjectURL(url);处理特殊字符
CSV文件有简单的规则:字段中包含逗号、引号或换行符时,需要用双引号包围。如果字段中有双引号,需要转义成两个双引号。我们的escapeCSV函数就是做这个工作的。
这个处理还有一个重要作用:防止CSV注入攻击。如果有人在你导出的数据中输入=1+1这样的内容,Excel会把它当作公式执行。经过我们的转义处理,这种风险就被消除了。
解决中文乱码
在Windows版的Excel中,直接打开UTF-8编码的CSV文件可能会显示乱码。我们在文件开头添加了BOM头(\uFEFF),告诉Excel这是UTF-8编码的文件,这样中文就能正常显示了。
创建下载链接
我们使用Blob对象把文本转换成文件,然后用URL.createObjectURL生成临时链接。通过设置<a>标签的download属性,浏览器就知道要下载文件而不是跳转页面。
下载完成后,记得移除临时创建的元素并释放URL对象,这样可以避免内存泄漏。
你可以立即测试这个功能:
打开任意网页
按F12打开开发者工具
切换到Console(控制台)
将上面的完整代码复制粘贴进去,按回车运行
你会立即看到一个CSV文件被下载到电脑中。用Excel或WPS打开它,数据整齐排列,中文显示正常。
为了在实际项目中更方便地使用,我们可以把这个功能封装成一个函数:
function exportToCSV(data, headers, filename) {
  // 处理数据,生成CSV内容
  const escapeCSV = (value) => {
    const str = String(value);
    if (str.includes(',') || str.includes('"') || str.includes('\n')) {
      return `"${str.replace(/"/g, '""')}"`;
    }
    return str;
  };
  
  const headerNames = headers.map(h => h.label || h);
  const headerKeys = headers.map(h => h.key || h);
  
  const csvContent = [
    headerNames.join(','),
    ...data.map(item => 
      headerKeys.map(key => escapeCSV(item[key])).join(',')
    )
  ].join('\n');
  
  // 创建并触发下载
  const bom = '\uFEFF';
  const blob = new Blob([bom + csvContent], { type: 'text/csv;charset=utf-8;' });
  const link = document.createElement('a');
  const url = URL.createObjectURL(blob);
  link.href = url;
  link.download = filename || `export_${new Date().toISOString().slice(0, 10)}.csv`;
  link.style.display = 'none';
  
  document.body.appendChild(link);
  link.click();
  document.body.removeChild(link);
  URL.revokeObjectURL(url);
}
// 使用示例
const headers = [
  { key: 'id', label: 'ID' },
  { key: 'title', label: '标题' },
  { key: 'views', label: '阅读量' }
];
// 调用函数导出数据
exportToCSV(posts, headers, '文章数据.csv');这个封装后的函数更加灵活,可以指定要导出的字段和对应的显示名称。
这种纯JavaScript导出CSV的方法适用于:
后台管理系统中的数据导出
报表数据的下载
用户操作记录的导出
任何需要简单数据导出的场景
它的优点是零依赖、体积小、速度快,在现代浏览器中都能正常工作。
CSV格式虽然简单通用,但也有一些限制:
不支持单元格样式
不支持多工作表
不支持复杂的数据类型
如果需要这些高级功能,可以考虑使用专门的库如SheetJS,但这会增加项目体积。
用纯JavaScript导出CSV文件其实很简单。核心就是理解CSV的文本格式,然后用Blob对象和下载链接触发浏览器下载。这种方法不需要任何外部库,代码量少,性能好,能满足大部分基本的数据导出需求。
掌握了这个技术后,你可以在任何JavaScript项目中轻松实现数据导出功能,无论是React、vue还是原生JavaScript项目。
本文内容仅供个人学习/研究/参考使用,不构成任何决策建议或专业指导。分享/转载时请标明原文来源,同时请勿将内容用于商业售卖、虚假宣传等非学习用途哦~感谢您的理解与支持!
PC端上传文件多半用插件,引入flash都没关系,但是移动端要是还用各种冗余的插件估计得被喷死,项目里面需要做图片上传的功能,既然H5已经有相关的接口且兼容性良好,当然优先考虑用H5来实现。
 首先我们定义一个input标签type=file、然后我们定义一个jsReadFiles的方法将文件作为参数;当上传文件的时候读取这个文件。图片上传成功,只是图片路径变成了base64编码的形式。
HTML5读取文件主要利用的就是FileReader这个API,它的使用需要从一个构造函数开始,保存文件的关键是生成文件对象,可以使用URL.createObjectURL()方法实现,该方法能返回给定对象的URL,用在<a>标签的href属性上就可以创建可下载的文件链接。
 在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点。
 比如我写了一个JS文件,这个文件需要调用另外一个JS文件,该如何实现呢?这篇文章主要介绍:在js文件中引入另一个js文件的实现
 最近有这样一个需求,就是在HTML页面中有个按钮导出,点击它,将构造一个文档并存储到本地文件系统中。另外还有个按钮,点击它,从本地文件系统中读取一个文件并对内容进行分析。
从 Yarn 横空出世推出 lock 文件以来,已经两年多时间了,npm 也在 5.0 版本加入了类似的功能,lock 文件越来越被开发者们接收和认可。本篇文章想从前端视角探讨一下我们为什么需要 lock 文件,以及它的一些成本与风险,当然其中一些观点对于后端也是适用的
什么是断点续传?就是下载文件时,不必重头开始下载,而是从指定的位置继续下载,这样的功能就叫做断点续传。前端通过FileList对象获取到相应的文件,按照指定的分割方式将大文件分段,然后一段一段地传给后端,后端再按顺序一段段将文件进行拼接。
form表单的enctype属性:规定了form表单数据在发送到服务器时候的编码方式.。application/x-www-form-urlencoded:默认编码方式,multipart/form-data:指定传输数据为二进制数据,例如图片、mp3、文件,text/plain:纯文本的传输。空格转换为“+”,但不支持特殊字符编码。
适用场景: 网络绝对路径的URL文件或图片,不存储到本地,转换成stream,直接使用HTTPClient传送到SpringBoot的服务端,将文件存储下来,并返回一个文件地址。目前分层架构的系统越来越多这种需求,所以记录下来以备不时之需。
内容以共享、参考、研究为目的,不存在任何商业目的。其版权属原作者所有,如有侵权或违规,请与小编联系!情况属实本人将予以删除!