我怎样才能得到实际使用的范围修改Excel使用Epplus?

我正在使用EPPlus从excel读数据到datable。

在读取了10行logging的excel表格后,我通过删除现有数据修改了excel表格,并只保存了一行数据。 但是,当我正在读取修改后的excel时,它仍然读取10行(值为1,剩余为空字段)到数据表。

怎么能限制这个? 我正在使用以下代码来读取Excel。

using (var pck = new OfficeOpenXml.ExcelPackage()) { using (var stream = File.OpenRead(FilePath)) { pck.Load(stream); } var ws = pck.Workbook.Worksheets.First(); bool hasHeader = true; // adjust it accordingly(this is a simple approach) foreach (var firstRowCell in ws.Cells[1, 1, 1, ws.Dimension.End.Column]) { DSClientTransmittal.Tables[0].Columns.Add(hasHeader ? firstRowCell.Text : string.Format("Column {0}", firstRowCell.Start.Column)); } var startRow = hasHeader ? 2 : 1; for (var rowNum = startRow; rowNum <= ws.Dimension.End.Row; rowNum++) { //var wsRow = ws.Cells[rowNum, 1, rowNum, ws.Dimension.End.Column]; var wsRow = ws.Cells[rowNum, 1, rowNum, DSClientTransmittal.Tables[0].Columns.Count]; var row = DSClientTransmittal.Tables[0].NewRow(); foreach (var cell in wsRow) { try { object cellValue = cell.Value; //row[cell.Start.Column - 1] = cell.Text; row[cell.Start.Column - 1] = cellValue.ToString().Trim(); //cell.Style.Numberformat.Format = "@"; //row[cell.Start.Column - 1] = cell.Text; } catch (Exception ex) { } } DSClientTransmittal.Tables[0].Rows.Add(row); } pck.Dispose(); } 

当我用Interop excel读取excel时,同样的问题被clearformat()方法所克服

 ws.Columns.ClearFormats(); xlColCount = ws.UsedRange.Columns.Count; 

Epplus中是否有这样的打开xml的等价物? 我怎样才能得到修改后的实际使用范围?

在某些单元格中只删除数据时,没有内build的方式指示不应该考虑一行。

Dimension尽可能地接近,但如果任何列包含数据或者上面或下面的任何行包含数据,那么行将包含在Dimension中。

然而,你可以试着找出是否应该跳过for循环中的一行。 例如,如果您始终只删除前4列中的数据,则可以尝试:

 if(!ws.Cells[rowNum, 1, rowNum, 4].All(c => c.Value == null)) { //Continue adding the row to the table } 

描述不是指示跳过一行的标准,但你明白了。

首先,我不是C#程序员,但我想我有一个使用Excel VBA脚本的解决scheme。 你可能可以用C运行这个Excel VBA代码,或者了解如何用C +来完成同样的事情。

您遇到的问题与Excel处理工作表的工作大小的方式有关。 如果您在第100万行中input数据,然后删除该单元格,则Excel仍会将工作表显示为具有100万行。

我testing了这个Excel VBA代码,并成功删除了完全空的所有行,然后重新设置工作表大小。

 Sub DelEmptyRowsResizeWorksheet() Dim i As Long, iLimit As Long iLimit = ActiveSheet.UsedRange.Rows.Count For i = iLimit To 1 Step -1 If Application.CountA(Cells(i, 1).EntireRow) = 0 Then Cells(i, 1).EntireRow.Delete End If Next i iLimit = ActiveSheet.UsedRange.Rows.Count ' resize the worksheet based on the last row with data End Sub 

要手动执行此操作而不使用脚本,请首先删除工作表底部的所有空行(或右侧的列),将其保存,然后closures并重新打开工作簿。 我发现这也重置Excel工作簿的大小。