Исключение при импорте из Excel с использованием openXML - PullRequest
0 голосов
/ 12 октября 2011

Я хотел бы десериализовать все данные из файла 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
}

возврат нуля

Есть идеи?

Ответы [ 2 ]

1 голос
/ 11 августа 2015

После полдня парсинга 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 голос
/ 12 октября 2011

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

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

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;

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

...