Исключение при импорте из Excel с использованием OpenXML

#c# #excel #openxml

#c# #excel #openxml

Вопрос:

Я хотел бы десериализовать все данные из файла Excel в список.

Я использую этот код

 class ExcelImport
{
    Workbook workBook;
    SharedStringTable sharedStrings;
    IEnumerable<Sheet> workSheets;
    WorksheetPart custSheet;
    WorksheetPart orderSheet;
    string FilePath;
    ExcelStorage provider;
    Stiker[] ans;
    List<Stiker> StikerList;

    public ExcelImport(string fp)
    {
        FilePath = fp;


    }




    public List<Stiker> dothejob()
    {
        using (SpreadsheetDocument document =
    SpreadsheetDocument.Open(FilePath, true))
        {
            StikerList= new List<Stiker>();
            workBook = document.WorkbookPart.Workbook;
            workSheets = workBook.Descendants<Sheet>();
            sharedStrings = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
            StikerList = Stiker.LoadStiker(custSheet.Worksheet, sharedStrings);
            return StikerList;
        }
    }
  

Но из какого-то резонанса я получаю исключение в строке: sharedStrings =
document.WorkbookPart.SharedStringTablePart.SharedStringTable;

что «Ссылка на объект не установлена для экземпляра объекта»..

После приведенного выше отклонения обнаружено, что

 if (sharedStringTablePart == null)
{
// report a problem
}
  

перезапустить значение null

Есть идеи?

Ответ №1:

Одно из свойств в исходной строке будет «null» и не будет иметь значения.

Вы захотите либо использовать отладчик, чтобы выяснить это (установите точку останова в строке и наведите указатель мыши на каждое свойство), либо разбить строку на отдельные операторы. Что-то вроде:

 var workBookPart = document.WorkbookPart;

if (workBookPart == null)
{
    // do something to report a problem
}

var sharedStringTablePart = workBookPart.SharedStringTablePart;
if (sharedStringTablePart == null)
{
    // report a problem
}

sharedStrings = sharedStringTablePart.SharedStringTable;
  

Таким образом, ваш код может определить во время выполнения, есть ли проблема: такого рода «защитная» идея обычно является хорошей идеей при работе с данными, созданными какой-либо системой, отличной от вашей собственной.

Комментарии:

1. проблема в том, что для одного файла он работает, а для другого нет

2. Похоже, что два файла имеют разную структуру. Смотрите Мой обновленный ответ, чтобы узнать, как это выяснить.

3. привет, ar sharedStringTablePart = workBookPart.SharedStringTablePart; возвращает null есть идеи, почему это произошло? и почему это произошло только в каком-то файле?

4. то же самое в некоторых файлах Excel, другие в порядке. За какую SharedStringTable отвечает pes?

Ответ №2:

После половины дня анализа 2007, 2010, 2013 и преобразования некоторых 2003-> 2007 и их анализа я получил один метод анализа Excel, в некоторых случаях испускающий SharedStringTable

  var link = document.WorkbookPart.SharedStringTablePart;
           Func<Cell, string> selector = (cell) => cell.InnerText;

          if (link != null)
           {
               SharedStringTable sharedStringTable = document.WorkbookPart.SharedStringTablePart.SharedStringTable;
               selector = (cell) => cell.DataType == null ? cell.InnerText : cell.DataType == CellValues.SharedString ? sharedStringTable.ElementAt(Int32.Parse(cell.InnerText)).InnerText : cell.InnerText;

          }

         var values = wsPart.Worksheet.Descendants<Cell>().Select(cell =>selector(cell) ).ToArray();
  

Комментарии:

1. Это работает с любыми файлами xlsx (даже преобразованными с 2003 года) 🙂 Я надеюсь помочь таким, как я, убитым версионизмом ms Excel