Exemple #1
0
        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);
            }
        }