JavaScript - 将 CSV 转换为 XLSX(最好不使用库)

Posted

技术标签:

【中文标题】JavaScript - 将 CSV 转换为 XLSX(最好不使用库)【英文标题】:JavaScript - Convert CSV to XLSX (Preferably Without Use of Library(s)) 【发布时间】:2016-09-20 22:55:09 【问题描述】:

正如标题所说,我目前有一个从 SharePoint 列表数据创建的 CSV 文件,为了将此信息显示为电子表格,我想将其转换为 Excel XLSX 文件。我更喜欢在不依赖第三方库的情况下这样做。起初,我开始使用 ActiveX 对象来尝试重新创建和/或将 CSV 保存为 XLSX,但是这有一个限制,因为我不能在 IE 之外的其他浏览器中真正使用它。我在想用 Blob 以某种方式转换它?这就是我卡住的地方。

function createCsv(data) 
    var result = "";

    if (data == null || data.length == 0) 
        return;
    

    var columnDelimiter = ',';
    var lineDelimiter = '\n';

    var keys = Object.keys(data[0]);

    // spreadsheet header

    result += keys.join(columnDelimiter);
    result += lineDelimiter;

    // spreadsheet data

    data.forEach(function (obj) 
        var count = 0;

        keys.forEach(function (key) 
            if (count > 0) 
                result += columnDelimiter;
            

            result += obj[key];
            count++;               
        );

        result += lineDelimiter;
    );

    return result;


function downloadCsv(csv) 
    if (csv == null) 
        return;
    

    var filename = "test.csv";

    csv = "data:text/csv;charset=utf-8," + csv;

    var data = encodeURI(csv);

    console.log(data);

    var link = document.getElementById('csv');
    link.setAttribute('href', data);
    link.setAttribute('download', filename);

    console.log(link);

    //displayCsv(csv);


function displayCsv() 
    // using test csv here
    var message = "data:text/csv;charset=utf-8, yo, hey, lol";
    //var fileType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
    var fileType = "application/msexcel";

    var csvFile = new Blob([message], type: fileType);
    var csvUrl = URL.createObjectURL(csvFile);

    console.log(csvFile);
    console.log(csvUrl);


CSV 可以很好地使用电子表格(通过下载并在 Excel 中打开它),但我确实需要一种方法将其显示为网页上的电子表格而不是文本,所以这就是我想要转换它的原因超过。因为我在 SharePoint 中使用它,所以我可以使用 Excel Web 部件来显示 XLSX - 但它不会像这样打开 CSV 文件。提前致谢。

【问题讨论】:

我尝试使用iframes,但我遇到的问题是浏览器会自动下载我为iframe 设置为src 的链接,而不是显示它。只有当类型设置为 text/plain 时,它才会按预期显示 CSV。 我正在寻找相同的。你得到你的解决方案了吗? @ValayDesai 不幸的是,我没有。我刚刚使用了 CSV。 XLSX 文件格式附带了许多特殊编码,这使得转换不值得。但可能有第三方应用可以做到这一点。 【参考方案1】:

尝试手动尝试在没有库的情况下执行此操作将是一项艰巨的任务。虽然 OpenXML 文件的核心是基于 XML,但它们也被捆绑/压缩。

我建议看看 SheetJS。 https://sheetjs.com/

您可以将 CSV 作为输入,然后立即将其写回为 XSLX。

【讨论】:

【参考方案2】:

我不确定这是否能解决您的问题,但如果 xls 文件就足够了,您可以通过在 csv 的第一行添加分隔符标签并将其重命名为 xls 来创建 xls 文件。 围绕价值观的引号也很重要。

例如:

"sep=,"
"Service","Reported","Total","%"
"a service","23","70","32.86%"
"yet_a_service","27","70","38.57%"
"more_services","20","70","28.57%"

【讨论】:

用 Excel 365 for Mac 试过这个 - 说“'Book1.xls' 的文件格式和扩展名不匹配。文件可能已损坏或不安全。除非你相信它的来源,否则不要'打不开。还是要打开吗?” CSV != XLS。只是给它一个不同的扩展名实际上并不会改变文件格式,它只会引起混乱。 XLS 是一种二进制格式,与基于文本的 CSV 完全不同。【参考方案3】:

如果您可以使用第三方库(我强烈建议您考虑转换所涉及的复杂性),如果需要在 nodejs 中完成,此解决方案将满足您的需求。

如果要在浏览器中使用,需要修改convertCsvToExcel函数将缓冲区转换为blob对象,然后将该blob转换为XLS文件.

// Convert a CSV string to XLXS buffer 
// change from xlxs/xls and other formats by going through sheetsjs documentation.
import * as XLSX from 'xlsx';

export const convertCsvToExcelBuffer = (csvString: string) => 
  const arrayOfArrayCsv = csvString.split("\n").map((row: string) => 
    return row.split(",")
  );
  const wb = XLSX.utils.book_new();
  const newWs = XLSX.utils.aoa_to_sheet(arrayOfArrayCsv);
  XLSX.utils.book_append_sheet(wb, newWs);
  const rawExcel = XLSX.write(wb,  type: 'base64' )
  return rawExcel

// Express request handler for sending the excel buffer to response.

export const convertCsvToExcel = async (req: express.Request, res: express.Response) => 
    const csvFileTxt = fileBuffer.toString()
    const excelBuffer = convertCsvToExcelBuffer(csvFileTxt)
    res.setHeader('Content-Type', 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')
    res.status(200).send(Buffer.from(excelBuffer, 'base64'))

【讨论】:

以上是关于JavaScript - 将 CSV 转换为 XLSX(最好不使用库)的主要内容,如果未能解决你的问题,请参考以下文章

javascript 将CSV文件转换为JavaScript文字的集合

javascript 将CSV文件转换为JavaScript文字的集合

JavaScript - 将 CSV 转换为 XLSX(最好不使用库)

javascript 将表格文本(csv,tsv等)转换为javascript数组

如何将 csv 转换为 json 并编写特定函数以使用 javascript 生成图形?

在 JavaScript 中将 JSON 对象转换为 CSV 格式