繁体   English   中英

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

[英]JavaScript - Convert CSV to XLSX (Preferably Without Use of Library(s))

正如标题所说,我目前有一个从 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 文件。 提前致谢。

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

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

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

我不确定这是否能解决您的问题,但如果 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%"

如果您可以使用第三方库(我强烈建议考虑转换中涉及的复杂性),如果需要在 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'))
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM