Как я могу получить фактический используемый диапазон для модифицированных образцов, используя Epplus?
Я читаю данные из Excel в Datable с помощью EPPlus.
Прочитав таблицу Excel с 10 строками записи, я изменил таблицу 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 Open XML? Как я могу получить фактический используемый диапазон для измененных образцов?
2 ответа
Нет встроенного способа указать, что строка не должна учитываться при удалении данных только в некоторых ячейках.
Dimension
как можно ближе, но строки включены в Dimension
если какой-либо столбец содержит данные или если любая строка выше или ниже содержит данные.
Однако вы можете попытаться выяснить, следует ли пропустить строку в цикле for. Например, если вы всегда удаляете данные только в первых 4 столбцах, вы можете попробовать:
if(!ws.Cells[rowNum, 1, rowNum, 4].All(c => c.Value == null))
{
//Continue adding the row to the table
}
В описании не указаны критерии пропуска строки, но вы поняли идею.
Начнем с того, что я не программист на C#, но я думаю, что у меня есть решение, которое работает с использованием сценария VBA для Excel. Вы можете запустить этот код Excel VBA с C или получить представление о том, как выполнить то же самое с C+.
Проблема, с которой вы столкнулись, связана с тем, как Excel обрабатывает рабочий размер листа. Если вы введете данные в миллионную строку, а затем удалите эту ячейку, Excel по-прежнему будет отображать на листе 1 миллион строк.
Я протестировал этот код 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.