private void DrawAllGraphs(int columns) { bool screenUpdating = Application.ScreenUpdating; Application.ScreenUpdating = false; Worksheet worksheet = Globals.Factory.GetVstoObject(this.Application.ActiveWorkbook.ActiveSheet); WorksheetReader reader = new WorksheetReader(worksheet); List <Table> tables = new List <Table>(); List <Data> dataList = new List <Data>(); GetGraphsAndTablesWorksheet(); Worksheet newWorksheet = (Worksheet)Globals.Factory.GetVstoObject(Application.ActiveWorkbook.Sheets["Wykresy i Tabele"]); bool error = false; String errorString = ""; List <String> parametersList = new List <String>(); for (int c = 0; c < columns && !error; ++c) { bool foundSomething = true; int colTrans = 0; int graphNum = 0; while (foundSomething && !error) { int column = 1 + (c + columns * colTrans) * _COLUMNS_DISTANCE; bool foundNext = true; int rowPos = 1; for (int rowsSearched = 0; rowsSearched < _MAX_SEARCH && ((Excel.Range)worksheet.Cells[rowPos, column]).Value2 == null ; ++rowsSearched) { ++rowPos; } if (((Excel.Range)worksheet.Cells[rowPos, column]).Value2 == null) { foundNext = false; } foundSomething = foundNext; while (foundNext && !error) { String blockType = null; if (reader.IsString(rowPos, column)) { blockType = reader.GetString(rowPos, column); } if (blockType == null || blockType[0] != '[' || blockType[blockType.Length - 1] != ']') { foundNext = false; continue; } blockType = blockType.Substring(1, blockType.Length - 2); switch (blockType) { case "parametry": int parametersCount = (int)((Excel.Range)worksheet.Cells[rowPos, column + 1]).Value2; while (parametersCount-- > 0) { ++rowPos; parametersList.Add((string)((Excel.Range)worksheet.Cells[rowPos, column + 1]).Value2); } break; case "wykres": ++rowPos; if (!reader.IsString(rowPos, column) || !reader.GetString(rowPos, column).Equals("nazwa:")) { error = true; errorString = "Błąd przy 'nazwa:' w 'wykres' - wiersz " + rowPos; break; } string name = reader.GetString(rowPos, column + 1); ++rowPos; if (!reader.IsString(rowPos, column) || !reader.GetString(rowPos, column).Equals("dane:")) { error = true; errorString = "Błąd przy 'dane:' w 'wykres' - wiersz " + rowPos; break; } if (!reader.IsNumber(rowPos, column + 1)) { error = true; errorString = "Błąd przy 'dane:' w 'wykres' - wiersz " + rowPos; break; } int dataCount = reader.GetInt(rowPos, column + 1); ++rowPos; int seriesCount = 0; while (reader.IsString(rowPos, column + seriesCount)) { seriesCount++; } worksheet.Range[worksheet.Cells[rowPos, column], worksheet.Cells[rowPos + dataCount, column + seriesCount - 1]].Select(); rowPos += dataCount; DrawGraphFromSelectedCells(graphNum++, c, name, "", newWorksheet); break; case "dane": Data data = new Data(); ++rowPos; if (!reader.IsString(rowPos, column) || !reader.GetString(rowPos, column).Equals("parametry:") || !reader.IsNumber(rowPos, column + 1)) { error = true; errorString = "Błąd przy 'parametry:' w 'dane' - wiersz " + rowPos; break; } parametersCount = (int)((Excel.Range)worksheet.Cells[rowPos, column + 1]).Value2; while (parametersCount-- > 0) { ++rowPos; data.Parameters.Add(reader.GetString(rowPos, column), reader.GetInt(rowPos, column + 1)); } ++rowPos; if (!reader.IsString(rowPos, column) || !reader.GetString(rowPos, column).Equals("wartości:") || !reader.IsNumber(rowPos, column + 1)) { error = true; errorString = "Błąd przy 'wartości:' w 'dane' - wiersz " + rowPos; break; } int valuesCount = reader.GetInt(rowPos, column + 1); while (valuesCount-- > 0) { ++rowPos; if (!reader.IsNumber(rowPos, column + 1)) { error = true; errorString = "Nie znaleziono liczby przy wartości - wiersz " + rowPos; break; } data.Values.Add(reader.GetString(rowPos, column), reader.GetDouble(rowPos, column + 1)); } dataList.Add(data); break; case "tabela": Table table = new Table(); ++rowPos; if (!reader.IsString(rowPos, column) || !reader.GetString(rowPos, column).Equals("nazwa:")) { error = true; errorString = "Błąd przy 'nazwa:' w 'tabela' - wiersz " + rowPos; break; } name = reader.GetString(rowPos, column + 1); table.Name = name; ++rowPos; if (!reader.IsString(rowPos, column) || !reader.GetString(rowPos, column).Equals("parametry:") || !reader.IsNumber(rowPos, column + 1)) { error = true; errorString = "Błąd przy 'parametry:' w 'tabela' - wiersz " + rowPos; break; } parametersCount = (int)((Excel.Range)worksheet.Cells[rowPos, column + 1]).Value2; while (parametersCount-- > 0) { ++rowPos; table.Parameters.Add(reader.GetString(rowPos, column)); } ++rowPos; if (!reader.IsString(rowPos, column) || !reader.GetString(rowPos, column).Equals("wartości:") || !reader.IsNumber(rowPos, column + 1)) { error = true; errorString = "Błąd przy 'wartość:' w 'tabela' - wiersz " + rowPos; break; } valuesCount = reader.GetInt(rowPos, column + 1); while (valuesCount-- > 0) { ++rowPos; table.Values.Add(reader.GetString(rowPos, column)); } tables.Add(table); break; } ++rowPos; for (int rowsSearched = 0; rowsSearched < _MAX_SEARCH && ((Excel.Range)worksheet.Cells[rowPos, column]).Value2 == null ; ++rowsSearched) { ++rowPos; } if (((Excel.Range)worksheet.Cells[rowPos, column]).Value2 == null) { foundNext = false; } } colTrans += 1; } } if (error) { MessageBox.Show("błąd : " + errorString); } int tableColumn = _GRAPH_WIDTH * columns + 3; int tableRow = 1; foreach (Table table in tables) { //checking parameters range List <List <int> > parametersRanges = new List <List <int> >(); foreach (string parameter in table.Parameters) { List <int> range = new List <int>(); foreach (Data data in dataList) { if (data.Parameters.ContainsKey(parameter)) { int paramValue = data.Parameters[parameter]; if (!range.Contains(paramValue)) { range.Add(paramValue); } } } range.Sort(); parametersRanges.Add(range); } if (table.Parameters.Count == 2) { //title ((Excel.Range)newWorksheet.Range[newWorksheet.Cells[tableRow, tableColumn], newWorksheet.Cells[tableRow, tableColumn + parametersRanges[0].Count + 1]]).Merge(); ((Excel.Range)newWorksheet.Cells[tableRow, tableColumn]).Value2 = table.Name; //first parameter title ((Excel.Range)newWorksheet.Range[newWorksheet.Cells[tableRow + 1, tableColumn + 2], newWorksheet.Cells[tableRow + 1, tableColumn + parametersRanges[0].Count + 1]]).Merge(); ((Excel.Range)newWorksheet.Cells[tableRow + 1, tableColumn + 2]).Value2 = table.Parameters[0]; //first parameter range for (int i = 0; i < parametersRanges[0].Count; ++i) { ((Excel.Range)newWorksheet.Cells[tableRow + 2, tableColumn + 2 + i]).Value2 = parametersRanges[0][i]; } //second parameter title ((Excel.Range)newWorksheet.Range[newWorksheet.Cells[tableRow + 3, tableColumn], newWorksheet.Cells[tableRow + 2 + parametersRanges[1].Count , tableColumn]]).Merge(); ((Excel.Range)newWorksheet.Cells[tableRow + 3, tableColumn]).Value2 = table.Parameters[1]; //second parameter range for (int i = 0; i < parametersRanges[1].Count; ++i) { ((Excel.Range)newWorksheet.Cells[tableRow + 3 + i, tableColumn + 1]).Value2 = parametersRanges[1][i]; } for (int v1 = 0; v1 < parametersRanges[0].Count; ++v1) { for (int v2 = 0; v2 < parametersRanges[1].Count; ++v2) { bool found = false; for (int d = 0; !found && d < dataList.Count; ++d) { if (dataList[d].Parameters.ContainsKey(table.Parameters[0]) && dataList[d].Parameters[table.Parameters[0]] == parametersRanges[0][v1] && dataList[d].Parameters.ContainsKey(table.Parameters[1]) && dataList[d].Parameters[table.Parameters[1]] == parametersRanges[1][v2] && dataList[d].Values.ContainsKey(table.Values[0])) { found = true; ((Excel.Range)newWorksheet.Cells[tableRow + 3 + v2, tableColumn + 2 + v1]).Value2 = dataList[d].Values[table.Values[0]]; } } } } tableRow += 3 + parametersRanges[1].Count + 1; } else if (table.Parameters.Count == 1) { //title ((Excel.Range)newWorksheet.Range[newWorksheet.Cells[tableRow, tableColumn], newWorksheet.Cells[tableRow, tableColumn + parametersRanges[0].Count]]).Merge(); ((Excel.Range)newWorksheet.Cells[tableRow, tableColumn]).Value2 = table.Name; //Parameter title ((Excel.Range)newWorksheet.Range[newWorksheet.Cells[tableRow + 1, tableColumn + 1], newWorksheet.Cells[tableRow + 1, tableColumn + parametersRanges[0].Count]]).Merge(); ((Excel.Range)newWorksheet.Cells[tableRow + 1, tableColumn + 1]).Value2 = table.Parameters[0]; //Parameter range for (int i = 0; i < parametersRanges[0].Count; ++i) { ((Excel.Range)newWorksheet.Cells[tableRow + 2, tableColumn + i + 1]).Value2 = parametersRanges[0][i]; } //Values for (int v = 0; v < table.Values.Count; ++v) { //Value name ((Excel.Range)newWorksheet.Cells[tableRow + 3 + v, tableColumn]).Value2 = table.Values[v]; for (int v1 = 0; v1 < parametersRanges[0].Count; ++v1) { bool found = false; for (int d = 0; !found && d < dataList.Count; ++d) { if (dataList[d].Parameters.ContainsKey(table.Parameters[0]) && dataList[d].Parameters[table.Parameters[0]] == parametersRanges[0][v1] && dataList[d].Values.ContainsKey(table.Values[v])) { found = true; ((Excel.Range)newWorksheet.Cells[tableRow + 3 + v, tableColumn + v1 + 1]).Value2 = dataList[d].Values[table.Values[v]]; } } } } tableRow += 3 + table.Values.Count; } } Application.ScreenUpdating = screenUpdating; }