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

时间:2016-05-23 22:23:46

标签: javascript excel csv sharepoint xlsx

正如标题所说,我目前有一个从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中下载并打开),但我真的需要一种方法将其显示为网页上的电子表格而不是文本,这就是为什么我&#39 ;我希望将其转换过来。由于我在SharePoint中使用此功能,因此我可以使用Excel Web部件来显示XLSX - 但它不会像这样打开CSV文件。提前谢谢。

2 个答案:

答案 0 :(得分:2)

我不确定这是否可以解决您的问题,但是如果xls文件足以满足您的要求,您只需在CSV的第一行添加分隔符标签并将其重命名为xls即可创建xls文件。 围绕值的引号也很重要。

例如:

library(plotly)
#Labels
ticklabels <- seq(from=0, to=round(max(diamonds$depth*10000)), by=10000)
ticktexts <- c(0,paste(ticklabels[-1]/1000, " 000", sep=""))
#Code
diamonds %>%
  plot_ly(x=~clarity,y=~~depth*10000) %>%
  add_bars() %>%
  layout(yaxis=list(tickvals = ticklabels,
                    ticktext = ticktexts
                    ))

答案 1 :(得分:1)

尝试在没有库的情况下手动尝试将是一项相当艰巨的任务。尽管OpenXML文件以XML为核心,但它们也被捆绑/压缩。

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

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