Чтение ячеек из Excel - PullRequest
       1

Чтение ячеек из Excel

0 голосов
/ 11 марта 2012

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

            int i = 1;
            int number;
            System.Array myvalues; string[] strArray;
            Microsoft.Office.Interop.Excel.Range range = worksheet.get_Range("A" + i.ToString(), "X" + i.ToString());
            while(range.Count!=0)
            {
                    i++;
                    range = worksheet.get_Range("A" + i.ToString(), "X" + i.ToString());
                    myvalues = (System.Array)range.Cells.Value;
                    strArray = ConvertToStringArray(myvalues);
                    number = Convert.ToInt32(strArray[0]);
            }

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

Например:

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

Значение ячейки F равно 1, поэтому я хотел бы прочитать (GHIJ) Если значение ячейки F равно 2, я бы хотел прочитать (GHIJKLMN)

         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 ]

0 голосов
/ 11 марта 2012

код:

int i = 1;
do
{

   i++;
   var range = worksheet.get_Range("A" + i.ToString(), "X" + i.ToString());
   if (range.Count != 0) 
   {
      var myvalues = (System.Array)range.Cells.Value;
      var strArray = ConvertToStringArray(myvalues);
      var number = Convert.ToInt32(strArray[0]);
      MyMethodReadRage(worksheet, number);
   }

} while(range.Count!=0);

метод для диапазона считывания:

void MyMethodReadRage(Microsoft.Office.Interop.Excel.Worksheet worksheet, int numberRows)
{
   var range = worksheet.get_Range("A" + numberRows, "X" + (numberRows + 4));
   /*code*/
}

РЕДАКТИРОВАТЬ

Считывает значение столбца "F", умножьте значение на 4 и добавьте количество предыдущих столбцов (до «F»).Затем вы используете эту (непроверенную) функцию для получения письма.

    /// <summary>
    /// http://www.freevbcode.com/ShowCode.asp?ID=4303
    /// </summary>
    private string ColumnLetter(int ColumnNumber)
    {
        if (ColumnNumber > 26)
        {
            return string.Format("{0}{1}", (char)(Convert.ToInt32((ColumnNumber - 1) / 26) + 64), (char)(((ColumnNumber - 1) % 26) + 65));
        }
        else
        {
            return string.Format("{0}", (char)(ColumnNumber + 64));
        }
    }

РЕДАКТИРОВАТЬ II

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ConsoleApplicationExcelCeldas
{
    class Program
    { 
        private const int NumberPositionColumnF = 6;

        static void Main(string[] args)
        {
            Microsoft.Office.Interop.Excel.Worksheet worksheet = new Microsoft.Office.Interop.Excel.Worksheet();

            var i = 0;
            var test = new TestExcel();
            do
            {
                i++;
                var rangeF = worksheet.get_Range(string.Format("F{0}" , i));
                if (rangeF.Count == 0)
                {
                    break;
                }

                var values = test.GetCellsStringArray(rangeF);
                if (values.Count() > 0) 
                {
                    int number = 0;
                    if (int.TryParse(values[0], out number))
                    {
                        var rangeAll = worksheet.get_Range(
                            string.Format("A{0}" , i), 
                            string.Format("{0}{1}", test.ColumnLetter(Program.NumberPositionColumnF + (number * 4)), i));


                        /*
                         your code for work with rangeAll
                        */
                    }
                }

            } while (true);
        }
    }

    class TestExcel
    {
        internal string[] GetCellsStringArray(Microsoft.Office.Interop.Excel.Range range)
        {
            var myvalues = (System.Array)range.Cells.Value;
            return this.ConvertToStringArray(myvalues);
        }

        internal string[] ConvertToStringArray(System.Array values)
        {
            string[] theArray = new string[values.Length];
            for (int i = 1; i <= values.Length; i++)
            {
                if (values.GetValue(1, i) == null)
                    theArray[i - 1] = "";
                else
                    theArray[i - 1] = (string)values.GetValue(1, i).ToString();
            }
            return theArray;
        }

        internal string ColumnLetter(int columnNumber)
        {
            if (columnNumber > 26)
            {
                return string.Format("{0}{1}", (char)(Convert.ToInt32((columnNumber - 1) / 26) + 64), (char)(((columnNumber - 1) % 26) + 65));
            }
            else
            {
                return string.Format("{0}", (char)(columnNumber + 64));
            }
        }
    }
}
0 голосов
/ 17 января 2013

Привет, я только что создал этот код, он проходит по всем строкам из первого столбца, вы можете просто изменить его по своему желанию (последняя библиотека Microsoft Lib Interop DLL. NET собственная библиотека), он работает просто отлично, надеюсь, что он вам поможет

        int sheetIndex = 1; //PLEASE NOTE THIS LIB WORKS WITH NON-ZERO BASED INDEX
        string excelFilePath = "your_path/your_excel_file.xls";
        List<string> yourList = new List<string>();
        Microsoft.Office.Interop.Excel.Application excelApp = new Microsoft.Office.Interop.Excel.Application();
        Microsoft.Office.Interop.Excel.Workbook workbook = excelApp.Workbooks.Open(excelFilePath);            
        Microsoft.Office.Interop.Excel.Worksheet worksheet = (Microsoft.Office.Interop.Excel.Worksheet)workbook.Worksheets[sheetIndex];
        Microsoft.Office.Interop.Excel.Range rangeSelection = worksheet.Columns[1];

        foreach (Microsoft.Office.Interop.Excel.Range row in rangeSelection.Rows)
        {
            Microsoft.Office.Interop.Excel.Range cell = (Microsoft.Office.Interop.Excel.Range)row.Cells[1, 1];
            if (cell.Value2 != null)
                list.Add(cell.Value2.ToString());
        }
0 голосов
/ 11 марта 2012

Понятия не имею, почему вы выполняете построчное чтение.Может быть, лучше прочитать диапазон из 4 строк, а затем проанализировать двумерный массив значений?

Взгляните на эту статью: Более быстрое чтение в MS Excel с использованием сборок Office Interop

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