private static void doProcess( PreparedInformation preparedInformation, BackgroundWorker bw, int fileGroupsLength, ICollection <string> savedFiles) { var ssc = new SnapshotController(preparedInformation.Project, @"XLS"); ssc.Initialize(); // -- var exportedReferenceLanguageValues = new HashSet <string>(); var dataSet = new DataSet(); dataSet.Tables.Clear(); DataTable dataTable = null; var currentRowIndex = 0; var suggestedWorkSheetNamesToRemove = new List <string>(); var fileGroupIndex = 0; foreach (var fileGroup in preparedInformation.FileGroups) { if (bw.CancellationPending) { throw new OperationCanceledException(); } var isFirstFileGroup = fileGroupIndex == 0; var isLastFileGroup = fileGroupIndex == preparedInformation.FileGroups.Length - 1; var worksheetIndex = -1; if (preparedInformation.ExportAllGroups) { if (dataTable == null) { dataSet.Tables.Add(); worksheetIndex = dataSet.Tables.Count - 1; dataTable = dataSet.Tables[worksheetIndex]; dataTable.TableName = Resources.SR_CommandProcessorSend_Process_ZRE_Export; } } else { dataSet.Tables.Add(); worksheetIndex = dataSet.Tables.Count - 1; dataTable = dataSet.Tables[worksheetIndex]; dataTable.TableName = generateWorksheetName(preparedInformation, fileGroup, preparedInformation.Project); } var rows = dataTable.Rows; var wantNewSheet = !preparedInformation.ExportAllGroups || isFirstFileGroup; // -- // Header. const int headerStartRowIndex = 0; const int columnStartIndex = 0; if (wantNewSheet) { if (preparedInformation.ExportFileGroupColumn) { // Checksum. // 2014-06-25 Krickbaum - Corrected type to double dataTable.Columns.Add(Resources.SR_CommandProcessorSend_Process_Group, typeof(double)); } if (preparedInformation.ExportNameColumn) { // String name. dataTable.Columns.Add(Resources.SR_CommandProcessorSend_Process_Name, typeof(string)); } if (preparedInformation.ExportReferenceLanguageColumn) { // Reference language. dataTable.Columns.Add(preparedInformation.ReferenceLanguageCode, typeof(string)); } // Destination languages. // ReSharper disable ForCanBeConvertedToForeach for (var runningColIndex = 0; // ReSharper restore ForCanBeConvertedToForeach runningColIndex < preparedInformation.DestinationLanguageCodes.Length; ++runningColIndex) { var destinationLanguageCode = preparedInformation.DestinationLanguageCodes[runningColIndex]; if (string.Compare(preparedInformation.ReferenceLanguageCode, destinationLanguageCode, StringComparison.OrdinalIgnoreCase) != 0) { dataTable.Columns.Add(destinationLanguageCode, typeof(string)); } } if (preparedInformation.ExportCommentColumn) { // String name. dataTable.Columns.Add(Resources.SR_CommandProcessorSend_Process_Comment, typeof(string)); } currentRowIndex = headerStartRowIndex; } // -- // Content. var dp = new DataProcessing(fileGroup); var table = dp.GetDataTableFromResxFiles(preparedInformation.Project, preparedInformation.ExportCommentColumn); table = removeUnusedColumns( preparedInformation, fileGroup.ParentSettings, table); var rowIndex = 0; foreach (DataRow row in table.Rows) { if ((rowIndex + 1) % 20 == 0) { bw.ReportProgress( 0, new ExcelProgressInformation { TemporaryProgressMessage = string.Format( Resources.SR_CommandProcessorSend_Process_ProcessingFileGroupOfRowOf, fileGroupIndex + 1, fileGroupsLength, rowIndex + 1, table.Rows.Count, (int)((rowIndex + 1.0) / table.Rows.Count * ((fileGroupIndex + 1.0) / fileGroupsLength) * 100)) }); if (bw.CancellationPending) { throw new OperationCanceledException(); } } if (wantExportRow( ssc, preparedInformation, fileGroup.ParentSettings, row, CommentVisibilityScope.InMemory)) { if (!wasAlreadyExported( exportedReferenceLanguageValues, preparedInformation, fileGroup.ParentSettings, row)) { var offset = 0; if (preparedInformation.ExportFileGroupColumn) { // Checksum. checkEnsureRowPresent(dataTable, currentRowIndex); rows[currentRowIndex][columnStartIndex] = fileGroup.GetChecksum(preparedInformation.Project); makeCellReadOnly(dataTable.Columns[columnStartIndex]); offset++; } if (preparedInformation.ExportNameColumn) { // String name. checkEnsureRowPresent(dataTable, currentRowIndex); rows[currentRowIndex][columnStartIndex + offset] = row[1]; // Column 0=FileGroup checksum, column 1=Tag name. makeCellReadOnly(dataTable.Columns[columnStartIndex + offset]); offset++; } var effectiveDestinationColumnIndex = 1; // Column 0=FileGroup checksum, column 1=Tag name. for (var sourceColumnIndex = 2; sourceColumnIndex < table.Columns.Count - (preparedInformation.ExportCommentColumn ? 1 : 0); // Subtract 1, because last column is ALWAYS the comment. ++sourceColumnIndex) { var languageValue = row[sourceColumnIndex] as string; var languageCode = IsFileName(table.Columns[sourceColumnIndex].ColumnName) ? new LanguageCodeDetection(preparedInformation.Project) .DetectLanguageCodeFromFileName( fileGroup.ParentSettings, table.Columns[sourceColumnIndex].ColumnName) : table.Columns[sourceColumnIndex].ColumnName; var isReferenceLanguage = string.Compare(preparedInformation.ReferenceLanguageCode, languageCode, StringComparison.OrdinalIgnoreCase) == 0; if (isReferenceLanguage && preparedInformation.ExportReferenceLanguageColumn || !isReferenceLanguage) { checkEnsureRowPresent(dataTable, currentRowIndex); var columnIndex = columnStartIndex - 1 + effectiveDestinationColumnIndex + offset; rows[currentRowIndex][columnIndex] = languageValue; if (isReferenceLanguage) { makeCellReadOnly(dataTable.Columns[columnIndex]); exportedReferenceLanguageValues.Add( string.IsNullOrEmpty(languageValue) ? string.Empty : languageValue); } effectiveDestinationColumnIndex++; } } if (preparedInformation.ExportCommentColumn) { // Comment. checkEnsureRowPresent(dataTable, currentRowIndex); rows[currentRowIndex][columnStartIndex - 1 + effectiveDestinationColumnIndex + offset] = DataProcessing.GetComment(preparedInformation.Project, row); /*offset++;*/ } currentRowIndex++; } } // In every loop, check again. suggestedWorkSheetNamesToRemove.Remove(dataTable.TableName); //CHANGED if worksheet empty: remove it) if (currentRowIndex == headerStartRowIndex + 1 && !preparedInformation.ExportAllGroups) { // http://www.codeproject.com/Messages/3539004/Export-to-Excel-bug.aspx if (worksheetIndex < dataSet.Tables.Count) { suggestedWorkSheetNamesToRemove.Add(dataTable.TableName); } } rowIndex++; } //dataTable.AutoFitRow(currentRowIndex - 1); if (bw.CancellationPending) { throw new OperationCanceledException(); } // -- if (!preparedInformation.ExportAllGroups || isLastFileGroup) { var offset = 0; if (preparedInformation.ExportFileGroupColumn) { // Checksum. //dataTable.AutoFitColumn( // columnStartIndex, // headerStartRowIndex, // currentRowIndex); offset++; } if (preparedInformation.ExportNameColumn) { // String name. //dataTable.AutoFitColumn( // columnStartIndex + offset, // headerStartRowIndex, // currentRowIndex); offset++; } if (preparedInformation.ExportReferenceLanguageColumn) { // Reference language. //dataTable.AutoFitColumn( // columnStartIndex + offset, // headerStartRowIndex, // currentRowIndex); offset++; } // Destination languages. int runningColIndex; for (runningColIndex = 0; runningColIndex < preparedInformation.DestinationLanguageCodes.Length; ++runningColIndex) { //dataTable.AutoFitColumn( // columnStartIndex + runningColIndex + offset, // headerStartRowIndex, // currentRowIndex); } if (preparedInformation.ExportCommentColumn) { // Comment. //dataTable.AutoFitColumn( // columnStartIndex + offset + runningColIndex, // headerStartRowIndex, // currentRowIndex); /*offset++;*/ } } // -- fileGroupIndex++; } // -- // 2011-01-31, Uwe Keim. // http://www.codeproject.com/Messages/3559812/Export-error.aspx foreach (var name in suggestedWorkSheetNamesToRemove) { dataSet.Tables.Remove(name); } // -- if (dataSet.Tables.Count > 0) { bw.ReportProgress( 0, new ExcelProgressInformation { TemporaryProgressMessage = string.Format( Resources.SR_CommandProcessorSend_Process_SavingMicrosoftOfficeExcelDocument) }); savedFiles.Add(preparedInformation.DestinationFilePath); CoreExcelExporter.ExportToExcelFile(dataSet, preparedInformation.DestinationFilePath); } else { bw.ReportProgress( 0, new ExcelProgressInformation { TemporaryProgressMessage = Resources.ExcelExportController_doProcess_Skipping_Microsoft_Office_Excel_document_, WarningMessage = string.Format( Resources.ExcelExportController_doProcess_Skipping_Excel_document___0___because_it_contains_no_work_sheets_, ZlpPathHelper.GetFileNameFromFilePath(preparedInformation.DestinationFilePath)) }); } // -- // At very last, to not overwrite before comparing. if (preparedInformation.Project.EnableExcelExportSnapshots) { ssc.TakeFullSnapshot( preparedInformation.FileGroups, new[] { preparedInformation.ReferenceLanguageCode }, bw); } }