Чтение данных из файлов Excel - PullRequest
1 голос
/ 12 марта 2012

У меня проблемы с чтением из таблицы Excel в C #. У меня есть этот код, который я читаю каждую клетку от A до X.

System.Array myvalues; string[] strArray;
Microsoft.Office.Interop.Excel.Range range = 
    worksheet.get_Range("A" + i.ToString(), "W" + i.ToString());

while(range.Count!=0)
{
    i++;
    //Console.WriteLine(i);
    range = worksheet.get_Range("A" + i.ToString(), "W" + i.ToString());
    myvalues = (System.Array)range.Cells.Value;
    strArray = ConvertToStringArray(myvalues);
    name = clearstr(strArray[1]);

    for ( int j = 1 ; j <= Int32.Parse(number_add_file)*4 ; j++) 
    {
        name = "";
        lang_add = "";
        price = "";
        description = "";
        Console.WriteLine("I got in!");

        Microsoft.Office.Interop.Excel.Range range_add = 
            worksheet.get_Range("X" + i.ToString(),Type.Missing);

        System.Array values = (System.Array)range_add.Cells.Value;
        string[] str = ConvertToStringArray(values);
        name = str[0];
        lang_add = str[1];
        price = str[2];
        description = str[3];
        Console.WriteLine(name + "   " 
          + lang_add + "   " + price + "   " + description);

        addfile();
    }

У меня такой вопрос: как я могу прочитать следующие 4 * «числовые» строки в Excel на основе значения «число»?

Например:

         A B C D E F G H I J
         a a a a a 1 a a a a 

Значение ячейки F равно 1, поэтому я хотел бы прочитать (G H I J) Если значение ячейки F равно 2, я хотел бы прочитать (G H I J K L M N)

         A B C D E F G H I J K L M N
         a a a a a 2 a a a a a a a a

Значение ячейки F 3:

        A B C D E F G H I J K L M N O P Q R
        a a a a a 3 a a a a a a a a a a a a

Ответы [ 3 ]

2 голосов
/ 12 марта 2012

Это для .NET 4.0:

using Excel = Microsoft.Office.Interop.Excel;
Excel.Application xlApp = new Excel.Application();
Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("somefile.xls");
Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1]; // assume it is the first sheet
Excel.Range xlRange = xlWorksheet.UsedRange; // get the entire used range
int value = 0;
if(Int32.TryParse(xlRange.Cells[1,6].Value2.ToString(), out value)) // get the F cell from the first row
{
   int numberOfColumnsToRead = value * 4;
   for(int col=7; col < (numberOfColumnsToRead + 7); col++)
   {
      Console.WriteLine(xlRange.Cells[1,col].Value2.ToString()); // do whatever with value
   }
}

Это откроет рабочую книгу и получит первый рабочий лист в рабочей книге. Затем мы получаем весь использованный диапазон и помещаем его в переменную диапазона. Оттуда мы пытаемся проанализировать int в столбце «F» (который является 6-м столбцом, он основан на 1, а не на основе нуля) в первой строке. Если этот анализ успешен, мы умножаем это число на 4, чтобы увидеть, сколько столбцов вам нужно (в своем посте вы указали строки, но ваши примеры были столбцами). Мы используем цикл for, чтобы начать в столбце G (столбец 7) и перейти к числу столбцов, которое нужно прочитать + 7 (чтобы учесть пропущенные нами столбцы). Вы можете делать со значениями все, что хотите, но для этого примера я просто записал их в консоль.

0 голосов
/ 03 августа 2015
string testList = "";
            String str1 = "";
            string logPath = @"E:\LogForConsoleApp.txt";
            string filePath = @"E:\SaveSheetName.txt";
            string Path = @"C:\Program Files (x86)\Microsoft Visual Studio 12.0\Common7\IDE\MSTest";
            List<string> ltSheetName = new List<string>();
            List<string> ltMethodName = new List<string>();
            Process myProcess = new Process();
            Excel.Application appExl = new Excel.Application();
            Excel.Workbook workbook = null;
            Excel.Worksheet NwSheet;
            Excel.Range ShtRange;
            appExl = new Excel.Application();
            workbook = appExl.Workbooks.Open("E:\\inputSheet3", Missing.Value, ReadOnly: false);
            NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
            ShtRange = NwSheet.UsedRange; //gives the used cells in sheet
            int rCnt = 0;
            int cCnt = 0;

            for (rCnt = 1; rCnt <= ShtRange.Rows.Count; rCnt++)
            {
                for (cCnt = 1; cCnt <= ShtRange.Columns.Count; cCnt++)
                {
                    if (Convert.ToString(NwSheet.Cells[rCnt, cCnt].Value2) == "Y")
                    {
                        ltSheetName.Add(NwSheet.Cells[rCnt, cCnt - 1].Value2);
                        //ltMethodName.Add(" /test:" + NwSheet.Cells[rCnt, cCnt - 1].Value2);
                    }
                }
            }
            workbook.Close(false, Missing.Value, Missing.Value);
            appExl.Quit();

            for (int sht = 0; sht < ltSheetName.Count; sht++)
            {
                ltMethodName.Clear();
                appExl = new Excel.Application();
                workbook = appExl.Workbooks.Open(ltSheetName[sht].ToString(), Missing.Value, ReadOnly: false);
                NwSheet = (Excel.Worksheet)workbook.Sheets.get_Item(1);
                ShtRange = NwSheet.UsedRange; //gives the used cells in sheet
                int rCnt1 = 0;
                int cCnt1 = 0;

                for (rCnt1 = 1; rCnt1 <= ShtRange.Rows.Count; rCnt1++)
                {
                    for (cCnt1 = 1; cCnt1 <= ShtRange.Columns.Count; cCnt1++)
                    {
                        if (Convert.ToString(NwSheet.Cells[rCnt1, cCnt1].Value2) == "Y")
                        {
                            ltMethodName.Add(" /test:" + NwSheet.Cells[rCnt, cCnt - 1].Value2);
                        }
                    }
                }
                workbook.Close(false, Missing.Value, Missing.Value);
                appExl.Quit();


                for (int i = 0; i < ltMethodName.Count; i++)
                {
                    str1 = ltMethodName[i].ToString();
                    testList += str1;
                }

                string foldername = "TestResult_" + DateTime.Today.ToString().Remove(DateTime.Today.ToString().LastIndexOf("/") + 5);
                foldername = foldername.Replace("/", "");

                string direc = @"E:\" + foldername;
                string fileName = ltSheetName[sht].ToString().Substring(ltSheetName[sht].ToString().LastIndexOf("\\") + 1) + "_InderdeepAutRes.trx";
                if (!Directory.Exists(direc))
                    Directory.CreateDirectory(direc);
                string testcase = "";

                if (!File.Exists(direc + "\\" + fileName))
                    testcase = " /testcontainer:" + "E:\\Practice\\TestingSample\\TestingSample\\bin\\Debug\\TestingSample.dll" + testList + " /resultsfile:" + direc + "\\" + fileName;
                else
                {
                    Directory.Delete(direc, true);
                    Directory.CreateDirectory(direc);
                    testcase = " /testcontainer:" + "E:\\Practice\\TestingSample\\TestingSample\\bin\\Debug\\TestingSample.dll" + testList + " /resultsfile:" + direc + "\\" + fileName;
                }

                ProcessStartInfo myProcessStartInfo = new ProcessStartInfo(Path, testcase);

                try
                {
                    TextWriter tw = new StreamWriter(filePath, false);
                    tw.WriteLine(ltSheetName[sht].ToString());
                    tw.Close();
                    myProcess.StartInfo = myProcessStartInfo;
                    myProcessStartInfo.UseShellExecute = false;
                    myProcessStartInfo.RedirectStandardOutput = true;
                    myProcess.Start();
                    string output = myProcess.StandardOutput.ReadToEnd();
                    //myProcess.WaitForExit();
                    Console.WriteLine(output);

                }
                catch (Exception ex)
                {
                    TextWriter tw = new StreamWriter(logPath, true);
                    tw.WriteLine(ex.StackTrace);
                    tw.Close();
                }
            }
0 голосов
/ 12 марта 2012

Это не прямой ответ на ваш вопрос, но вы можете легко сослаться на свои клетки следующим образом:

int row1 = 1;
int row2 = 5;

sheet1.Cells[row1, row1+row2].Value=row1.ToString();
String Rng = Convert.ToString(sheet1.Cells[row1, row2-row1].Address());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...