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数组