using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Diagnostics; using System.Reflection; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using Microsoft.Office.Interop.Excel; // zusätzlich ist der Projektverweis auf COM -> Microsoft Excel xx-Objectlibrary namespace Test_ExcelReadColumn { public partial class Form1 : Form { #region Version und Copyright // Version und Copyright string programName = Path.GetFileNameWithoutExtension(System.Reflection.Assembly.GetExecutingAssembly().GetName().CodeBase); //Den Programmnamen auslesen string programVersion = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version.ToString(); static object[] attributes = Assembly.GetExecutingAssembly().GetCustomAttributes(typeof(AssemblyCopyrightAttribute), false); string copyright = ((AssemblyCopyrightAttribute)attributes[0]).Copyright; string icon = System.Windows.Forms.Application.StartupPath + "\\Info.bmp"; //Assembly Datum und Zeit static DateTime value = AssemblyDateTime(); string date = value.ToShortDateString(); string time = value.ToLongTimeString(); private static DateTime AssemblyDateTime() { var version = System.Reflection.Assembly.GetExecutingAssembly().GetName().Version; var buildDateTime = new DateTime(2000, 1, 1).Add(new TimeSpan(TimeSpan.TicksPerDay * version.Build + TimeSpan.TicksPerSecond * 2 * version.Revision)); //Tage seit dem 1. Januar 2000 und Sekunden seit Mitternacht, (multiplizier mit 2 ergibt das Original) return buildDateTime; } #endregion #region Programm-Info /// /// Contains the name of the program file /// public static string ProgramName { set; get; } /// /// Contains the version of the program file /// public static string ProgramVersion { set; get; } /// /// Contains the copyright notice /// public static string Copyright { set; get; } private void SetProgramInfo() { //Name, Version und Copyright setzen ProgramName = programName; ProgramVersion = programVersion; Copyright = copyright; } #endregion //Spalten Namen const string colObject = "Objekt"; const string colVStatus = "VStat"; const string colItemNumber = "ItemNumber"; const string colStatus = "Status"; int colomnStatus = 0; int oRangeSap; int oRangeReuse; string fileNameReuse = ""; ////oExcelApp benötigt den kompletten Namensraum, da andernfalls der Compiler den Unterschied zwischen ////"Microsoft.Office.Interop.Excel.Application" und "System.Windows.Forms.Application" nicht erkennen kann //private Microsoft.Office.Interop.Excel.Application oExcelApp = new Microsoft.Office.Interop.Excel.Application(); //private Workbook oWorkbook = null; //private Worksheet oWorksheet = null; public Form1() { SetProgramInfo(); //Name, Version und Copyright setzen InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { this.MaximumSize = new Size(808, Screen.PrimaryScreen.Bounds.Height - 30); //Um 30 kleiner, weil sonst der untere Rand hinter der Start-Leiste verschwindet } private void buttonReadSapColumn_Click(object sender, EventArgs e) { List columnObject = new List(); List columnVstat = new List(); List columnStat = new List(); labelSaveStatus.Visible = false; buttonReadSapColumn.Enabled = false; //Datei öffnen string fileName = ReadFileName("Browse SAP Excel File"); var excel = new Excel(fileName); columnObject = excel.ReadColumn(colObject); columnVstat = excel.ReadColumn(colVStatus); columnStat = TranslateColumnValue(excel.RangeColumns, columnVstat); oRangeSap = excel.RangeColumns; dataGridViewExcelSAP.Rows.Add(excel.RangeColumns - 2); //Feld anlegen for (int i = 0; i < excel.RangeColumns - 1; i++) { dataGridViewExcelSAP.Rows[i].Cells[0].Value = columnObject[i]; dataGridViewExcelSAP.Rows[i].Cells[1].Value = columnVstat[i]; dataGridViewExcelSAP.Rows[i].Cells[2].Value = columnStat[i]; } excel.CloseSheet(); buttonReadSapColumn.Enabled = false; buttonReadReuseColumns.Enabled = true; } private void buttonReadReuseColumns_Click(object sender, EventArgs e) { List columnItemNumber = new List(); List columnStatusOld = new List(); List columnStatusNew = new List(); List changeStatus = new List(); buttonReadReuseColumns.Enabled = false; //Datei öffnen fileNameReuse = ReadFileName("Browse Reuse Excel File"); var excel = new Excel(fileNameReuse); columnItemNumber = excel.ReadColumn(colItemNumber); columnStatusOld = excel.ReadColumn(colStatus); oRangeReuse = excel.RangeColumns; columnStatusNew = MatchValues(oRangeReuse, columnItemNumber, columnStatusOld); changeStatus = MatchChangeStatus(columnStatusOld, columnStatusNew); colomnStatus = excel.ColumnNumber(colStatus); dataGridViewExcelReuse.Rows.Add(excel.RangeColumns - 2); //Feld anlegen for (int i = 0; i < excel.RangeColumns - 1; i++) { dataGridViewExcelReuse.Rows[i].Cells[0].Value = columnItemNumber[i]; dataGridViewExcelReuse.Rows[i].Cells[1].Value = columnStatusOld[i]; dataGridViewExcelReuse.Rows[i].Cells[2].Value = columnStatusNew[i]; dataGridViewExcelReuse.Rows[i].Cells[3].Value = changeStatus[i]; } excel.CloseSheet(); buttonSaveChanges.Enabled = true; } private void buttonSaveChanges_Click(object sender, EventArgs e) { List columnStatusNew = new List(); List changeStatus = new List(); for (int i = 0; i < oRangeReuse - 1; i++) { columnStatusNew.Add(dataGridViewExcelReuse.Rows[i].Cells[2].Value); changeStatus.Add((bool)dataGridViewExcelReuse.Rows[i].Cells[3].Value); } var excel = new Excel(fileNameReuse); excel.WriteColumn(colStatus, columnStatusNew, changeStatus); excel.CloseSheet(); buttonSaveChanges.Enabled = false; buttonReadSapColumn.Enabled = true; labelSaveStatus.Visible = true; CleanUpView(); } private string ReadFileName(string title) { openFileDialogExcel = new OpenFileDialog(); openFileDialogExcel.Title = title; openFileDialogExcel.DefaultExt = "xlsx"; openFileDialogExcel.Filter = "Excel file (*.xlsx)|*.xlsx|All files (*.*)|*.*"; openFileDialogExcel.FilterIndex = 1; openFileDialogExcel.CheckFileExists = true; openFileDialogExcel.CheckPathExists = true; openFileDialogExcel.ShowDialog(); return openFileDialogExcel.FileName; } private List TranslateColumnValue(int rangeColumns, List columnVstat) { string temp = ""; List newValues = new List(); for (int i = 0; i < rangeColumns - 1; i++) { temp = columnVstat[i].ToString(); temp = temp.Remove(temp.LastIndexOf(")")); temp = temp.Remove(0, temp.IndexOf("(") + 1); newValues.Add(temp); } return newValues; } private List MatchValues (int range, List columnItemNumber, List columnStatusOld) { List columnStatusNew = new List(); string value = ""; for (int i = 0; i < range - 1; i++) { //Zeilenweise die 'ItemNumber' einlesen. Wenn der Wert nicht '' ist, dann in der SAP Liste Spalte 1 durchsuchen ob der Wert existiert. Existiert der Wert, dann den Wert aus 'Status' in 'StatusNew' schreiben und 'ChangeStatus' setzen. if (columnItemNumber[i] != null) { if (columnItemNumber[i].ToString() != "") { value = DetermineValue(oRangeSap, columnItemNumber[i].ToString()); columnStatusNew.Add(value); } else { columnStatusNew.Add(null); } } else { columnStatusNew.Add(columnItemNumber[i]); } } return columnStatusNew; } private List MatchChangeStatus(List columnStatusOld, List columnStatusNew) { List changeStatus = new List(); int range = columnStatusOld.Count; for (int i = 0; i < range; i++) { if (columnStatusNew[i] == null || columnStatusNew[i].ToString() == "" || columnStatusOld[i].ToString() == columnStatusNew[i].ToString()) { changeStatus.Add(false); } else { changeStatus.Add(true); } } return changeStatus; } private string DetermineValue(int range, string value) { string newValue = ""; for (int j = 0; j < range - 1; j++) { if (dataGridViewExcelSAP.Rows[j].Cells[0].Value != null) { if (dataGridViewExcelSAP.Rows[j].Cells[0].Value.ToString() == value) { newValue = dataGridViewExcelSAP.Rows[j].Cells[2].Value.ToString(); break; } } } return newValue; } private void CleanUpView() { dataGridViewExcelSAP.Rows.Clear(); dataGridViewExcelReuse.Rows.Clear(); } } }