質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

8550閲覧

CSV書き出し後にデータがすべて横一列になって表示されてしまう

Webtuuuu

総合スコア30

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

jQuery

jQueryは、JavaScriptライブラリのひとつです。 簡単な記述で、JavaScriptコードを実行できるように設計されています。 2006年1月に、ジョン・レシグが発表しました。 jQueryは独特の記述法を用いており、機能のほとんどは「$関数」や「jQueryオブジェクト」のメソッドとして定義されています。

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

1グッド

1クリップ

投稿2019/04/14 13:57

#実現したいこと
HTML内に動的に追加されたtableをjs(jQuery)を使用してCSVファイルとしてダウンロードする。

▼動的に作成された以下のtableをCSVとして保存したい
HTML側のtable

▼CSVとして保存される理想の状態
書き出し後の理想の状態

#発生しているエラー
書き出し後の状態が以下のように横一列で書き出されてしまいます。
現在の書き出し後の状態
書き出しの際、どのようにすれば体裁をそろえた状態で書き出せるのかがわかりません。
#現在のコード

html

1<table> 2 <tbody> 3 <tr> 4 <th>コンテンツ1</th> 5 <th>コンテンツ2</th> 6 </tr> 7 <tr> 8 <td>hoge</td> 9 <td>huga</td> 10 </tr> 11 </tbody> 12</table>

js

1$(function() { 2 $('.csvDownload').click(function() { 3 var data = []; 4 var tr = $('table tr'); //テーブルの全行を取得 5 for (var i = 0, l = tr.length; i < l; i++) { 6 var cells = tr.eq(i).children(); //1行目から順番に列を取得(th、td) 7 for (var j = 0, m = cells.length; j < m; j++) { 8 if (typeof data[i] == 'undefined') 9 data[i] = []; 10 data[i][j] = cells.eq(j).text(); //i行目j列の文字列を取得 11 } 12 } 13 14 console.log(data); 15 16 //ファイル名 17 var file_name = 'filelist.csv'; 18 19 var link = document.createElement('a'); 20 var bom = new Uint8Array([0xEF, 0xBB, 0xBF]); 21 var blob; 22 23 if (window.navigator.msSaveOrOpenBlob) { 24 // for ie 25 blob = new Blob([bom, data], { type: 'text/csv' }); 26 window.navigator.msSaveOrOpenBlob(blob, file_name); 27 } else if (window.webkitURL && window.webkitURL.createObjectURL) { 28 // for chrome (and safari) 29 blob = new Blob([bom, data], { type: 'text/csv' }); 30 link.setAttribute('download', file_name); 31 link.setAttribute('href', window.webkitURL.createObjectURL(blob)); 32 link.click(); 33 } else if (window.URL && window.URL.createObjectURL) { 34 // for firefox 35 blob = new Blob([bom, data], { type: 'text/csv' }); 36 link.setAttribute('download', file_name); 37 link.setAttribute('href', window.URL.createObjectURL(blob)); 38 link.click(); 39 } 40 }); 41});

#参考サイト
テーブル情報を二次元配列に格納!jQueryで簡単にセル値を取得する方法!
JavaScriptでCSVファイルなどを文字化けさせずに出力する方法

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

行ごとに改行コードを挿入する処理がされていないのが問題に見えます。
全く試していませんが、こんな感じでforの外側のループ(=行のループ)毎に改行コードを加えてあげればいけるんじゃないでしょうか。

  • 改行コードはOSによって扱いが異なるので、対応するOS毎に改行コードを分岐させるような処理を追加してあげて下さい。

javascript

1 2 for (var i = 0, l = tr.length; i < l; i++) { 3 var cells = tr.eq(i).children(); //1行目から順番に列を取得(th、td) 4 for (var j = 0, m = cells.length; j < m; j++) { 5 if (typeof data[i] == 'undefined') 6 data[i] = []; 7 data[i][j] = cells.eq(j).text(); //i行目j列の文字列を取得 8 } 9 data[i].push("\r\n"); //windowsの場合の改行コード 10 }

投稿2019/04/14 15:02

tanat

総合スコア18713

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Webtuuuu

2019/04/15 00:38 編集

回答ありがとうございます。 記述頂いたコードを参考に改行コードを追加するようにしたところ横一列にはならず理想に近い状態となりました。 しかし、書き出した後なぜかは理由がわかりませんが、 1行目のタイトル部分(画像で言うコンテンツ1、コンテンツ2の部分)は問題ないですが 2行目以降がA列が空白になるようになってしまいました。 具体的には、 1行目:A列・B列にタイトル 2行目:A列空白、B列hoge、C列huga 3行目以降:2行目と同じ 上記のようになっています。 記載頂いた下記が原因となっているのかはわかりませんが、もし原因がわかればご教示いただくことは可能でしょうか…? data[i].push("\r\n"); //windowsの場合の改行コード ※ちなみに一旦今はWindowsだけで動作すればOKです
tanat

2019/04/15 01:33 編集

改行コードを入れる場所が若干ずれているのかも? もしくは入れ方が間違っているか。 (試してもいないコードなので、何かミスがあるんだと思います) 以下にデバッグ方法を書いてみるので、デバッグしてみて下さい。 まずは改行コードを表示、指定できるテキストエディタを用意して、理想的なCSV(エクセルで作るでも何でも良いです)を開いて、作るべきCSVが改行コードを含めてどうなっているのか確認して下さい。 確認出来たら、今回のCSVと比較して何が違うかを検証し、その違いを埋める様に色々試して見てください。 その際、もう少しミニマムなコードで検証すると、それぞれのコードで何をしているか把握できます。 参考 http://do-aki.hatenablog.jp/entry/20130225/1361763613
moredeep

2019/04/15 02:34

Blobが2次元配列だろうが1行分のデータとしてみて、改行文字の後にもカンマを付けてしまっているんじゃないでしょうか。だから、改行後の1文字目にカンマが入っていると。ループ毎に改行は入れずに、手動でJoinしてしまった方がいいと思います。 data = data.map((d)=>d.join(',')).join('\r\n');
tanat

2019/04/15 03:00

> moredeepさん 補足ありがとうございます。 ご指摘の通りだと思います。
Webtuuuu

2019/04/16 05:35

返答が遅くなり申し訳ございません。 回答ありがとうございました。 moredeepさんがおっしゃるとおりに実装したところ理想通りの挙動となりました。 以下理想の挙動のコード var data = []; var tr = $('table tr'); //テーブルの全行を取得 for (var i = 0, l = tr.length; i < l; i++) { var cells = tr.eq(i).children().not('.sheethidden'); //1行目から順番に列を取得(th、td) for (var j = 0, m = cells.length; j < m; j++) { if (typeof data[i] == 'undefined') data[i] = []; data[i][j] = cells.eq(j).text(); //i行目j列の文字列を取得 } } data = data.map((d)=>d.join(',')).join('\r\n'); //回答いただいたコード
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問