示例#1
0
 static bool SeedToExcel(ToOptions opts)
 {
     if (opts.config != null && opts.config.Length > 0)
     {
         opts = BasicOptions.Load(opts.config).ToOptions(
             files: opts.files,
             seedInput: opts.seedInput,
             xlsxInput: opts.xlsxInput,
             output: opts.output
             );
     }
     return(SeedTableInterface.SeedToExcel(opts));
 }
        public static bool SeedToExcel(ToOptions options)
        {
            Log("engine", options.engine);
            Log("output-directory", options.output);
            var startTime    = DateTime.Now;
            var previousTime = startTime;

            foreach (var file in options.files)
            {
                var filePath = Path.Combine(options.xlsxInput, file);
                Log(file);
                Log("  full-path", filePath);
                CheckFileExists(filePath);
                switch (options.engine)
                {
                case ToOptions.Engine.OpenXml:
                    using (var excelData = OpenXml.ExcelData.FromFile(filePath, true)) {
                        var parseFinishTime = DateTime.Now;
                        DurationLog("  parse-time", previousTime, parseFinishTime);
                        previousTime = SeedToExcelCore(excelData, file, options, startTime, parseFinishTime);
                    }
                    break;

                case ToOptions.Engine.ClosedXML:
                    using (var excelData = ClosedXML.ExcelData.FromFile(filePath)) {
                        var parseFinishTime = DateTime.Now;
                        DurationLog("  parse-time", previousTime, parseFinishTime);
                        previousTime = SeedToExcelCore(excelData, file, options, startTime, parseFinishTime);
                    }
                    break;

                case ToOptions.Engine.EPPlus:
                    using (var excelData = EPPlus.ExcelData.FromFile(filePath)) {
                        var parseFinishTime = DateTime.Now;
                        DurationLog("  parse-time", previousTime, parseFinishTime);
                        previousTime = SeedToExcelCore(excelData, file, options, startTime, parseFinishTime);
                    }
                    break;
                }
            }
            DurationLog("total", startTime, DateTime.Now);
            return(true);
        }
        static DateTime SeedToExcelCore(IExcelData excelData, string file, ToOptions options, DateTime startTime, DateTime previousTime)
        {
            Log("  sheets");
            var fileName      = Path.GetFileName(file);
            var sheetsConfig  = new SheetsConfig(options.only, options.ignore, null, null, options.mapping, options.alias);
            var yamlDataCache = new Dictionary <string, YamlData>(); // aliasのため同テーブルはキャッシュする

            foreach (var sheetName in excelData.SheetNames)
            {
                var yamlTableName = sheetsConfig.YamlTableName(fileName, sheetName);
                if (yamlTableName == sheetName)
                {
                    Log($"    {yamlTableName}");
                }
                else
                {
                    Log($"    {yamlTableName} -> {sheetName}");
                }
                if (!sheetsConfig.IsUseSheet(fileName, sheetName, yamlTableName, OnOperation.To))
                {
                    Log("      ignore", "skip");
                    continue;
                }
                var subdivide = sheetsConfig.subdivide(fileName, yamlTableName, OnOperation.To);
                var seedTable = GetSeedTable(excelData, sheetName, options, subdivide);
                if (seedTable.Errors.Count != 0)
                {
                    continue;
                }
                YamlData yamlData = null;
                if (!yamlDataCache.TryGetValue(yamlTableName, out yamlData))
                {
                    try {
                        yamlData = YamlData.ReadFrom(yamlTableName, options.seedInput, options.seedExtension, subdivide.KeyColumnName);
                        yamlDataCache[yamlTableName] = yamlData;
                    } catch (FileNotFoundException exception) {
                        Log("      skip", $"seed file [{exception.FileName}] not found");
                        continue;
                    }
                }
                try {
                    seedTable.DataToExcel(yamlData.Data, options.delete);
                } catch (IdParseException exception) {
                    WriteInfo($"      ERROR: {exception.Message}");
                    throw new CannotContinueException();
                }
                var now = DateTime.Now;
                DurationLog("      write-time", previousTime, now);
                previousTime = now;
            }
            // 数式を再計算して結果をキャッシュする
            if (options.calcFormulas && excelData is EPPlus.ExcelData)
            {
                ((EPPlus.ExcelData)excelData).Calculate();
            }
            if (options.output.Length == 0)
            {
                excelData.Save();
                Log("  write-path", "overwrite");
            }
            else
            {
                var writePath = Path.Combine(options.output, file);
                Log("  write-path", writePath);
                if (!Directory.Exists(options.output))
                {
                    Directory.CreateDirectory(options.output);
                }
                excelData.SaveAs(writePath);
            }
            var end = DateTime.Now;

            DurationLog("  write-time", previousTime, end);
            return(end);
        }