如何使用C#/ FileHelpers ExcelNPOIStorage从Excel文件中提取数据

我正在尝试从Excelhelp Excel存储中提取数据。 所以我创build了一个类:

public static class UalExcelReader { public static UalShipmentRecord[] ReadInput(String pathToFile) { var provider = new ExcelNPOIStorage(typeof (UalShipmentRecord)) { StartRow = 2, StartColumn = 1, FileName = pathToFile }; var res = (UalShipmentRecord[]) provider.ExtractRecords(); return res; } } 

当然还有模范课:

 [DelimitedRecord("|")] public class UalShipmentRecord { public string contentofcol1; public string contentofcol2; ... } 

但是我得到一个IndexOutOfRangeException调用ExtractRecords():

 System.IndexOutOfRangeException was unhandled HResult=-2146233080 Message=Index was outside the bounds of the array. Source=FileHelpers StackTrace: at FileHelpers.RecordOperations.ValuesToRecord(Object[] values) at FileHelpers.DataLink.DataStorage.ValuesToRecord(Object[] values) at FileHelpers.ExcelNPOIStorage.ExcelNPOIStorage.ExtractRecords() at Test.Controller.UalExcelReader.ReadInput(String pathToFile) in c:\TEMP\test\Test\Test\Test\Controller\UalExcelReader.cs:line 17 at Test.App.OnStartup(StartupEventArgs eventArgs) in c:\TEMP\test\Test\Test\Test\App.xaml.cs:line 23 at System.Windows.Application.<.ctor>b__1(Object unused) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.DispatcherOperation.InvokeImpl() at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Windows.Threading.DispatcherOperation.Invoke() at System.Windows.Threading.Dispatcher.ProcessQueue() at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndWrapper.WndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam, Boolean& handled) at MS.Win32.HwndSubclass.DispatcherCallbackOperation(Object o) at System.Windows.Threading.ExceptionWrapper.InternalRealCall(Delegate callback, Object args, Int32 numArgs) at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(Object source, Delegate method, Object args, Int32 numArgs, Delegate catchHandler) at System.Windows.Threading.Dispatcher.LegacyInvokeImpl(DispatcherPriority priority, TimeSpan timeout, Delegate method, Object args, Int32 numArgs) at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr hwnd, Int32 msg, IntPtr wParam, IntPtr lParam) at MS.Win32.UnsafeNativeMethods.DispatchMessage(MSG& msg) at System.Windows.Threading.Dispatcher.PushFrameImpl(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.PushFrame(DispatcherFrame frame) at System.Windows.Threading.Dispatcher.Run() at System.Windows.Application.RunDispatcher(Object ignore) at System.Windows.Application.RunInternal(Window window) at System.Windows.Application.Run(Window window) at System.Windows.Application.Run() at Test.App.Main() in c:\TEMP\test\Test\Test\Test\obj\Debug\App.g.cs:line 0 at System.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[] args) at System.AppDomain.ExecuteAssembly(String assemblyFile, Evidence assemblySecurity, String[] args) at Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly() at System.Threading.ThreadHelper.ThreadStart_Context(Object state) at System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx) at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state) at System.Threading.ThreadHelper.ThreadStart() InnerException: 

我是否正确使用它? 有一个我可以看的例子吗?

1)当您的Excel表格中有空白单元格时,可能会发生此错误。 这似乎是ExcelNPOIStorage检索给定行的值的一个基本问题。

NPOI正在使用NPOI.CellWalk来遍历每一行中的单元格,这看似跳过空白单元格。 结果Values数组比预期的空白单元的数量更短。

它看起来像一个不同的方法是必需的,如下所述: http : //poi.apache.org/spreadsheet/quick-guide.html#Iterator

2)什么东西可以导致空白单元格不存在时有不正确的StartRowStartColumn值。

StartRowStartColumn的intellisense注释相反,对于ExcelNPOIStorage它们是基于0的(而在ExcelStorage则是基于1的)

来源: https : //github.com/MarcosMeli/FileHelpers/blob/master/FileHelpers.ExcelNPOIStorage/Test/Program.cs

鉴于我遇到的问题,我会再次评论上面,并使用更可靠的旧ExcelStorage类,不利的是,它依赖于Excel Interop。