Как получить доступ к отдельным данным объекта при чтении файла Excel с помощью EPPlus?

1

Я пытаюсь прочитать строку из файла excel в С# и сохранить в объекте с помощью EPPLUS.

Теперь, когда я печатаю содержимое объекта, он отображает все содержимое строки как одну строку.

Как ограничить доступ к содержимому одной ячейки? т.е. содержание отдельных ячеек, чтобы я мог использовать эти конкретные поля в соответствии с моим требованием.

var existingFile = new FileInfo("D:\\Fields.xlsx"); 
using (var package = new ExcelPackage(existingFile)) 
{
    ExcelWorkbook workBook = package.Workbook;
    if (workBook != null) 
    { 
        if (workBook.Worksheets.Count > 0) 
        { 
            ExcelWorksheet currentWorksheet = workBook.Worksheets.First(); 
            var lastrow = currentWorksheet.Dimension.End.Row; 
            var lastcol = currentWorksheet.Dimension.End.Column; 
            for (int i = 1; i <= lastrow; i++) 
            {
                for (int j = 1; j <= lastcol; j++) 
                {
                    object asd = new object(); 
                    asd = currentWorksheet.Cells[i, j].Value; 
                    Console.WriteLine(asd);
                }
            }
        }
     }
}
  • 0
    Ну, у меня нет опыта использования этой библиотеки, но, возможно, этот ответ поможет вам stackoverflow.com/a/21118652/541432
  • 0
    Я чувствую, что это не имеет ничего общего с библиотекой. У меня есть доступ к файлу Excel, и я также могу читать все данные за один раз, но мне нужно получить доступ к одному конкретному значению среди тех больших массивов данных, которые хранятся в объекте. Надеюсь, у меня есть смысл. Извините, если я усложняю.
Теги:
object
excel
epplus
objectdatasource

1 ответ

0

Ваш код должен работать нормально. Если вы видите всю строку файла excel, напечатанную как одна строка, то я предполагаю, что это проблема с содержимым самого файла excel, и в этом случае вам придется каким-то образом разбирать строку. Опубликуйте снимок экрана или ваш, еще лучше, файл excel, который находится в Интернете, чтобы мы могли посмотреть.

Тем временем, проверьте этот код, который сначала создает свой собственный файл excel, а затем снова открывается и сохраняет ваш код:

public void ConsoleWriteTest()
{
    //Create some data
    var existingFile = new FileInfo(@"c:\temp\temp.xlsx");
    if (existingFile.Exists)
        existingFile.Delete();

    using (var pck = new ExcelPackage(existingFile))
    {
        var workbook = pck.Workbook;
        var worksheet = workbook.Worksheets.Add("newsheet");

        #region Data

        //The data
        worksheet.Cells["A1"].Value = "Col1";
        worksheet.Cells["A2"].Value = "sdf";
        worksheet.Cells["A3"].Value = "ghgh";
        worksheet.Cells["A4"].Value = "sdf";
        worksheet.Cells["A5"].Value = "wer";

        worksheet.Cells["B1"].Value = "Col2";
        worksheet.Cells["B2"].Value = "Group B";
        worksheet.Cells["B3"].Value = "Group A";
        worksheet.Cells["B4"].Value = "Group C";
        worksheet.Cells["B5"].Value = "Group A";

        worksheet.Cells["C1"].Value = "Col3";
        worksheet.Cells["C2"].Value = 634.5;
        worksheet.Cells["C3"].Value = 274.5;
        worksheet.Cells["C4"].Value = 453.5;
        worksheet.Cells["C5"].Value = 634.5;

        worksheet.Cells["D1"].Value = "Col4";
        worksheet.Cells["D2"].Value = 996440;
        worksheet.Cells["D3"].Value = 185780;
        worksheet.Cells["D4"].Value = 686468;
        worksheet.Cells["D5"].Value = 996440;

        #endregion

        pck.Save();
    }

    //Reopen the file
    using (var package = new ExcelPackage(existingFile))
    {
        ExcelWorkbook workBook = package.Workbook;
        if (workBook != null)
        {
            if (workBook.Worksheets.Count > 0)
            {
                ExcelWorksheet currentWorksheet = workBook.Worksheets.First();
                var lastrow = currentWorksheet.Dimension.End.Row;
                var lastcol = currentWorksheet.Dimension.End.Column;
                for (int i = 1; i <= lastrow; i++)
                {
                    for (int j = 1; j <= lastcol; j++)
                    {
                        object asd = new object();
                        asd = currentWorksheet.Cells[i, j].Value;
                        Console.WriteLine(asd);
                    }
                }
            }
        }
    }
}

EDIT 1: строка или столбец в виде коллекции

//Get entire rows or columns as collection and then print by casting
using (var package = new ExcelPackage(existingFile))
{
    ExcelWorkbook workBook = package.Workbook;
    if (workBook != null)
    {
        if (workBook.Worksheets.Count <= 0) 
            return;

        ExcelWorksheet currentWorksheet = workBook.Worksheets.First();
        var lastrow = currentWorksheet.Dimension.End.Row;
        var lastcol = currentWorksheet.Dimension.End.Column;

        //get the row of column headers which are strings
        var asdrange = currentWorksheet.Cells[1, 1, 1, lastcol];
        Console.WriteLine("As cell objects");
        foreach (var cell in asdrange)
            Console.WriteLine(cell.Value);

        object asd = new object();
        asd = currentWorksheet.Cells[1, 1, 1, lastcol].Value;

        object[,] cellObjects = (object[,])asd;
        List<string> stringList = cellObjects.Cast<string>().ToList();

        Console.WriteLine(Environment.NewLine + "As casted to a List");
        Console.WriteLine(stringList[0]);
        Console.WriteLine(stringList[1]);
        Console.WriteLine(stringList[2]);
        Console.WriteLine(stringList[3]);

        //get the second row which is a mix of strings and double
        asdrange = currentWorksheet.Cells[2, 1, 2, lastcol];
        Console.WriteLine(Environment.NewLine + "As cell objects");
        foreach (var cell in asdrange)
            Console.WriteLine(cell.Value); 

        asd = currentWorksheet.Cells[2, 1, 2, lastcol].Value;
        cellObjects = (object[,])asd;
        List<object> objectList = cellObjects.Cast<object>().ToList();

        Console.WriteLine(Environment.NewLine + "As casted to a List");
        Console.WriteLine(objectList[0]);
        Console.WriteLine(objectList[1]);
        Console.WriteLine(objectList[2]);
        Console.WriteLine(objectList[3]);

        //Get Col3 which are doubles
        asdrange = currentWorksheet.Cells[2, 3, lastrow, 3];
        Console.WriteLine(Environment.NewLine + "As cell objects");
        foreach (var cell in asdrange)
            Console.WriteLine(cell.Value); 

        asd = currentWorksheet.Cells[2, 3, lastrow, 3].Value;
        cellObjects = (object[,])asd;
        List<double> doubleList = cellObjects.Cast<double>().ToList();

        Console.WriteLine(Environment.NewLine + "As casted to a List");
        Console.WriteLine(doubleList[0]);
        Console.WriteLine(doubleList[1]);
        Console.WriteLine(doubleList[2]);
        Console.WriteLine(doubleList[3]);
        Console.WriteLine(doubleList[4]);
        Console.WriteLine(doubleList[5]);
        Console.WriteLine(doubleList[6]);
        Console.WriteLine(doubleList[7]);
        Console.WriteLine(doubleList[8]);
    }
}
  • 0
    Спасибо @Ernie за проявленный интерес к ответу, но я не ищу этого. Вы заметили, что мы в конечном итоге храним все данные Excel в объекте "asd"? Что ж, теперь я хотел бы получить доступ только к нескольким полям в этом объекте. Это может быть содержимое отдельной ячейки или данные определенной строки. Надеюсь, у меня есть смысл.
  • 0
    @Jashwanth, «хранение всех данных Excel в объекте« asd »в конце» - в соответствии с кодом, который вы опубликовали, это не то, что вы делаете. В вашем коде вы просматриваете ячейку за ячейкой, указывая строку (i) или столбец (j), а не коллекцию. Но это звучит так, как будто вы хотите получить ВСЮ строку в виде коллекции, а затем манипулировать ею? Если это так, вам придется провести кастинг. Смотрите дополнительный код, который я вставил выше, для того, что я имею в виду. Опять же, размещение примера файла Excel поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню