Esempio n. 1
0
        private static void Exit(int exitCode, string message = "")
        {
            if (!string.IsNullOrEmpty(message))
            {
                ConsoleUtility.Error(message);
            }

            // 正常終了以外ならコンソールを閉じない.
            if (exitCode != 0)
            {
                Console.ReadLine();
            }

            Environment.Exit(exitCode);
        }
Esempio n. 2
0
        public static void WriteAllSheetData(string workspace, SheetData[] sheetData, Settings settings)
        {
            CreateCleanDirectory(workspace);

            var rootDirectory = PathUtility.Combine(workspace, Constants.ContentsFolderName);

            var extension = settings.GetFileExtension();

            if (sheetData.IsEmpty())
            {
                return;
            }

            ConsoleUtility.Progress("------ WriteData ------");

            foreach (var data in sheetData)
            {
                if (string.IsNullOrEmpty(data.sheetName))
                {
                    continue;
                }

                var records = data.records;

                if (records == null || records.IsEmpty())
                {
                    continue;
                }

                // シート情報書き出し.

                if (!string.IsNullOrEmpty(data.sheetName))
                {
                    var fileName = data.sheetName + extension;

                    var filePath = PathUtility.Combine(rootDirectory, fileName);

                    FileSystem.WriteFile(filePath, data, settings.FileFormat);
                }

                ConsoleUtility.Task("- {0}", data.sheetName);
            }
        }
Esempio n. 3
0
        public static SheetData[] LoadAllSheetData(string workspace, Settings settings)
        {
            var rootDirectory = PathUtility.Combine(workspace, Constants.ContentsFolderName);

            if (!Directory.Exists(rootDirectory))
            {
                return(null);
            }

            // シート情報読み込み.

            var extension = settings.GetFileExtension();

            var sheetFiles = Directory.EnumerateFiles(rootDirectory, "*.*", SearchOption.TopDirectoryOnly)
                             .Where(x => Path.GetExtension(x) == extension)
                             .ToArray();

            var sheets = new List <SheetData>();

            if (sheetFiles.IsEmpty())
            {
                return(new SheetData[0]);
            }

            ConsoleUtility.Progress("------ Load SheetData ------");

            foreach (var sheetFile in sheetFiles)
            {
                var sheet = LoadSheetData(sheetFile, settings);

                if (sheet != null)
                {
                    ConsoleUtility.Task("- {0}", sheet.displayName);

                    sheets.Add(sheet);
                }
            }

            return(sheets.ToArray());
        }
Esempio n. 4
0
        /// <summary> レコード情報読み込み(.xlsx) </summary>
        public static SheetData[] LoadSheetData(string workspace, Settings settings)
        {
            var excelFilePath = PathUtility.Combine(workspace, settings.EditExcelFileName);

            if (!File.Exists(excelFilePath))
            {
                return(null);
            }

            ConsoleUtility.Progress("------ LoadExcelData ------");

            var sheets = new List <SheetData>();

            using (var excel = new ExcelPackage(new FileInfo(excelFilePath)))
            {
                foreach (var worksheet in excel.Workbook.Worksheets)
                {
                    if (worksheet.Name == settings.TemplateSheetName)
                    {
                        continue;
                    }

                    if (settings.IgnoreSheetNames.Contains(worksheet.Name))
                    {
                        continue;
                    }

                    var sheetEnumNameValue = worksheet.GetValue(Constants.SheetNameAddress.Y, Constants.SheetNameAddress.X);

                    var sheetEnumName = ExcelUtility.ConvertValue <string>(sheetEnumNameValue);

                    if (string.IsNullOrEmpty(sheetEnumName))
                    {
                        continue;
                    }

                    // 既にシートデータがある場合は読み込み.
                    var existSheetData = LoadExistSheetData(workspace, sheetEnumName, settings);

                    // データが出力されていない場合は新規Guidを割り当て.
                    var sheetGuid = existSheetData == null?Guid.NewGuid().ToString("N") : existSheetData.guid;

                    var sheetData = new SheetData()
                    {
                        guid        = sheetGuid,
                        displayName = worksheet.Name,
                        sheetName   = sheetEnumName,
                    };

                    var records = new List <RecordData>();

                    for (var r = Constants.RecordStartRow; r <= worksheet.Dimension.End.Row; r++)
                    {
                        var rowValues = ExcelUtility.GetRowValues(worksheet, r).ToArray();

                        var enumName = ExcelUtility.ConvertValue <string>(rowValues, Constants.EnumNameColumn - 1);

                        if (string.IsNullOrEmpty(enumName))
                        {
                            continue;
                        }

                        var recordGuid = string.Empty;

                        // データが出力されていない場合は新規Guidを割り当て.

                        if (existSheetData != null && existSheetData.records != null)
                        {
                            var existRecordData = existSheetData.records.FirstOrDefault(x => x.enumName == enumName);

                            if (existRecordData != null)
                            {
                                recordGuid = existRecordData.guid;
                            }
                        }

                        if (string.IsNullOrEmpty(recordGuid))
                        {
                            recordGuid = Guid.NewGuid().ToString("N");
                        }

                        var description = ExcelUtility.ConvertValue <string>(rowValues, Constants.DescriptionColumn - 1);

                        var record = new RecordData()
                        {
                            guid        = recordGuid,
                            enumName    = enumName,
                            description = description,
                        };

                        // 言語タイプ数取得.

                        var textEndColumn = Constants.TextStartColumn;

                        for (var c = Constants.TextStartColumn; c < rowValues.Length; c++)
                        {
                            var textTypeValue = worksheet.GetValue(Constants.TextTypeStartRow, c);

                            var textTypeName = ExcelUtility.ConvertValue <string>(textTypeValue);

                            if (string.IsNullOrEmpty(textTypeName))
                            {
                                break;
                            }

                            textEndColumn++;
                        }

                        // テキスト取得.

                        var texts = new List <string>();

                        for (var c = Constants.TextStartColumn; c < textEndColumn; c++)
                        {
                            var text = ExcelUtility.ConvertValue <string>(rowValues, c - 1);

                            texts.Add(text);
                        }

                        record.texts = texts.ToArray();

                        // セル情報取得.

                        var cells = new List <ExcelCell>();

                        for (var c = Constants.TextStartColumn; c < textEndColumn; c++)
                        {
                            var cellData = ExcelCellUtility.Get <ExcelCell>(worksheet, r, c);

                            if (cellData == null)
                            {
                                continue;
                            }

                            cellData.address = string.Format("{0},{1}", r, c);

                            cells.Add(cellData);
                        }

                        record.cells = cells.Any() ? cells.ToArray() : null;

                        records.Add(record);
                    }

                    sheetData.records = records.ToArray();

                    sheets.Add(sheetData);

                    ConsoleUtility.Task("- {0}", sheetData.displayName);
                }
            }

            return(sheets.ToArray());
        }
Esempio n. 5
0
        //----- params -----

        //----- field -----


        //----- property -----

        //----- method -----

        public static void Build(string workspace, IndexData indexData, SheetData[] sheetData, Settings settings)
        {
            var originExcelPath = Path.GetFullPath(settings.ExcelPath);

            var editExcelPath = PathUtility.Combine(workspace, settings.EditExcelFileName);

            ConsoleUtility.Progress("------ Build edit excel file ------");

            //------ エディット用にエクセルファイルを複製 ------

            if (!File.Exists(originExcelPath))
            {
                throw new FileNotFoundException(string.Format("{0} is not exists.", originExcelPath));
            }

            var originXlsxFile = new FileInfo(originExcelPath);

            var editXlsxFile = originXlsxFile.CopyTo(editExcelPath, true);

            //------ レコード情報を書き込み ------

            if (sheetData == null)
            {
                return;
            }

            using (var excel = new ExcelPackage(editXlsxFile))
            {
                var worksheets = excel.Workbook.Worksheets;

                // テンプレートシート.

                var templateSheet = worksheets.FirstOrDefault(x => x.Name.ToLower() == settings.TemplateSheetName);

                if (templateSheet == null)
                {
                    throw new Exception(string.Format("Template worksheet {0} not found.", settings.TemplateSheetName));
                }

                // シート作成.

                foreach (var data in sheetData)
                {
                    if (string.IsNullOrEmpty(data.displayName))
                    {
                        continue;
                    }

                    if (worksheets.Any(x => x.Name == data.displayName))
                    {
                        throw new Exception(string.Format("Worksheet create failed. Worksheet {0} already exists", data.displayName));
                    }

                    // テンプレートシートを複製.
                    var newWorksheet = worksheets.Add(data.displayName, templateSheet);

                    // 保護解除.
                    newWorksheet.Protection.IsProtected = false;
                    // タブ選択状態解除.
                    newWorksheet.View.TabSelected = false;
                    // セルサイズ調整.
                    newWorksheet.Cells.AutoFitColumns();

                    // エラー無視.
                    var excelIgnoredError = newWorksheet.IgnoredErrors.Add(newWorksheet.Dimension);

                    excelIgnoredError.NumberStoredAsText = true;
                }

                // シート順番入れ替え.

                if (worksheets.Any() && indexData != null)
                {
                    for (var i = indexData.sheetNames.Length - 1; 0 <= i; i--)
                    {
                        var sheetName = indexData.sheetNames[i];

                        if (worksheets.All(x => x.Name != sheetName))
                        {
                            continue;
                        }

                        worksheets.MoveToStart(sheetName);
                    }
                }

                // 先頭のシートをアクティブ化.

                var firstWorksheet = worksheets.FirstOrDefault();

                if (firstWorksheet != null)
                {
                    firstWorksheet.View.TabSelected = true;
                }

                // コールバック作成.

                var ignoreWrapColumn = new int[]
                {
                    Constants.GuidColumn,
                    Constants.EnumNameColumn,
                };

                Func <int, int, string, bool> wrapTextCallback = (r, c, text) =>
                {
                    var result = true;

                    // 除外対象に含まれていない.
                    result &= !ignoreWrapColumn.Contains(c);
                    // 改行が含まれている.
                    result &= text.FixLineEnd().Contains("\n");

                    return(result);
                };

                // レコード情報設定.

                foreach (var data in sheetData)
                {
                    var worksheet = worksheets.FirstOrDefault(x => x.Name == data.displayName);

                    if (worksheet == null)
                    {
                        ConsoleUtility.Error("Worksheet:{0} not found.", data.displayName);
                        continue;
                    }

                    var dimension = worksheet.Dimension;

                    var records = data.records;

                    if (records == null)
                    {
                        continue;
                    }

                    worksheet.SetValue(Constants.SheetNameAddress.Y, Constants.SheetNameAddress.X, data.sheetName);

                    SetGuid(worksheet, Constants.SheetGuidAddress.Y, Constants.SheetGuidAddress.X, data.guid);

                    // レコード投入用セルを用意.

                    for (var i = 0; i < records.Length; i++)
                    {
                        var recordRow = Constants.RecordStartRow + i;

                        // 行追加.
                        if (worksheet.Cells.End.Row < recordRow)
                        {
                            worksheet.InsertRow(recordRow, 1);
                        }

                        // セル情報コピー.
                        for (var column = 1; column < dimension.End.Column; column++)
                        {
                            CloneCellFormat(worksheet, Constants.RecordStartRow, recordRow, column);
                        }
                    }

                    // 値設定.

                    for (var i = 0; i < records.Length; i++)
                    {
                        var r = Constants.RecordStartRow + i;

                        var record = records[i];

                        // Guid.
                        SetGuid(worksheet, r, Constants.GuidColumn, record.guid);

                        // Enum名.
                        worksheet.SetValue(r, Constants.EnumNameColumn, record.enumName);

                        // 説明.
                        worksheet.SetValue(r, Constants.DescriptionColumn, record.description);

                        // テキスト.
                        for (var j = 0; j < record.texts.Length; j++)
                        {
                            var text = record.texts[j];

                            if (string.IsNullOrEmpty(text))
                            {
                                continue;
                            }

                            worksheet.SetValue(r, Constants.TextStartColumn + j, text);
                        }

                        // セル情報.
                        if (record.cells != null)
                        {
                            foreach (var cellData in record.cells)
                            {
                                if (cellData == null)
                                {
                                    continue;
                                }

                                var address = cellData.address.Split(',');

                                var rowStr    = address.ElementAtOrDefault(0);
                                var columnStr = address.ElementAtOrDefault(1);

                                if (string.IsNullOrEmpty(rowStr) || string.IsNullOrEmpty(columnStr))
                                {
                                    continue;
                                }

                                var row    = Convert.ToInt32(rowStr);
                                var column = Convert.ToInt32(columnStr);

                                ExcelCellUtility.Set <ExcelCell>(worksheet, row, column, cellData);
                            }
                        }
                    }

                    // セルサイズを調整.

                    var maxRow = Constants.RecordStartRow + records.Length + 1;

                    var celFitRange = worksheet.Cells[1, 1, maxRow, dimension.End.Column];

                    ExcelUtility.FitColumnSize(worksheet, celFitRange, null, 150, wrapTextCallback);

                    // GUID行は幅固定.
                    worksheet.Column(Constants.GuidColumn).Width = 20d;

                    ExcelUtility.FitRowSize(worksheet, celFitRange);

                    ConsoleUtility.Task("- {0}", data.displayName);
                }

                // 保存.
                excel.Save();
            }
        }
Esempio n. 6
0
        //----- field -----

        //----- property -----

        //----- method -----

        static void Main(string[] args)
        {
            // コマンドライン引数.

            var options = Parser.Default.ParseArguments <CommandLineOptions>(args) as Parsed <CommandLineOptions>;

            if (options == null)
            {
                Exit(1, "Arguments parse failed.");
            }

            // 設定ファイル.

            var settings = new Settings();

            if (!settings.Load())
            {
                Exit(1, "Settings load failed.");
            }

            // EPPlus License setup.
            ExcelPackage.LicenseContext = LicenseContext.NonCommercial;

            // メイン処理.

            var workspace = options.Value.Workspace;

            var mode = options.Value.Mode;

            /*=== 開発用 ========================================
             *
             #if DEBUG
             *
             * workspace = @"";
             *
             * Directory.SetCurrentDirectory(workspace);
             *
             * mode = "import";
             *
             #endif
             *
             * //==================================================*/

            Console.WriteLine();

            ConsoleUtility.Info("Workspace : {0}", workspace);

            try
            {
                switch (mode)
                {
                case "import":
                    Import(workspace, settings);
                    break;

                case "export":
                    Export(workspace, settings);
                    break;

                default:
                    throw new NotSupportedException("Unknown mode selection.");
                }
            }
            catch (Exception e)
            {
                Exit(1, e.ToString());
            }

            ConsoleUtility.Info("Complete!");

            // 終了.

            Exit(0);
        }