2013-08-15 3 views
13

Я пытаюсь сгенерировать CSV-файл на стороне клиента с помощью javascript. Я следовал the answer on this stackoverflow question. У меня есть символы Юникода в содержании (символы иврита в моем случае).Сгенерировать CSV для Excel с помощью JavaScript с символами Unicode

Генерация файла преуспевает, однако, когда я открываю файл в Excel, все символы Юникода отображаются как забавные символы. Символы ASCII (английский и цифры) представлены хорошо.

Странно то, что если я открою файл в блокноте, символы Юникода будут хорошо отображаться. Поэтому я думаю, что это имеет какое-то отношение к Excel и тому, как я сохраняю файл.

Любые идеи?

+1

Это может быть Byte Order Mark. Помогает ли эта ссылка? http://stackoverflow.com/questions/155097/microsoft-excel-mangles-diacritics-in-csv-files –

+0

Да да да! добавление префикса спецификации работало! –

ответ

29

Следующее сообщение Джека Коула и this question, то, что исправила мою проблему, заключалось в добавлении префикса спецификации (\ uFEFF) в начало файла.

Это рабочий код:

var csvContent = "...csv content..."; 
var encodedUri = encodeURI(csvContent); 
var link = document.createElement("a"); 
link.setAttribute("href", "data:text/csv;charset=utf-8,\uFEFF" + encodedUri); 
link.setAttribute("download","report.csv"); 
link.click(); 
+0

Прекрасно работает для меня! –

+11

Не работает для меня. Excel должен умереть. –

+0

работал в моем случае спасибо большое –

1

На сервере Узел/Экспресс, я попытался ответить Шей, но я получаю сообщение об ошибке для недопустимых символов в моем заголовке. Вместо этого я добавил \uFEFF в начало тела ответа, и он сработал.

app.get('/', function (req, res) { 
    var csv = Papa.unparse(...); 
    res.set({ 
     'Content-Type': 'text/csv; charset=UTF-8', 
     'Content-Disposition': 'attachment; filename="file.csv"', 
    }); 
    res.send('\uFEFF' + csv) 
}) 
+0

Работал для меня, спасибо большое – user301441

0

Предлагаемое решение не работает со всеми браузерами, но я нашел способ, чтобы заставить его работать во всех браузерах (Chrome, Firefox, IE11 и даже Edge, ... не знаю, о IE9- 10, так как у меня больше нет доступа к ним).

Мне нужно использовать внешнюю библиотеку для кодирования encoding.js, и она отлично работает с юникодом (я могу видеть мой единорог emoji в моем CSV-экспорте в Excel).

Так вот код

data = new TextEncoder('utf-16be').encode(csvContent); 

// create a Blob object for the download 
const blob = new Blob(['\uFEFF', data], { 
    type: 'text/csv;charset=utf-8'; 
}); 

// when using IE/Edge, then use different download call 
if (typeof navigator.msSaveOrOpenBlob === 'function') { 
    navigator.msSaveOrOpenBlob(blob, filename); 
} else { 
    // this trick will generate a temp <a /> tag that you can trigger a hidden click for it to start downloading 
    const link = document.createElement('a'); 
    const csvUrl = URL.createObjectURL(blob); 

    link.textContent = 'download'; 
    link.href = csvUrl; 
    link.setAttribute('download', filename); 

    // set the visibility hidden so there is no effect on your web-layout 
    link.style.visibility = 'hidden'; 

    // this part will append the anchor tag and remove it after automatic click 
    document.body.appendChild(link); 
    link.click(); 
    document.body.removeChild(link); 
} 

и это, он работает в IE/Edge/Chrome/Firefox

enter image description here

Смежные вопросы