You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在Oracle JET中导出oj-table数据至CSV文件

当然可以搞定!在Oracle JET里给oj-table加CSV导出功能其实挺顺手的,我给你梳理一套完整的实现方案,亲测能用:

步骤1:在页面中添加导出按钮

首先在你的HTML里,给oj-table配上一个导出按钮,用Oracle JET的oj-button组件就行:

<!-- 导出按钮 -->
<oj-button on-oj-action='[[handleExportCSV]]' style="margin-bottom:10px;">导出为CSV</oj-button>

<!-- 你的表格组件 -->
<oj-table 
  id="myTable" 
  data='[[tableDataSource]]' 
  columns='[[tableColumns]]'
></oj-table>

步骤2:在ViewModel中实现导出逻辑

接下来在你的ViewModel里写核心的导出函数,主要做这几件事:获取表格数据、生成符合格式的CSV内容、触发浏览器下载。

这里假设你用的是ArrayDataProvider作为表格数据源(大部分场景都是这个),完整代码示例如下:

define([
  'ojs/ojcore', 
  'ojs/ojbutton', 
  'ojs/ojtable', 
  'ojs/ojarraydataprovider'
], function(oj) {
  function ViewModel() {
    var self = this;

    // 示例:表格列定义和数据源
    self.tableColumns = [
      {headerText: '员工ID', key: 'empId'},
      {headerText: '姓名', key: 'name'},
      {headerText: '部门', key: 'department'},
      {headerText: '入职日期', key: 'hireDate'}
    ];

    self.tableData = [
      {empId: 101, name: '张三', department: '研发部', hireDate: '2020-01-15'},
      {empId: 102, name: '李四', department: '市场部', hireDate: '2021-03-22'},
      {empId: 103, name: '王五', department: '财务部', hireDate: '2019-07-08'}
    ];

    self.tableDataSource = new oj.ArrayDataProvider(self.tableData, {keyAttributes: 'empId'});

    // CSV导出核心函数
    self.handleExportCSV = async function() {
      // 1. 获取表格所有数据
      let allRows = [];
      // 用fetchFirst获取数据(兼容分页场景)
      const fetchResult = await self.tableDataSource.fetchFirst();
      fetchResult.forEach(item => allRows.push(item.data));

      // 2. 生成CSV表头
      const headerRow = self.tableColumns.map(col => col.headerText);
      let csvContent = headerRow.join(',') + '\n';

      // 3. 处理每一行数据,转义特殊字符(关键!避免CSV格式错乱)
      allRows.forEach(row => {
        const rowCells = self.tableColumns.map(col => {
          let cellValue = row[col.key] || '';
          // 如果内容包含逗号、双引号或换行,必须转义处理
          if (typeof cellValue === 'string') {
            if (cellValue.includes(',') || cellValue.includes('"') || cellValue.includes('\n')) {
              // 把内容里的双引号替换成两个双引号,再用双引号包裹整个单元格
              cellValue = `"${cellValue.replace(/"/g, '""')}"`;
            }
          }
          return cellValue;
        });
        csvContent += rowCells.join(',') + '\n';
      });

      // 4. 创建Blob并触发浏览器下载
      // 若遇到中文乱码,在csvContent开头加上 '\uFEFF' 即可(UTF-8 BOM)
      const blob = new Blob([csvContent], {type: 'text/csv;charset=utf-8;'});
      const downloadUrl = URL.createObjectURL(blob);
      const link = document.createElement('a');
      link.href = downloadUrl;
      link.setAttribute('download', '员工数据.csv'); // 自定义下载文件名
      document.body.appendChild(link);
      link.click();
      // 清理临时元素和URL
      document.body.removeChild(link);
      URL.revokeObjectURL(downloadUrl);
    };
  }

  return new ViewModel();
});

关键细节注意事项

  • 数据源兼容:如果你的表格用的是AsyncDataProvider或者带分页的数据源,需要循环调用fetchFirst直到获取所有数据(可以通过fetchResult.metadata.hasMore判断)。
  • 特殊字符处理:一定要处理逗号、双引号和换行符,否则CSV打开后列会错乱,这是很多人容易踩的坑。
  • 中文乱码解决:如果导出的CSV中文显示乱码,只需要在生成csvContent时开头加上\uFEFF(UTF-8 BOM),也就是let csvContent = '\uFEFF' + headerRow.join(',') + '\n';
  • 文件名自定义:你可以修改link.setAttribute('download', 'xxx.csv')里的文件名,改成你需要的名称。

内容的提问来源于stack exchange,提问作者65th bit

火山引擎 最新活动