如何使用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)什么东西可以导致空白单元格不存在时有不正确的StartRow
和StartColumn
值。
与StartRow
和StartColumn
的intellisense注释相反,对于ExcelNPOIStorage
它们是基于0的(而在ExcelStorage
则是基于1的)
来源: https : //github.com/MarcosMeli/FileHelpers/blob/master/FileHelpers.ExcelNPOIStorage/Test/Program.cs
鉴于我遇到的问题,我会再次评论上面,并使用更可靠的旧ExcelStorage
类,不利的是,它依赖于Excel Interop。