Почему тот же код, который читал Excel в C#, больше не читает Excel? - PullRequest
0 голосов
/ 13 января 2020

Я пишу плагин для Revit в C#, и код долгое время точно читал ячейки Excel. Затем к тому же сценарию я указал путь к другому файлу Excel, теперь он не принимает файл excel, даже первый файл Excel, который он читал в течение длительного времени. Я не знаю, почему тот же скрипт чтения ячеек из excel больше не работает. я получаю исключение как; «смещение и длина вышли за пределы массива или счетчика больше, чем количество элементов от индекса до конца исходной коллекции», потому что в этой строке я пытаюсь извлечь некоторые элементы из списка, но на самом деле в этом списке ничего нет не принимает значения из Excel Вы можете увидеть изображение в ссылке. введите описание изображения здесь

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Autodesk.Revit.DB;
using Autodesk.Revit.UI;
using Autodesk.Revit.Attributes;
using Autodesk.Revit.DB.Structure;
using Microsoft.Office.Interop.Excel;
using Line = Autodesk.Revit.DB.Line;
using System.IO;

namespace RevitComm
{
    [TransactionAttribute(TransactionMode.Manual)]
    class Boundaries : IExternalCommand
    {
        public Result Execute(ExternalCommandData commandData, ref string message, ElementSet elements)
        {


            //-------------------------------------------------Reading from excel  coordinates-------------------------------------------------------------|

            Microsoft.Office.Interop.Excel.Application xlApp = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook xlWorkbook = xlApp.Workbooks.Open(@"D:\Example.xlsx");
            Microsoft.Office.Interop.Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1];
            Microsoft.Office.Interop.Excel.Range xlRange = xlWorksheet.UsedRange;

            //---------------------------------------------------Rows and columns--------------------------------------------------------------------------|
            int rowCount = xlRange.Rows.Count;
            int colCount = xlRange.Columns.Count;

            //--------------------------------------------------Conversion Factor--------------------------------------------------------------------------|                                                 
            double cF = 1 / 0.3048;

            //-------------------------------------- No of entered rows + 1 as rows starts from 2 -------------------------------------------------------|                                         
            int rows = Convert.ToInt32(xlRange.Cells[3, "B"].value2) + 3;


            //---------------------------------------------------Getting Active Revit Document--------------------------------------------------------------|
            UIDocument uidoc = commandData.Application.ActiveUIDocument;
            Document doc = uidoc.Document;


            double z = 0;


            //------------------------------------------- Getting the level on which Wall starts------------------------------------------------------------|
            Level level = new FilteredElementCollector(doc)
                .OfCategory(BuiltInCategory.OST_Levels)
                .WhereElementIsNotElementType()
                .Cast<Level>()
                .First(x => x.Name == "Level 1");

            //------------------------------------------------- Getting level on which Roof to be placed ----------------------------------------------------|
            Level upperlevel = new FilteredElementCollector(doc)
                .OfCategory(BuiltInCategory.OST_Levels)
                .WhereElementIsNotElementType()
                .Cast<Level>()
                .First(x => x.Name == "Level 2");


            //-------------------------------------------------  Roof type  ---------------------------------------------------------------------------------|
            var rooftype = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Roofs)
          .WhereElementIsElementType().Cast<RoofType>().First(x => x.Name == "Generic - 9\"");




            //------------- Floor type example __________//
            var floorty = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Floors)
         .WhereElementIsElementType().Cast<FloorType>().First(x => x.Name == "OurFloor");




            //----- wall type example

            var wallty = new FilteredElementCollector(doc).OfCategory(BuiltInCategory.OST_Walls)
         .WhereElementIsElementType().Cast<WallType>().First(x => x.Name == "JustGeneric");



            //------------------------------------------ List for Points -----------------------------------------------------------------------------|
            List<XYZ> pointStr = new List<XYZ>();


            //----------Start Points------/          
            for (int i = 4; i < rows; i = i + 2)

            {
                XYZ pi = new XYZ(xlRange.Cells[i, "N"].value2 * cF, xlRange.Cells[i, "O"].value2 * cF, z);
                pointStr.Add(pi);

            }


            //----------------End Points ------------/
            List<XYZ> pointEnd = new List<XYZ>();
            for (int i = 5; i <= rows; i = i + 2)

            {
                XYZ pi = new XYZ(xlRange.Cells[i, "N"].value2 * cF, xlRange.Cells[i, "O"].value2 * cF, z);
                pointEnd.Add(pi);

            }




            //-----------------------------------------------------------List for Lines -------------------------------------------------------|


            List<Line> lines = new List<Line>();
            for (int i = 0; i < (rows - 3) / 2; i++)
            {
                XYZ pk = pointStr.ElementAt(i);
                XYZ pj = pointEnd.ElementAt(i);
                Line l = Line.CreateBound(pk, pj);
                lines.Add(l);
            }

            //------------------------------------------------------- List for Curves for walls ------------------------------------------------------|

            List<Curve> curWalls = new List<Curve>();

            for (int i = 0; i < (rows - 3) / 2; i++)
            {
                Line li = lines.ElementAt(i);
                curWalls.Add(li);
            }

            List<Curve> Curvet = curWalls.GetRange(0,4);

            CurveLoop crvloopExE = CurveLoop.Create(Curvet);

            CurveLoop offcrExE = CurveLoop.CreateViaOffset(crvloopExE, 0.5 * cF, new XYZ(0, 0, 1));

            CurveArray curArrExE = new CurveArray();

            foreach (Curve c in offcrExE)
            {
                /// To put the curves to Currve array
                curArrExE.Append(c);

            }




            // ------------------------------------ Start transaction -------------------------------------------------------|
            try
            {

                //return Result.Succeeded;

                using (Transaction trans = new Transaction(doc, "Neus-Haus"))

                {

                    trans.Start();

                    // Creating Walls



                    for (int i = 0; i <= 5; i++)

                        Wall W1 = Wall.Create(doc, curWalls.ElementAt(i), wallty.Id, level.Id, 3 * cF, 0, false, false);
                    }




                   trans.Commit();
                }
                return Result.Succeeded;
            }

            catch (Exception e)

            {
                message = e.Message;
                return Result.Failed;
            }


        }
    }
}

Ответы [ 2 ]

0 голосов
/ 13 января 2020

Тогда к тому же сценарию я указал путь к другому файлу Excel, теперь он не принимает файл Excel

Вот, вероятно, ключ к проблеме, а вы не даете нам много информации (код должен публиковаться, а не как изображение, этот способ нам проще тестировать). Попробуйте запустить вашу программу от имени администратора. Если вы запускаете ее из Visual Studio, а затем запускаете вашу Visual Studio от имени администратора, вы, скорее всего, теряете привилегии, необходимые для запуска вашей программы. Мой ответ основан на том, что ваш код уже работал

0 голосов
/ 13 января 2020

Возможно, необходимо изменить путь к файлу, чтобы каждый '\' стал "\\" для совместимости с Windows ОС.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...