現在、Xamarin.iOSでアプリケーションの作成を学んでいる者です
https://www.city.tome.miyagi.jp/kikakuseisaku/documents/042129_aed.xlsx
1.上記xlsx「AED設置箇所一覧」を開いて共有ボタンを押し、自分のアプリケーションを開く
2.そうして取得したxlsxファイルのデータからcsv形式の文字列を生成
以上のような流れを想定してアプリケーションを作成しております。
しかし、上記xlsxファイルの全データを連結して文字列を作成し、Console.WriteLine()で中身を確認したところ、文字化けが起きてしまい困っています
その理由に心当たりのある方がおられましたら、ご教授をお願いします
問題のソースコード
AppDelegate
1using System; 2using System.IO; 3using System.Linq; 4using System.Text; 5using DocumentFormat.OpenXml.Packaging; 6using DocumentFormat.OpenXml.Spreadsheet; 7using Foundation; 8using UIKit; 9using Cell = DocumentFormat.OpenXml.Spreadsheet.Cell; 10 11namespace TestApp.iOS 12{ 13 [Register("AppDelegate")] 14 public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate 15 { 16 public override bool FinishedLaunching(UIApplication app, NSDictionary options) 17 { 18 global::Xamarin.Forms.Forms.Init(); 19 LoadApplication(new App()); 20 return base.FinishedLaunching(app, options); 21 } 22 23 public override bool OpenUrl(UIApplication app, NSUrl url, NSDictionary options) 24 { 25 if (url.Scheme != "file") { return false; } 26 27 // ファイルを一時保存した場所の特定 28 var fileName = url.AbsoluteString.Split('/').Last(); 29 var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Personal), "Inbox", fileName); 30 31 if (fileName.EndsWith(".xlsx", StringComparison.CurrentCulture)) 32 { 33 // 編集offで開く 34 using (SpreadsheetDocument document = SpreadsheetDocument.Open(filePath, false)) 35 { 36 // 開いたブックの各シートのデータをcsv形式の文字列として保存 37 var sheets = document.WorkbookPart.Workbook.Sheets; 38 string[] allCSV = new string[sheets.Count()]; 39 int index = 0; 40 foreach (Sheet sheet in sheets) 41 { 42 WorkbookPart wbPart = document.WorkbookPart; 43 var sheetName = sheet.Name; 44 Sheet theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault(s => s.Name == sheetName); 45 46 WorksheetPart wsPart = (WorksheetPart)(wbPart.GetPartById(theSheet.Id)); 47 48 // シートからセルデータを取得してcsvとして保存 49 String[] abc = 50 { "", "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" }; 51 StringBuilder csv = new StringBuilder(); 52 for (int row = 1, csvEnd = 0; csvEnd == 0; row++) 53 { 54 var csvRow = ""; 55 for (int col10 = 0, rowEnd = 0; col10 < 27 && rowEnd == 0; col10++) 56 { 57 for (int col1 = 1; col1 <= 26; col1++) 58 { 59 Cell theCell = wsPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference == abc[col10] + abc[col1] + row); 60 // 入力範囲を超えている場合、セルは存在しない。次の行へ移る 61 if (theCell == null) 62 { 63 csvRow = csvRow.TrimEnd(','); 64 csvRow += Environment.NewLine; 65 rowEnd = 1; 66 if (abc[col10] + abc[col1] == "A") { csvEnd = 1; } 67 break; 68 } 69 70 // 欠損値またはセルの値を記録 71 var val = theCell.InnerText; 72 if (string.IsNullOrEmpty(val)) 73 { 74 csvRow += " ,"; 75 } 76 else 77 { 78 bool canConvert = int.TryParse(val, out int valInt); 79 if (canConvert) 80 { 81 var value = wbPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault() 82 .SharedStringTable.ElementAt(valInt).InnerText; 83 csvRow += value + ","; 84 } 85 } 86 } 87 } 88 89 Console.WriteLine("少しずつ確認"); 90 Console.WriteLine(csv); 91 csv.Append(csvRow); 92 } 93 94 allCSV[index] = csv.ToString(); 95 96 Console.WriteLine("全行確認"); 97 Console.WriteLine(allCSV[index]); 98 99 index++; 100 } 101 } 102 return true; 103 } 104 return false; 105 } 106 } 107}
試したこと
●上記のxlsxの1行目のデータだけを取り込んで、string変数に格納
→問題なく表示された。10行目までのデータからなら文字化けしない
●実機(iPad)ではなくエミュレータ(iphoneXR iOS 12.2)で動かす
→文字化けしなかった
コンソール出力
アプリケーション出力から抜粋
CSVの全行を取得した時
CSVの一行だけを取得した時
開発環境
Visual Studio for Mac community
バージョン8.0.7
macOS Mojave
バージョン10.14.4
実行環境
iPad
バージョン12.2
あなたの回答
tips
プレビュー