質問編集履歴

14

動作環境の追加

2019/05/23 10:38

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -301,3 +301,17 @@
301
301
  macOS Mojave
302
302
 
303
303
  バージョン10.14.4
304
+
305
+
306
+
307
+
308
+
309
+
310
+
311
+ 実行環境
312
+
313
+ ---
314
+
315
+ iPad
316
+
317
+ バージョン12.2

13

試したことを追加

2019/05/23 10:38

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -262,6 +262,12 @@
262
262
 
263
263
 
264
264
 
265
+ ●実機(iPad)ではなくエミュレータ(iphoneXR iOS 12.2)で動かす
266
+
267
+ →文字化けしなかった
268
+
269
+
270
+
265
271
 
266
272
 
267
273
  コンソール出力

12

質問内容の抜けを修正

2019/05/23 10:36

投稿

researcher
researcher

スコア87

test CHANGED
@@ -1 +1 @@
1
- C#で文字数が多いとstringの中身をConsole.WriteLineした時に文字化けする理由を知りたい
1
+ Xamarin.iOSでブラウザでシェアしたxlsxファイルから、csv形式の文字列を生成したいが文字化けする
test CHANGED
@@ -1,28 +1,22 @@
1
- 現在、Xamarin.iOSでアプリケーション作成を学んでいる者です
1
+ 現在、Xamarin.iOSでアプリケーション作成を学んでいる者です
2
-
3
-
4
-
2
+
3
+
4
+
5
- 表題の件ですが、C#でstringを扱おうとしたところ、文字数が多い時に文字化けする現象に悩んでいます。
5
+ https://www.city.tome.miyagi.jp/kikakuseisaku/documents/042129_aed.xlsx
6
-
6
+
7
- 大体日本語文章で2000文字超える値格納た時にConsole.WriteLineで中身確認すると、
7
+ 1.上記xlsx「AED設置箇所一覧」開いて共有ボタン、自分のアプリケーション開く
8
-
9
-
10
-
11
- "都道府県コード又は市区町村コード","NO","都道府県名","市区町村名"
8
+
12
-
13
-
14
-
15
- のような文字化けを起こしてしまうのです。
16
-
17
- ここでいう文字列ですが
18
-
19
- 1.外部からxlsxファイルをダウンロード
9
+ 2.そうして取得したxlsxファイルのデータからcsv形式の文字列生成
20
-
10
+
11
+
12
+
21
- 2.そデータ取得してアプリ内部でカマ区切で連結
13
+ 以上ような流れ想定してアプリケーショを作成しておます。
22
-
14
+
23
- というような流れで作成したもので
15
+ しかし、上記xlsxファイルの全データを連結して文字列を作成し、Console.WriteLine()で中身を確認しところ、文字化けが起きてしまい困っていま
24
-
16
+
17
+
18
+
25
- 現象の理由回避方法をご教授いただければ幸いで
19
+ の理由に心当たりのある方がおられましたら、ご教授をお願しま
26
20
 
27
21
 
28
22
 
@@ -38,12 +32,12 @@
38
32
 
39
33
  using System;
40
34
 
41
- using System.Collections.Generic;
42
-
43
35
  using System.IO;
44
36
 
45
37
  using System.Linq;
46
38
 
39
+ using System.Text;
40
+
47
41
  using DocumentFormat.OpenXml.Packaging;
48
42
 
49
43
  using DocumentFormat.OpenXml.Spreadsheet;
@@ -56,7 +50,7 @@
56
50
 
57
51
 
58
52
 
59
- namespace アプリケーション名.iOS
53
+ namespace TestApp.iOS
60
54
 
61
55
  {
62
56
 
@@ -84,7 +78,7 @@
84
78
 
85
79
  {
86
80
 
87
- if (url.Scheme != "file"){return false;}
81
+ if (url.Scheme != "file") { return false; }
88
82
 
89
83
 
90
84
 
@@ -100,17 +94,17 @@
100
94
 
101
95
  {
102
96
 
103
- // filePathを編集offで開く
97
+ // 編集offで開く
104
98
 
105
99
  using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
106
100
 
107
101
  {
108
102
 
109
- // 開いたブックの各シートからcsvデータ取得
103
+ // 開いたブックの各シートのデータをcsv形式の文字列として保存
110
104
 
111
105
  var sheets = document.WorkbookPart.Workbook.Sheets;
112
106
 
113
- List<string>[] multiCSV = new List<string>[sheets.Count()];
107
+ string[] allCSV = new string[sheets.Count()];
114
108
 
115
109
  int index = 0;
116
110
 
@@ -132,15 +126,11 @@
132
126
 
133
127
  // シートからセルデータを取得してcsvとして保存
134
128
 
135
- // データが大きい場合、文字列として保存すると壊れる。なので一度改行ごとにリストとして保存
136
-
137
- // アルファベット全26字(空白入れれば27)
138
-
139
129
  String[] abc =
140
130
 
141
131
  { "", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
142
132
 
143
- var csv = new List<string>();
133
+ StringBuilder csv = new StringBuilder();
144
134
 
145
135
  for (int row = 1, csvEnd = 0; csvEnd == 0; row++)
146
136
 
@@ -166,6 +156,8 @@
166
156
 
167
157
  csvRow = csvRow.TrimEnd(',');
168
158
 
159
+ csvRow += Environment.NewLine;
160
+
169
161
  rowEnd = 1;
170
162
 
171
163
  if (abc[col10] + abc[col1] == "A") { csvEnd = 1; }
@@ -212,72 +204,32 @@
212
204
 
213
205
  }
214
206
 
207
+
208
+
209
+ Console.WriteLine("少しずつ確認");
210
+
211
+ Console.WriteLine(csv);
212
+
215
- csv.Add(csvRow);
213
+ csv.Append(csvRow);
216
214
 
217
215
  }
218
216
 
219
- // 最後の改行を消す
217
+
220
-
221
- csv.RemoveAt(csv.Count() - 1);
218
+
222
-
223
- multiCSV[index] = csv;
219
+ allCSV[index] = csv.ToString();
220
+
221
+
222
+
223
+ Console.WriteLine("全行確認");
224
+
225
+ Console.WriteLine(allCSV[index]);
226
+
227
+
224
228
 
225
229
  index++;
226
230
 
227
231
  }
228
232
 
229
-
230
-
231
- var data = "";
232
-
233
- for (int sheetID = 0, sheetCnt = multiCSV.Length; sheetID < sheetCnt; sheetID++)
234
-
235
- {
236
-
237
- for (int rowID = 0, rowCnt = multiCSV[sheetID].Count(); rowID < rowCnt; rowID++)
238
-
239
- {
240
-
241
- var row = multiCSV[sheetID][rowID].Split(",");
242
-
243
- for (int colID = 0, colCnt = row.Length; colID < colCnt; colID++)
244
-
245
- {
246
-
247
- if (colID < colCnt - 1)
248
-
249
- {
250
-
251
- data += row[colID] + ",";
252
-
253
- }
254
-
255
- else if (rowID == rowCnt - 1)
256
-
257
- {
258
-
259
- data += row[colID];
260
-
261
- }
262
-
263
- else if (colID == colCnt - 1)
264
-
265
- {
266
-
267
- data += row[colID] + "\n";
268
-
269
- }
270
-
271
- }
272
-
273
- }
274
-
275
- }
276
-
277
-
278
-
279
- Console.WriteLine(data);
280
-
281
233
  }
282
234
 
283
235
  return true;
@@ -304,31 +256,9 @@
304
256
 
305
257
  ---
306
258
 
307
- 前提として、stringに入れる文字列は外部のCSVをダウンロードしてきたもの
308
-
309
- CSVの1行目だけを取り込んで、string変数に格納
259
+ 上記xlsxの1行目のデータだけを取り込んで、string変数に格納
310
-
311
- →問題なく表示された
260
+
312
-
313
-
314
-
315
- ●CSVを一行ずつ読み込んで、その度にstring変数に格納。それをアプリケーション出力ウィンドウに表示
316
-
317
- 途中までは問題なく表示された。しかしとある行から文字化けして表示されるようにった
261
+ →問題なく表示された。10目までのデータからなら文字化けしな
318
-
319
-
320
-
321
- ●新規プロジェクトを作成し、ここに記載したコードのみを貼り付けて動かしてみる。
322
-
323
- →結果は変わらず文字化けしている
324
-
325
-
326
-
327
- ●excelをcsvファイルとして保存し、そこから開いてみる
328
-
329
- →結果は変わらず文字化けしている
330
-
331
-
332
262
 
333
263
 
334
264
 
@@ -342,11 +272,11 @@
342
272
 
343
273
  CSVの全行を取得した時
344
274
 
345
- ![](8c5d32bea5369db2417c669cfeaf5b20.png)
275
+ ![イメージ説明](8e8201cebed792979dd616a6e7a80ada.png)
346
276
 
347
277
  CSVの一行だけを取得した時
348
278
 
349
- ![イメージ説明](ca688dd7e1aae266c3deb9953eb086c5.png)
279
+ ![イメージ説明](63c1e38291b38778cfde907e63d25729.png)
350
280
 
351
281
 
352
282
 

11

質問文を修正しました

2019/05/23 10:13

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -14,7 +14,13 @@
14
14
 
15
15
  のような文字化けを起こしてしまうのです。
16
16
 
17
+ ここでいう文字列ですが
18
+
17
- 文字列は外部からドキュメントタ設定することでダウンロードしたCSVを元としております
19
+ 1.外部からxlsxファをダウンロード
20
+
21
+ 2.そのデータを取得してアプリ内部でカンマ区切りで連結
22
+
23
+ というような流れで作成したものです
18
24
 
19
25
  この現象の理由と、回避方法をご教授いただければ幸いです
20
26
 

10

試したことの追加

2019/05/23 08:46

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -318,6 +318,12 @@
318
318
 
319
319
 
320
320
 
321
+ ●excelをcsvファイルとして保存し、そこから開いてみる
322
+
323
+ →結果は変わらず文字化けしている
324
+
325
+
326
+
321
327
 
322
328
 
323
329
 

9

スクショの追加

2019/05/23 08:26

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -328,9 +328,13 @@
328
328
 
329
329
  アプリケーション出力から抜粋
330
330
 
331
+ CSVの全行を取得した時
332
+
331
333
  ![](8c5d32bea5369db2417c669cfeaf5b20.png)
332
334
 
333
-
335
+ CSVの一行だけを取得した時
336
+
337
+ ![イメージ説明](ca688dd7e1aae266c3deb9953eb086c5.png)
334
338
 
335
339
 
336
340
 

8

やったこと、スクリーンショットの追加

2019/05/23 08:13

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -14,12 +14,8 @@
14
14
 
15
15
  のような文字化けを起こしてしまうのです。
16
16
 
17
-
18
-
19
17
  文字列は外部からドキュメントタイプを設定することでダウンロードしたCSVを元としております
20
18
 
21
-
22
-
23
19
  この現象の理由と、回避方法をご教授いただければ幸いです
24
20
 
25
21
 
@@ -290,8 +286,6 @@
290
286
 
291
287
  }
292
288
 
293
-
294
-
295
289
  ```
296
290
 
297
291
 
@@ -300,8 +294,6 @@
300
294
 
301
295
 
302
296
 
303
-
304
-
305
297
  試したこと
306
298
 
307
299
  ---
@@ -320,6 +312,26 @@
320
312
 
321
313
 
322
314
 
315
+ ●新規プロジェクトを作成し、ここに記載したコードのみを貼り付けて動かしてみる。
316
+
317
+ →結果は変わらず文字化けしている
318
+
319
+
320
+
321
+
322
+
323
+
324
+
325
+ コンソール出力
326
+
327
+ ---
328
+
329
+ アプリケーション出力から抜粋
330
+
331
+ ![](8c5d32bea5369db2417c669cfeaf5b20.png)
332
+
333
+
334
+
323
335
 
324
336
 
325
337
 

7

ファイル名が消えていたので修正

2019/05/23 07:26

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -32,7 +32,7 @@
32
32
 
33
33
  ----
34
34
 
35
- ```AppDelegate.cs
35
+ ```AppDelegate
36
36
 
37
37
  using System;
38
38
 

6

コードを修正しました

2019/05/23 07:00

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -16,6 +16,10 @@
16
16
 
17
17
 
18
18
 
19
+ 文字列は外部からドキュメントタイプを設定することでダウンロードしたCSVを元としております
20
+
21
+
22
+
19
23
  この現象の理由と、回避方法をご教授いただければ幸いです
20
24
 
21
25
 
@@ -24,200 +28,272 @@
24
28
 
25
29
 
26
30
 
27
- 該当コード
31
+ 問題のソースコード
28
32
 
29
33
  ----
30
34
 
35
+ ```AppDelegate.cs
36
+
37
+ using System;
38
+
39
+ using System.Collections.Generic;
40
+
41
+ using System.IO;
42
+
43
+ using System.Linq;
44
+
45
+ using DocumentFormat.OpenXml.Packaging;
46
+
47
+ using DocumentFormat.OpenXml.Spreadsheet;
48
+
49
+ using Foundation;
50
+
51
+ using UIKit;
52
+
53
+ using Cell = DocumentFormat.OpenXml.Spreadsheet.Cell;
54
+
55
+
56
+
57
+ namespace アプリケーション名.iOS
58
+
59
+ {
60
+
61
+ [Register("AppDelegate")]
62
+
63
+ public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
64
+
65
+ {
66
+
67
+ public override bool FinishedLaunching(UIApplication app, NSDictionary options)
68
+
69
+ {
70
+
71
+ global::Xamarin.Forms.Forms.Init();
72
+
73
+ LoadApplication(new App());
74
+
75
+ return base.FinishedLaunching(app, options);
76
+
77
+ }
78
+
79
+
80
+
81
+ public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options)
82
+
83
+ {
84
+
85
+ if (url.Scheme != "file"){return false;}
86
+
87
+
88
+
89
+ // ファイルを一時保存した場所の特定
90
+
91
+ var fileName = url.AbsoluteString.Split('/').Last();
92
+
93
+ var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Inbox", fileName);
94
+
95
+
96
+
97
+ if (fileName.EndsWith(".xlsx", StringComparison.CurrentCulture))
98
+
99
+ {
100
+
101
+ // filePathを編集offで開く
102
+
103
+ using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
104
+
105
+ {
106
+
107
+ // 開いたブックの各シートからcsvデータ取得
108
+
109
+ var sheets = document.WorkbookPart.Workbook.Sheets;
110
+
111
+ List<string>[] multiCSV = new List<string>[sheets.Count()];
112
+
113
+ int index = 0;
114
+
115
+ foreach (Sheet sheet in sheets)
116
+
117
+ {
118
+
119
+ WorkbookPart wbPart = document.WorkbookPart;
120
+
121
+ var sheetName = sheet.Name;
122
+
123
+ Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName);
124
+
125
+
126
+
127
+ WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
128
+
129
+
130
+
131
+ // シートからセルデータを取得してcsvとして保存
132
+
133
+ // データが大きい場合、文字列として保存すると壊れる。なので一度改行ごとにリストとして保存
134
+
135
+ // アルファベット全26字(空白入れれば27)
136
+
137
+ String[] abc =
138
+
139
+ { "", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
140
+
141
+ var csv = new List<string>();
142
+
143
+ for (int row = 1, csvEnd = 0; csvEnd == 0; row++)
144
+
145
+ {
146
+
147
+ var csvRow = "";
148
+
149
+ for (int col10 = 0, rowEnd = 0; col10 < 27 && rowEnd == 0; col10++)
150
+
151
+ {
152
+
153
+ for (int col1 = 1; col1 <= 26; col1++)
154
+
155
+ {
156
+
157
+ Cell theCell = wsPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == abc[col10] + abc[col1] + row);
158
+
159
+ // 入力範囲を超えている場合、セルは存在しない。次の行へ移る
160
+
161
+ if (theCell == null)
162
+
163
+ {
164
+
165
+ csvRow = csvRow.TrimEnd(',');
166
+
167
+ rowEnd = 1;
168
+
169
+ if (abc[col10] + abc[col1] == "A") { csvEnd = 1; }
170
+
171
+ break;
172
+
173
+ }
174
+
175
+
176
+
177
+ // 欠損値またはセルの値を記録
178
+
179
+ var val = theCell.InnerText;
180
+
181
+ if (string.IsNullOrEmpty(val))
182
+
183
+ {
184
+
185
+ csvRow += " ,";
186
+
187
+ }
188
+
189
+ else
190
+
191
+ {
192
+
193
+ bool canConvert = int.TryParse(val, out int valInt);
194
+
195
+ if (canConvert)
196
+
197
+ {
198
+
199
+ var value = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault()
200
+
201
+ .SharedStringTable.ElementAt(valInt).InnerText;
202
+
203
+ csvRow += value + ",";
204
+
205
+ }
206
+
207
+ }
208
+
209
+ }
210
+
211
+ }
212
+
213
+ csv.Add(csvRow);
214
+
215
+ }
216
+
217
+ // 最後の改行を消す
218
+
219
+ csv.RemoveAt(csv.Count() - 1);
220
+
221
+ multiCSV[index] = csv;
222
+
223
+ index++;
224
+
225
+ }
226
+
227
+
228
+
229
+ var data = "";
230
+
231
+ for (int sheetID = 0, sheetCnt = multiCSV.Length; sheetID < sheetCnt; sheetID++)
232
+
233
+ {
234
+
235
+ for (int rowID = 0, rowCnt = multiCSV[sheetID].Count(); rowID < rowCnt; rowID++)
236
+
237
+ {
238
+
239
+ var row = multiCSV[sheetID][rowID].Split(",");
240
+
241
+ for (int colID = 0, colCnt = row.Length; colID < colCnt; colID++)
242
+
243
+ {
244
+
245
+ if (colID < colCnt - 1)
246
+
247
+ {
248
+
249
+ data += row[colID] + ",";
250
+
251
+ }
252
+
253
+ else if (rowID == rowCnt - 1)
254
+
255
+ {
256
+
257
+ data += row[colID];
258
+
259
+ }
260
+
261
+ else if (colID == colCnt - 1)
262
+
263
+ {
264
+
265
+ data += row[colID] + "\n";
266
+
267
+ }
268
+
269
+ }
270
+
271
+ }
272
+
273
+ }
274
+
275
+
276
+
277
+ Console.WriteLine(data);
278
+
279
+ }
280
+
281
+ return true;
282
+
283
+ }
284
+
285
+ return false;
286
+
287
+ }
288
+
289
+ }
290
+
291
+ }
292
+
293
+
294
+
31
295
  ```
32
296
 
33
- // filePathを編集offで開く
34
-
35
- using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
36
-
37
- {
38
-
39
- // 開いたブックの各シートからcsvデータ取得
40
-
41
- var sheets = document.WorkbookPart.Workbook.Sheets;
42
-
43
- List<string>[] multiCSV = new List<string>[sheets.Count()];
44
-
45
- int index = 0;
46
-
47
- foreach (Sheet sheet in sheets)
48
-
49
- {
50
-
51
- WorkbookPart wbPart = document.WorkbookPart;
52
-
53
- var sheetName = sheet.Name;
54
-
55
- Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName);
56
-
57
-
58
-
59
- WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
60
-
61
-
62
-
63
- // シートからセルデータを取得してcsvとして保存
64
-
65
- // データが大きい場合、文字列として保存すると壊れる。なので一度改行ごとにリストとして保存
66
-
67
- // アルファベット全26字(空白入れれば27)
68
-
69
- String[] abc =
70
-
71
- { "", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
72
-
73
- var csv = new List<string>();
74
-
75
- for (int row = 1, csvEnd = 0; csvEnd == 0; row++)
76
-
77
- {
78
-
79
- var csvRow = "";
80
-
81
- for (int col10 = 0, rowEnd = 0; col10 < 27 && rowEnd == 0; col10++)
82
-
83
- {
84
-
85
- for (int col1 = 1; col1 <= 26; col1++)
86
-
87
- {
88
-
89
- Cell theCell = wsPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == abc[col10] + abc[col1] + row);
90
-
91
- // 入力範囲を超えている場合、セルは存在しない。次の行へ移る
92
-
93
- if (theCell == null)
94
-
95
- {
96
-
97
- csvRow = csvRow.TrimEnd(',');
98
-
99
- rowEnd = 1;
100
-
101
- if (abc[col10] + abc[col1] == "A") { csvEnd = 1; }
102
-
103
- break;
104
-
105
- }
106
-
107
-
108
-
109
- // 欠損値またはセルの値を記録
110
-
111
- var val = theCell.InnerText;
112
-
113
- if (string.IsNullOrEmpty(val))
114
-
115
- {
116
-
117
- csvRow += " ,";
118
-
119
- }
120
-
121
- else
122
-
123
- {
124
-
125
- bool canConvert = int.TryParse(val, out int valInt);
126
-
127
- if (canConvert)
128
-
129
- {
130
-
131
- var value = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault()
132
-
133
- .SharedStringTable.ElementAt(valInt).InnerText;
134
-
135
- csvRow += value + ",";
136
-
137
- }
138
-
139
- }
140
-
141
- }
142
-
143
- }
144
-
145
- csv.Add(csvRow);
146
-
147
- }
148
-
149
- // 最後の改行を消す
150
-
151
- csv.RemoveAt(csv.Count() - 1);
152
-
153
- multiCSV[index] = csv;
154
-
155
- index++;
156
-
157
- }
158
-
159
-
160
-
161
- var data = "";
162
-
163
- for (int sheetID = 0, sheetCnt = multiCSV.Length; sheetID < sheetCnt; sheetID++)
164
-
165
- {
166
-
167
- for (int rowID = 0, rowCnt = multiCSV[sheetID].Count(); rowID < rowCnt; rowID++)
168
-
169
- {
170
-
171
- var row = multiCSV[sheetID][rowID].Split(",");
172
-
173
- for (int colID = 0, colCnt = row.Length; colID < colCnt; colID++)
174
-
175
- {
176
-
177
- if (colID < colCnt - 1)
178
-
179
- {
180
-
181
- data += row[colID] + ",";
182
-
183
- }
184
-
185
- else if (rowID == rowCnt - 1)
186
-
187
- {
188
-
189
- data += row[colID];
190
-
191
- }
192
-
193
- else if (colID == colCnt - 1)
194
-
195
- {
196
-
197
- data += row[colID] + "\n";
198
-
199
- }
200
-
201
- }
202
-
203
- }
204
-
205
- }
206
-
207
- Console.WriteLine(data);
208
-
209
- }
210
-
211
-
212
-
213
-
214
-
215
-
216
-
217
-
218
-
219
- ```
220
-
221
297
 
222
298
 
223
299
 

5

コードに追記をいたしました

2019/05/23 06:56

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -28,55 +28,193 @@
28
28
 
29
29
  ----
30
30
 
31
- ```C#
31
+ ```
32
-
32
+
33
- var data = "";
33
+ // filePathを編集offで開く
34
-
34
+
35
- for (int sheetID = 0, sheetCnt = csv.Length; sheetID < sheetCnt; sheetID++)
35
+ using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false))
36
36
 
37
37
  {
38
38
 
39
+ // 開いたブックの各シートからcsvデータ取得
40
+
41
+ var sheets = document.WorkbookPart.Workbook.Sheets;
42
+
39
- for (int rowID = 0, rowCnt = csv[sheetID].Count(); rowID < rowCnt; rowID++)
43
+ List<string>[] multiCSV = new List<string>[sheets.Count()];
44
+
45
+ int index = 0;
46
+
47
+ foreach (Sheet sheet in sheets)
40
48
 
41
49
  {
42
50
 
51
+ WorkbookPart wbPart = document.WorkbookPart;
52
+
53
+ var sheetName = sheet.Name;
54
+
55
+ Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName);
56
+
57
+
58
+
59
+ WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id));
60
+
61
+
62
+
63
+ // シートからセルデータを取得してcsvとして保存
64
+
65
+ // データが大きい場合、文字列として保存すると壊れる。なので一度改行ごとにリストとして保存
66
+
67
+ // アルファベット全26字(空白入れれば27)
68
+
69
+ String[] abc =
70
+
71
+ { "", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };
72
+
43
- var row = csv[sheetID][rowID].Split(",");
73
+ var csv = new List<string>();
44
-
74
+
45
- for (int colID = 0, colCnt = row.Length; colID < colCnt; colID++)
75
+ for (int row = 1, csvEnd = 0; csvEnd == 0; row++)
46
76
 
47
77
  {
48
78
 
49
- if (colID < colCnt - 1)
79
+ var csvRow = "";
80
+
81
+ for (int col10 = 0, rowEnd = 0; col10 < 27 && rowEnd == 0; col10++)
50
82
 
51
83
  {
52
84
 
85
+ for (int col1 = 1; col1 <= 26; col1++)
86
+
87
+ {
88
+
89
+ Cell theCell = wsPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == abc[col10] + abc[col1] + row);
90
+
91
+ // 入力範囲を超えている場合、セルは存在しない。次の行へ移る
92
+
93
+ if (theCell == null)
94
+
95
+ {
96
+
97
+ csvRow = csvRow.TrimEnd(',');
98
+
99
+ rowEnd = 1;
100
+
101
+ if (abc[col10] + abc[col1] == "A") { csvEnd = 1; }
102
+
103
+ break;
104
+
105
+ }
106
+
107
+
108
+
109
+ // 欠損値またはセルの値を記録
110
+
111
+ var val = theCell.InnerText;
112
+
113
+ if (string.IsNullOrEmpty(val))
114
+
115
+ {
116
+
117
+ csvRow += " ,";
118
+
119
+ }
120
+
121
+ else
122
+
123
+ {
124
+
125
+ bool canConvert = int.TryParse(val, out int valInt);
126
+
127
+ if (canConvert)
128
+
129
+ {
130
+
131
+ var value = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault()
132
+
133
+ .SharedStringTable.ElementAt(valInt).InnerText;
134
+
53
- data += row[colID] + ",";
135
+ csvRow += value + ",";
136
+
137
+ }
138
+
139
+ }
140
+
141
+ }
54
142
 
55
143
  }
56
144
 
145
+ csv.Add(csvRow);
146
+
147
+ }
148
+
149
+ // 最後の改行を消す
150
+
57
- else if (rowID == rowCnt - 1)
151
+ csv.RemoveAt(csv.Count() - 1);
152
+
153
+ multiCSV[index] = csv;
154
+
155
+ index++;
156
+
157
+ }
158
+
159
+
160
+
161
+ var data = "";
162
+
163
+ for (int sheetID = 0, sheetCnt = multiCSV.Length; sheetID < sheetCnt; sheetID++)
164
+
165
+ {
166
+
167
+ for (int rowID = 0, rowCnt = multiCSV[sheetID].Count(); rowID < rowCnt; rowID++)
168
+
169
+ {
170
+
171
+ var row = multiCSV[sheetID][rowID].Split(",");
172
+
173
+ for (int colID = 0, colCnt = row.Length; colID < colCnt; colID++)
58
174
 
59
175
  {
60
176
 
177
+ if (colID < colCnt - 1)
178
+
179
+ {
180
+
181
+ data += row[colID] + ",";
182
+
183
+ }
184
+
185
+ else if (rowID == rowCnt - 1)
186
+
187
+ {
188
+
61
- data += row[colID];
189
+ data += row[colID];
190
+
191
+ }
192
+
193
+ else if (colID == colCnt - 1)
194
+
195
+ {
196
+
197
+ data += row[colID] + "\n";
198
+
199
+ }
62
200
 
63
201
  }
64
202
 
65
- else if (colID == colCnt - 1)
66
-
67
- {
68
-
69
- data += row[colID] + "\n";
70
-
71
- }
72
-
73
203
  }
74
204
 
75
205
  }
76
206
 
207
+ Console.WriteLine(data);
208
+
77
209
  }
78
210
 
79
- Console.WriteLine(data);
211
+
212
+
213
+
214
+
215
+
216
+
217
+
80
218
 
81
219
  ```
82
220
 
@@ -86,6 +224,8 @@
86
224
 
87
225
 
88
226
 
227
+
228
+
89
229
  試したこと
90
230
 
91
231
  ---

4

誤字の修正

2019/05/23 05:39

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -90,7 +90,7 @@
90
90
 
91
91
  ---
92
92
 
93
- 前提として、stringに入れる文字は外部のCSVをダウンロードしてきたもの
93
+ 前提として、stringに入れる文字は外部のCSVをダウンロードしてきたもの
94
94
 
95
95
  ●CSVの1行目だけを取り込んで、string変数に格納
96
96
 

3

試したことを追加しました

2019/05/23 05:17

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -84,6 +84,30 @@
84
84
 
85
85
 
86
86
 
87
+
88
+
89
+ 試したこと
90
+
91
+ ---
92
+
93
+ 前提として、stringに入れる文字数は外部のCSVをダウンロードしてきたもの
94
+
95
+ ●CSVの1行目だけを取り込んで、string変数に格納
96
+
97
+ →問題なく表示された
98
+
99
+
100
+
101
+ ●CSVを一行ずつ読み込んで、その度にstring変数に格納。それをアプリケーション出力ウィンドウに表示
102
+
103
+ →途中までは問題なく表示された。しかしとある行から文字化けして表示されるようになった
104
+
105
+
106
+
107
+
108
+
109
+
110
+
87
111
  開発環境
88
112
 
89
113
  ---

2

開発環境を加えました

2019/05/23 05:14

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -79,3 +79,21 @@
79
79
  Console.WriteLine(data);
80
80
 
81
81
  ```
82
+
83
+
84
+
85
+
86
+
87
+ 開発環境
88
+
89
+ ---
90
+
91
+ Visual Studio for Mac community
92
+
93
+ バージョン8.0.7
94
+
95
+
96
+
97
+ macOS Mojave
98
+
99
+ バージョン10.14.4

1

指摘頂いた点を加えました

2019/05/23 05:02

投稿

researcher
researcher

スコア87

test CHANGED
File without changes
test CHANGED
@@ -76,4 +76,6 @@
76
76
 
77
77
  }
78
78
 
79
+ Console.WriteLine(data);
80
+
79
81
  ```