private static void MakeExcel(TOptions.TArgs opt) { var langInfo = new PfkLanguageInfo(); PfkLanguageDao.LoadFromFile(langInfo, opt.FileNameLangInput); var fanInfo = new PfkLanguageInfo(); if (!string.IsNullOrWhiteSpace(opt.FileNameFanInput)) { //// 有志翻訳版の言語情報を作成する。 PfkLanguageDao.LoadFromFile(fanInfo, opt.FileNameFanInput); } //// UMM対応版データを読み込む。 var ummDataInfo = new PfkUmmDataInfo(); if (!string.IsNullOrEmpty(opt.FileNameUmm)) { PfkUmmDataDao.LoadFromCsv(ummDataInfo, opt.FileNameUmm); } PfkTransSheetDao.SaveToExcel( langInfo, fanInfo, ummDataInfo, opt.FileNameSheet, opt.RowsPerSheet, opt.UseTag); }
public static void SaveToExcel( PfkLanguageInfo langInfo, PfkLanguageInfo funInfo, PfkUmmDataInfo ummDataInfo, string path, int maxRowCount, bool useTag) { using (var workbook = new XLWorkbook()) { IXLWorksheet worksheet = null; bool useFunTrans = false; if (funInfo.Items.Count > 0) { useFunTrans = true; } if (maxRowCount == 0) { maxRowCount = 9999999; } int sheetNo = 1; foreach (var langFile in langInfo.Items.Values) { int sequenceNo = 1; int rowNo = maxRowCount + 2; foreach (var langEntry in langFile.Items.Values) { if (string.IsNullOrWhiteSpace(langEntry.Text)) { continue; } if (rowNo > maxRowCount + 1) { worksheet = workbook.Worksheets.Add($"Sheet{sheetNo}"); sheetNo++; //// ヘッダー出力 WriteExcelHeader(worksheet); rowNo = 2; } // 出力 var data = new PfkTransSheetEntry(); data.Key = langEntry.Key; data.English = langEntry.Text; //// 有志翻訳版が指定された場合は、有志翻訳のデータを反映する。 if (useFunTrans) { var funEntry = funInfo.GetEntry(langEntry.Key); if (JapaneseStringUtils.TJapaneseStringUtils.ContainsJapanese(funEntry.Text)) { data.Japanese = funEntry.Text; } } if (useTag) { //// 制御文字をタグ化する。 data.English = PfkTransSheetEntry.GetEscapedText(data.English); data.Japanese = PfkTransSheetEntry.GetEscapedText(data.Japanese); } //// TAB文字は無条件にタグ化する。 //// 理由:CSVファイルを表計算ソフトで読み込んだ場合、TAB文字は無視されてしまう場合があるため。 data.English = PfkTransSheetEntry.GetEscapedTab(data.English); data.Japanese = PfkTransSheetEntry.GetEscapedTab(data.Japanese); //// UMMデータの取得 var ummDataEntry = ummDataInfo.GetEntry(data.Key); if (ummDataEntry == null) { data.MachineTranslation = string.Empty; } else { //// UMMデータがある場合は機械翻訳として取り込む。 data.MachineTranslation = PfkTransSheetEntry.GetEscapedTab(ummDataEntry.Value); } //// リファレンスIDを算出する。 data.ReferenceID = PfkHashTools.ComputeHashX(langEntry.Key.ToString()); data.Sequence = sequenceNo; //// 各カラムの属性を設定する。 int dummyInt = 0; if (int.TryParse(data.English, out dummyInt)) { //// 符号付き数値を適切の扱うための対処。 //// シングルコーテーションを付けた文字列形式で格納する。 worksheet.Cell(rowNo, 2).Style.NumberFormat.Format = "@"; worksheet.Cell(rowNo, 2).Style.IncludeQuotePrefix = true; worksheet.Cell(rowNo, 3).Style.NumberFormat.Format = "@"; worksheet.Cell(rowNo, 3).Style.IncludeQuotePrefix = true; } else if ( data.English.StartsWith("-") || data.English.StartsWith("+") || data.English.StartsWith("=")) { //// 計算式と誤認されないようにするための対処。 //// シングルコーテーションを付けた標準形式で格納する。 //// (注:文字列形式では255文字以上のデータがエラーとなるため不可) worksheet.Cell(rowNo, 2).Style.IncludeQuotePrefix = true; worksheet.Cell(rowNo, 3).Style.IncludeQuotePrefix = true; } else { //// 上記以外のデータは標準形式とする。 } //// データを転機する。 worksheet.Cell(rowNo, 1).Value = data.Key; worksheet.Cell(rowNo, 2).Value = data.English; worksheet.Cell(rowNo, 3).Value = data.Japanese; worksheet.Cell(rowNo, 4).Value = data.MachineTranslation; worksheet.Cell(rowNo, 5).Style.NumberFormat.Format = "@"; worksheet.Cell(rowNo, 5).Style.IncludeQuotePrefix = true; worksheet.Cell(rowNo, 5).Value = data.ReferenceID; worksheet.Cell(rowNo, 6).Value = data.Sequence; rowNo++; sequenceNo++; } } workbook.SaveAs(path); } }