如何使用 Epplus 获取修改后的 excel 的实际使用范围?
How can i get actual used range for modified excels using Epplus?
我正在使用 EPPlus 从 excel 读取数据到 datable。
在读取了包含 10 行记录的 excel sheet 之后,我修改了 excel sheet,删除了现有数据并仅保留一行数据。
但是当我读取修改后的 excel 时,它仍然读取 10 行(1 行有值,其余为空字段)到数据 table.
如何限制这个?
我正在使用以下代码阅读 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 open xml 中是否有任何等效项?
如何获得修改后的 excels 的实际使用范围?
当只删除某些单元格中的数据时,没有内置方法指示不应考虑某行。
Dimension
尽可能接近,但如果 any 列包含数据或如果 上方或下方的任意行包含数据。
不过,您可以尝试确定是否应该跳过 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 处理工作表工作大小的方式有关。如果您在第 100 万行中输入数据,然后删除该单元格,Excel 仍会显示工作表有 100 万行。
我测试了这段 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 工作簿大小。
我正在使用 EPPlus 从 excel 读取数据到 datable。
在读取了包含 10 行记录的 excel sheet 之后,我修改了 excel sheet,删除了现有数据并仅保留一行数据。 但是当我读取修改后的 excel 时,它仍然读取 10 行(1 行有值,其余为空字段)到数据 table.
如何限制这个? 我正在使用以下代码阅读 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 open xml 中是否有任何等效项? 如何获得修改后的 excels 的实际使用范围?
当只删除某些单元格中的数据时,没有内置方法指示不应考虑某行。
Dimension
尽可能接近,但如果 any 列包含数据或如果 上方或下方的任意行包含数据。
不过,您可以尝试确定是否应该跳过 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 处理工作表工作大小的方式有关。如果您在第 100 万行中输入数据,然后删除该单元格,Excel 仍会显示工作表有 100 万行。
我测试了这段 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 工作簿大小。