private void GenerateExcelSheet(Application excel, System.Data.DataTable table)
        {
            var worksheet = (Worksheet)excel.Worksheets.Add();

            try
            {
                worksheet.Name = table.TableName;

                for (int i = 1; i < table.Columns.Count + 1; ++i)
                {
                    worksheet.Cells[1, i] = table.Columns[i - 1].ColumnName;
                }

                int sheetRow = RowOffset;
                for (int row = RowOffset; row < table.Rows.Count + RowOffset; ++row)
                {
                    bool skip          = false;
                    int  languageIndex = LanguageEncodings.Count;
                    foreach (var language in LanguageEncodings.OrderByDescending(x => x.IsPrimary ? 0 : 1))
                    {
                        if (!language.IsPrimary &&
                            SkipLocalized &&
                            !string.IsNullOrWhiteSpace(table.Rows[row - RowOffset][language.Encoding].ToString()) &&
                            (string.IsNullOrWhiteSpace(SkipLocalizedIncludeFilterRegex) ||
                             !Regex.IsMatch(table.Rows[row - RowOffset][language.Encoding].ToString(), SkipLocalizedIncludeFilterRegex, RegexOptions.Multiline)
                            )
                            )
                        {
                            skip = true;
                            break;
                        }
                        worksheet.Cells[sheetRow, languageIndex + 1] = table.Rows[row - RowOffset][language.Encoding];
                        languageIndex -= 1;
                    }

                    if (!skip)
                    {
                        worksheet.Cells[sheetRow, 1] = (string)table.Rows[row - RowOffset][Key];
                        sheetRow++;
                    }
                }

                if (sheetRow == RowOffset && SkipEmptyResources)
                {
                    //((Worksheet)excel.ActiveWorkbook.Sheets[worksheet.Index]).Delete();
                    //excel.ActiveWorkbook.Save();
                    //excel.Worksheets.Delete();
                    //(excel.Worksheets[worksheet.Index] as Worksheet).Delete();
                    excel.DisplayAlerts = false;
                    worksheet.Delete();
                    excel.DisplayAlerts = true;
                }
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex);
            }
        }
        private void GroupCommonResources(DataSet data)
        {
            const string Common = "Common";

            System.Data.DataTable table = data.Tables.Add(Common);
            table.Columns.Add(Key);
            foreach (var language in LanguageEncodings.OrderBy(x => x.IsPrimary ? 0 : 1))
            {
                table.Columns.Add(language.Encoding);
            }


            var primaryLanguage = LanguageEncodings.FirstOrDefault(x => x.IsPrimary);

            if (primaryLanguage == null)
            {
                primaryLanguage = LanguageEncodings.FirstOrDefault();
            }

            var commonEntries = GetQueryableDataSet(data, primaryLanguage)
                                .GroupBy(x => x)
                                .Where(x => x.Count() > 1)
                                .Select(x => x.Key)
                                .ToList();

            foreach (var entry in commonEntries)
            {
                var row = table.Rows.Add(entry.Key);
                row[primaryLanguage.Encoding] = entry.Value;
            }

            // We now remove all common entries from the other tables.

            foreach (System.Data.DataTable t in data.Tables)
            {
                if (t.TableName != Common)
                {
                    int count = t.Rows.Count;
                    for (int i = 0; i < count; ++i)
                    {
                        //Console.WriteLine("Group Row: {0}", i);

                        if (!(t.Rows[i][Key] is System.DBNull) && !(t.Rows[i][primaryLanguage.Encoding] is System.DBNull))
                        {
                            if (commonEntries.Exists(x => x.Key.ToString() == t.Rows[i][Key].ToString() &&
                                                     x.Value.ToString() == t.Rows[i][primaryLanguage.Encoding].ToString()))
                            {
                                t.Rows.RemoveAt(i--);
                                count -= 1;
                            }
                        }
                    }
                }
            }
        }
        private DataSet ParseResourceFiles()
        {
            //var primaryLanguage = LanguageEncodings.FirstOrDefault(x => x.IsPrimary);
            //if (primaryLanguage == null)
            //    primaryLanguage = LanguageEncodings.FirstOrDefault();

            DataSet data = new DataSet();

            foreach (var language in LanguageEncodings.OrderBy(x => x.IsPrimary ? 0 : 1))
            {
                var files = new System.IO.DirectoryInfo(ResourcesDirectory).GetFiles($"*.{language.Encoding}.resx", SearchOption.AllDirectories)
                            // Ordering them d5escending because as they're added to the excel they're added to the front.
                            .OrderByDescending(x => x.Name.Replace("_", ""))
                            .ToList();
                foreach (var file in files)
                {
                    string tableName = file.Name
                                       .Replace(file.Extension, "")
                                       .Replace($".{language.Encoding}", "")
                                       .Replace("_", "");
                    if (tableName.Length > 30)
                    {
                        tableName = tableName.Substring(0, 30);
                    }

                    if (language.IsPrimary)
                    {
                        CreateAndPopulateDataTable(data, language, file, tableName);
                    }
                    else
                    {
                        if (data.Tables[tableName] == null)
                        {
                            CreateAndPopulateDataTable(data, language, file, tableName);
                        }
                        else
                        {
                            System.Data.DataTable table = data.Tables[tableName];
                            table.Columns.Add(language.Encoding);

                            if (language.IncludedResourceValues)
                            {
                                PopulateDataTable(language, file, table, true);
                            }
                        }
                    }
                }
            }

            return(data);
        }