[〜#〜] json [〜#〜]オブジェクトを[〜#〜] csv [〜#〜]ファイルにエクスポートしてダウンロードしようとしていますが、ギリシャ文字の問題。私のコードは機能します。完璧ではありませんが、機能します。
問題は、ギリシャ文字がジャンクのように見えることです。
これが私の既存のコードです:
function downloadJsonToCsv(jsonObject) {
var array = typeof jsonObject != "object" ? JSON.parse(jsonObject) : jsonObject;
if (array == null) {
return; // No data found on the jsonObject
}
var str = "";
for (var i = 0; i < array.length; i++) {
var line = "";
for (var index in array[i]) {
line += array[i][index] + ";"; // Set delimiter
}
// Here is an example where you would wrap the values in double quotes
// for (var index in array[i]) {
// line += '"' + array[i][index] + '",';
// }
line.slice(0,line.Length-1);
str += line + "\r\n";
}
window.open("data:text/csv;charset=utf-8," + encodeURI(str));
}
2つの質問があります。
CSVにエクスポート
非ASCII文字を含むCSVにエクスポートするには、ファイルの先頭に Byte Order Mark 別名BOMを付ける必要があります。あなたのコード変更
var str = "";
に:
var str = "\uFEFF";
BOMを認識するには、最新バージョンのExcelが必要です。この役立つ StackOverflowの記事 で述べたように、Excel 2003以前ではBOMを正しく受け入れません。私はWindowsでExcel 2003にしかアクセスできないため、現時点ではテストできませんが、十分に文書化されています。
悲しいことに、Macintosh版Excel 2011は、この意味で「最新のExcel」ではありません。幸い、Googleスプレッドシートは正しいことを行います。
Excelに直接エクスポート
以下がjsFiddleのコードの実装です。 SpreadsheetXml ドキュメントを生成します。この方法の利点は、非常にトリッキーになる可能性があることです...式を追加し、Excelに固有の多くのことを実行します。
// Test script to generate a file from JavaScript such
// that MS Excel will honor non-ASCII characters.
testJson = [
{
"name": "Tony Peña",
"city": "New York",
"country": "United States",
"birthdate": "1978-03-15",
"amount": 42
},
{
"name": "Ζαλώνης Thessaloniki",
"city": "Athens",
"country": "Greece",
"birthdate": "1987-11-23",
"amount": 42
}
];
// Simple type mapping; dates can be hard
// and I would prefer to simply use `datevalue`
// ... you could even add the formula in here.
testTypes = {
"name": "String",
"city": "String",
"country": "String",
"birthdate": "String",
"amount": "Number"
};
emitXmlHeader = function () {
var headerRow = '<ss:Row>\n';
for (var colName in testTypes) {
headerRow += ' <ss:Cell>\n';
headerRow += ' <ss:Data ss:Type="String">';
headerRow += colName + '</ss:Data>\n';
headerRow += ' </ss:Cell>\n';
}
headerRow += '</ss:Row>\n';
return '<?xml version="1.0"?>\n' +
'<ss:Workbook xmlns:ss="urn:schemas-Microsoft-com:office:spreadsheet">\n' +
'<ss:Worksheet ss:Name="Sheet1">\n' +
'<ss:Table>\n\n' + headerRow;
};
emitXmlFooter = function() {
return '\n</ss:Table>\n' +
'</ss:Worksheet>\n' +
'</ss:Workbook>\n';
};
jsonToSsXml = function (jsonObject) {
var row;
var col;
var xml;
var data = typeof jsonObject != "object"
? JSON.parse(jsonObject)
: jsonObject;
xml = emitXmlHeader();
for (row = 0; row < data.length; row++) {
xml += '<ss:Row>\n';
for (col in data[row]) {
xml += ' <ss:Cell>\n';
xml += ' <ss:Data ss:Type="' + testTypes[col] + '">';
xml += data[row][col] + '</ss:Data>\n';
xml += ' </ss:Cell>\n';
}
xml += '</ss:Row>\n';
}
xml += emitXmlFooter();
return xml;
};
console.log(jsonToSsXml(testJson));
これにより、以下のXMLドキュメントが生成されます。このXMLがtest.xlsという名前のファイルに保存されている場合、Excelはこれを認識し、適切なエンコードで開きます。
<?xml version="1.0"?>
<ss:Workbook xmlns:ss="urn:schemas-Microsoft-com:office:spreadsheet">
<ss:Worksheet ss:Name="Sheet1">
<ss:Table>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">name</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">city</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">country</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">birthdate</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">amount</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Tony Peña</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">New York</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">United States</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">1978-03-15</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">42</ss:Data>
</ss:Cell>
</ss:Row>
<ss:Row>
<ss:Cell>
<ss:Data ss:Type="String">Ζαλώνης Thessaloniki</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Athens</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">Greece</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="String">1987-11-23</ss:Data>
</ss:Cell>
<ss:Cell>
<ss:Data ss:Type="Number">42</ss:Data>
</ss:Cell>
</ss:Row>
</ss:Table>
</ss:Worksheet>
</ss:Workbook>
認めざるを得ませんが、私の強い傾向は、可能であればこのサーバー側で行うことです。私はPython library openpyxl
を使用してこれを実行しましたが、これはかなり簡単です。ほとんどのサーバー側言語には、Excelファイルを生成するライブラリがあり、文字列連結よりもはるかに優れた構成です。
とにかく、基本については MSDNブログ を参照してください。そして、これ StackOverflow記事 他のさまざまなオプションの長所/短所について。
ExcelにUnicode CSVファイルを読み取らせるには、csvの最初の文字列として Byte Order Mark を追加する必要があります。これは、コードに次の行を追加することにより、JavaScriptを介して実行できます。
line="\ufeff"+line