private static void Exit(int exitCode, string message = "") { if (!string.IsNullOrEmpty(message)) { ConsoleUtility.Error(message); } // 正常終了以外ならコンソールを閉じない. if (exitCode != 0) { Console.ReadLine(); } Environment.Exit(exitCode); }
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); } }
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()); }
/// <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()); }
//----- 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(); } }
//----- 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); }