【问题标题】:Can loading of a large Excel file using XLWorkBook be aborted?可以中止使用 XLWorkBook 加载大型 Excel 文件吗?
【发布时间】:2021-10-16 02:39:09
【问题描述】:

我正在使用 XLWorkBook (Closed.XML) 打开 Excel 文件。但是,对于大文件,我可能想要中止加载并转换为 .csv、SQL 或 Access 以进行输入。因此,有没有办法中止加载过程?下面的代码中提到了进程挂起非常大的文件所在的行。

    Dim workbook = New XLWorkbook(filename)
    Dim rows = workbook.Worksheet(1).RangeUsed().RowsUsed()  'large files hang here
    Dim cols = workbook.Worksheet(1).RangeUsed().ColumnsUsed()

【问题讨论】:

  • 如果您有多种输入类型,为什么不总是从 SQL 加载?
  • 你用rows做什么?重要吗?
  • @Magnetron:用户可能没有 SQL 输入。
  • @Caius Jard:需要 #rows 和 #cols 来确定数组的维度。有没有办法将 XLWorkBook 填充到 DataTable 中,然后从中提取#rows、#cols?
  • Erm .. 这有点暗示将它加载到内存中一次(关闭的 xml 可能会这样做?)你再次加载它(转移到另一个基于内存的设备),如果这是超时然后电子表格可能很大?这些数据的目的地是什么?它可以流式传输到那里吗?

标签: c# vb.net abort closedxml


【解决方案1】:

对于非常大的 Excel 文件,不要使用 Closed.XML 命令 RowsUsed()ColumnsUsed() 从工作表中提取行和列,然后像这样填充数组:

     rows = workbook.Worksheet(1).RangeUsed().RowsUsed() 
     cols = workbook.Worksheet(1).RangeUsed().ColumnsUsed() 

     ReDim x(rows.Count, cols.Count) 
     For Each xrow In rows
        Dim rowNumber = xrow.RowNumber()
        For Each xcol In cols
           Dim colNumber = xcol.ColumnNumber()
           x(rowNumber, colNumber) = xrow.Cell(colNumber).Value
        Next
     Next xrow

您可以遍历行和列并使用标记插入coordinated cancellation(因为 Abort.Thread 已过时)。

首先,声明一个公共取消令牌:

     Public cts As CancellationTokenSource = New CancellationTokenSource

接下来,要取消线程方法,设置取消,可能在表单上某处的“取消”按钮中:

     cts.Cancel()

然后,在线程方法内部,测试token是否被取消,如果是,则退出方法:

     Dim numrows, numcols As Integer
     numrows = 0
     numcols = 0  
     For Each row As IXLRow In workbook.Worksheet(1).Rows()
        If cts.token.IsCancellationRequested = True Then 
           Exit Sub
        Else
           numrows += 1
        End If
              
     Next
     For Each col As IXLColumn In workbook.Worksheet(1).Columns
        If cts.token.IsCancellationRequested = True Then 
           Exit Sub
        Else
           numcols += 1
        Endif
     Next

如果用户没有中止这个线程化的方法,那么首先对数组进行标注,然后用单元格值填充它:

     ReDim x(numrows, numcols) 
     For i = 1 To numrows
       For j = 1 To numcols
         x(i, j) = workbook.Worksheet(1).Cell(i, j).Value
       Next
     Next 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-26
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 2020-03-15
    相关资源
    最近更新 更多