#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