В настоящее время я разрабатываю экспорт CSV с XSLT. И CSV файл будет использоваться% 99 процентов с Excel в моем случае, поэтому я должен рассмотреть поведение Excel.
Моя первая проблема - немецкие специальные персонажи в csv. Даже тот факт, что CSV-кодировка является UTF8, Excel не может правильно открыть CSV файл с UTF8. Специальные символы получают странные символы. Я нашел решение этой проблемы. Я добавил 3 дополнительных байта ( EF BB BF - a.k.a Заголовок спецификации) начало байтов содержимого. Потому что спецификация UTF8 - это способ сказать, что "эй чувак, это UTF8, откройте его правильно" в Excel. Проблема решена!
И моя вторая проблема была о разделителе. Разделитель по умолчанию может быть запятой или точкой с запятой в зависимости от региона. Я думаю, что это точка с запятой в Германии и запятая в Великобритании. Поэтому, чтобы предотвратить эту проблему, мне пришлось добавить строку ниже:
<xsl:text>sep=;</xsl:text>
или
<xsl:text>sep=,</xsl:text>
(Этот разделитель не был реализован как жестко запрограммированный)
Но моя проблема, которую я не могу найти, заключается в том, что если вы добавите "sep =;" или "sep =", начало файла, в то время как CSV файл генерируется с помощью UT8-BOM, спецификация не помогает показывать специальные символы правильно! И я уверен, что байты спецификации всегда находятся в начале массива байтов. Этот снимок экрана сделан из MS Excel в Mac OS X:
Первые 3 символа принадлежат заголовку спецификации.
У вас когда-нибудь была такая проблема или у вас есть какие-то предложения? Спасибо.
Edit:
Я использую печатные экраны.
а. С помощью спецификации и <xsl:text>sep=;</xsl:text>
б. Просто с BOM
Код Java:
// Write the bytes
ServletOutputStream out = resp.getOutputStream();
if(contentType.toString().equals("CSV")) {
// The additional bytes in below is prefix indicates that the content is in UTF-8.
out.write(239);
out.write(187);
out.write(191);
}
out.write(bytes); // Content bytes, in this case XSL
Код XSL:
<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" version="1.0" encoding="UTF-8" indent="yes" />
<xsl:template match="/">
<xsl:text>sep=;</xsl:text>
<table>
...
</table>
</xsl:template>