C# 如何使用Epplus获得修改后的excels的实际使用范围?
我正在使用EPPlus将数据从excel读取到datable 在阅读了包含10行记录的excel工作表后,我修改了excel工作表,删除了现有数据,只保留了一行数据。 但当我阅读修改后的excel时,它仍然会在数据表中读取10行(1行有值,其余为空字段) 如何限制这一点? 我使用以下代码来阅读ExcelC# 如何使用Epplus获得修改后的excels的实际使用范围?,c#,excel,openxml,epplus,excel-import,C#,Excel,Openxml,Epplus,Excel Import,我正在使用EPPlus将数据从excel读取到datable 在阅读了包含10行记录的excel工作表后,我修改了excel工作表,删除了现有数据,只保留了一行数据。 但当我阅读修改后的excel时,它仍然会在数据表中读取10行(1行有值,其余为空字段) 如何限制这一点? 我使用以下代码来阅读Excel using (var pck = new OfficeOpenXml.ExcelPackage()) { using (var stream = File.OpenRead(FilePa
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();
}
在Epplus开放式xml中是否有与此类似的内容?
如何获取修改后的Excel的实际使用范围?没有内置的方法来指示仅删除某些单元格中的数据时不应考虑行
维度
尽可能接近,但是如果任何列包含数据,或者如果上面或下面的任何行包含数据,则行将包含在维度中
但是,您可以尝试找出是否应该跳过for循环中的一行。
例如,如果始终仅删除前4列中的数据,则可以尝试:
if(!ws.Cells[rowNum, 1, rowNum, 4].All(c => c.Value == null))
{
//Continue adding the row to the table
}
描述没有指明跳过一行的标准,但你明白了。首先,我不是C#程序员,但我认为我有一个使用Excel VBA脚本的解决方案。您可以使用C运行此Excel VBA代码,或者了解如何使用C+完成相同的任务
您遇到的问题与Excel处理工作表工作大小的方式有关。如果在第一百万行中输入数据,然后删除该单元格,Excel仍会将工作表显示为有一百万行
我测试了这个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
要在不使用脚本的情况下手动执行此操作,请先删除工作表底部的所有空行(或右侧的列),然后保存,然后关闭并重新打开工作簿。我发现这也会重置Excel工作簿的大小。如何删除数据?维度似乎在我的所有测试中都返回了正确的范围。即使在删除行并重新导入之后。删除后维度是否表示您的情况下有10行?@PhilipBijker,@Ernie:我选择需要删除的所有单元格并按delete键,而不是整行尝试删除整行,这将导致正确的维度如果任何列包含数据或上面或下面的任何行包含数据,则维度中应包含行。如果这是您的情况,恐怕为这些空行编写自定义逻辑是您唯一的选择。无法确定哪些行将被删除。与其给出4个放置的ws.Dimension.End.Row,它是否有效?您可以指出以下内容:“我通过删除现有数据修改了excel工作表,并且只保留了一行数据”。究竟删除了哪些数据?这些应该是将行视为已删除并因此在for-loop中跳过它的标准。这就像随机测试,没有删除单元格数据的先前标准,我有一个excel模板,其中包含用于批量导入的示例数据。大多数客户端将进行编辑(通过删除部分行和所有行)该现有模板和send客户端需要删除整行,或者您需要知道何时将该行视为已删除。否则您将不知道要处理哪些行,对吗?正确。或者,您可以使用ws.Dimension.End.Column
而不是dsclienttransmitation.Tables[0].Columns.Count
。如果行中的所有单元格都为空,则其中任何一个都将跳过该行。这对发布的问题完全没有帮助,而且由于问题在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