Пример #1
0
        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;
        }