Использование javascript для загрузки файла в виде файла .csv
Привет, Я пытаюсь экспортировать файл как. CSV файл, так что, когда пользователь нажимает кнопку загрузки, браузер автоматически загрузит файл как .csv.
Я также хочу установить имя для экспортируемого файла .csv
Я использую javascript для этого
Код ниже:
function ConvertToCSV(objArray) {
var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
var str = '';
for (var i = 0; i < array.length; i++) {
var line = '';
for (var index in array[i]) {
if (line != '') line += ','
line += array[i][index];
}
str += line + '\r\n';
}
return str;
}
// Example
$(document).ready(function () {
// Create Object
var items = [
{ "name": "Item 1", "color": "Green", "size": "X-Large" },
{ "name": "Item 2", "color": "Green", "size": "X-Large" },
{ "name": "Item 3", "color": "Green", "size": "X-Large" }];
// Convert Object to JSON
var jsonObject = JSON.stringify(items);
// Display JSON
$('#json').text(jsonObject);
// Convert JSON to CSV & Display CSV
$('#csv').text(ConvertToCSV(jsonObject));
$("#download").click(function() {
alert("2");
var csv = ConvertToCSV(jsonObject);
window.open("data:text/csv;charset=utf-8," + escape(csv))
///////
});
});
Просьба сообщить об этом
Мой босс дышит моей шеей по этому вопросу
Пожалуйста, помогите
Ответы
Ответ 1
Я написал решение в этом потоке: как установить имя файла, используя window.open
Это простое решение:
$("#download_1").click(function() {
var json_pre = '[{"Id":1,"UserName":"Sam Smith"},{"Id":2,"UserName":"Fred Frankly"},{"Id":1,"UserName":"Zachary Zupers"}]';
var json = $.parseJSON(json_pre);
var csv = JSON2CSV(json);
var downloadLink = document.createElement("a");
var blob = new Blob(["\ufeff", csv]);
var url = URL.createObjectURL(blob);
downloadLink.href = url;
downloadLink.download = "data.csv";
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
});
Функция JSON2CSV
function JSON2CSV(objArray) {
var array = typeof objArray != 'object' ? JSON.parse(objArray) : objArray;
var str = '';
var line = '';
if ($("#labels").is(':checked')) {
var head = array[0];
if ($("#quote").is(':checked')) {
for (var index in array[0]) {
var value = index + "";
line += '"' + value.replace(/"/g, '""') + '",';
}
} else {
for (var index in array[0]) {
line += index + ',';
}
}
line = line.slice(0, -1);
str += line + '\r\n';
}
for (var i = 0; i < array.length; i++) {
var line = '';
if ($("#quote").is(':checked')) {
for (var index in array[i]) {
var value = array[i][index] + "";
line += '"' + value.replace(/"/g, '""') + '",';
}
} else {
for (var index in array[i]) {
line += array[i][index] + ',';
}
}
line = line.slice(0, -1);
str += line + '\r\n';
}
return str;
}
Ответ 2
в современных браузерах есть новый атрибут в якорях.
download
http://caniuse.com/download
поэтому вместо использования
window.open("data:text/csv;charset=utf-8," + escape(csv))
создать ссылку для загрузки:
<a href="data:text/csv;charset=utf-8,'+escape(csv)+'" download="filename.csv">download</a>
другое решение - использовать php
EDIT
Я не использую jQuery, но вам нужно отредактировать свой код, чтобы добавить ссылку для загрузки
с чем-то подобным в вашей функции.
var csv=ConvertToCSV(jsonObject),
a=document.createElement('a');
a.textContent='download';
a.download="myFileName.csv";
a.href='data:text/csv;charset=utf-8,'+escape(csv);
document.body.appendChild(a);
Ответ 3
Я просто хотел добавить сюда некоторый код для людей в будущем, так как я пытался экспортировать JSON в CSV-документ и загрузить его.
Я использую $.getJSON
для извлечения данных json с внешней страницы, но если у вас есть базовый массив, вы можете просто использовать его.
При этом используется код Кристиана Ландгрена для создания данных CSV.
$(document).ready(function() {
var JSONData = $.getJSON("GetJsonData.php", function(data) {
var items = data;
const replacer = (key, value) => value === null ? '' : value; // specify how you want to handle null values here
const header = Object.keys(items[0]);
let csv = items.map(row => header.map(fieldName => JSON.stringify(row[fieldName], replacer)).join(','));
csv.unshift(header.join(','));
csv = csv.join('\r\n');
//Download the file as CSV
var downloadLink = document.createElement("a");
var blob = new Blob(["\ufeff", csv]);
var url = URL.createObjectURL(blob);
downloadLink.href = url;
downloadLink.download = "DataDump.csv"; //Name the file here
document.body.appendChild(downloadLink);
downloadLink.click();
document.body.removeChild(downloadLink);
});
});
Редактировать: стоит отметить, что JSON.stringify
будет экранировать кавычки в кавычках, добавляя \"
. Если вы просматриваете CSV в Excel, вам не понравится это как escape-символ.
Вы можете добавить .replace(/\\"/g, '""')
в конец JSON.stringify(row[fieldName], replacer)
, чтобы правильно отобразить это в Excel (это заменит \"
на ""
, что предпочитает Excel).
Полная линия: JSON.stringify(row[fieldName], replacer).replace(/\\"/g, '""')
Ответ 4
Попробуйте эти примеры:
Пример 1:
JsonArray = [{
"AccountNumber": "1234",
"AccountName": "abc",
"port": "All",
"source": "sg-a78c04f8"
}, {
"Account Number": "1234",
"Account Name": "abc",
"port": 22,
"source": "0.0.0.0/0",
}]
JsonFields = ["Account Number","Account Name","port","source"]
function JsonToCSV(){
var csvStr = fields.join(",") + "\n";
JsonArray.forEach(element => {
AccountNumber = element.AccountNumber;
AccountName = element.AccountName;
port = element.port
source = element.source
csvStr += AccountNumber + ',' + AccountName + ',' + port + ',' + source + "\n";
})
return csvStr;
}
Вы можете скачать CSV файл, используя следующий код:
function downloadCSV(csvStr) {
var hiddenElement = document.createElement('a');
hiddenElement.href = 'data:text/csv;charset=utf-8,' + encodeURI(csvStr);
hiddenElement.target = '_blank';
hiddenElement.download = 'output.csv';
hiddenElement.click();
}