View Full Version : حذف ردیف های خالی اکسل با استفاده از سی شارپ
safari_m4
جمعه 08 تیر 1403, 18:56 عصر
با سلام چگونه بعد از خواندن فایل اکسل داخل گریدویو چک کنیم که در صورت داشتن سطر یا ردیف های خالی بتوانیم حذف کنیم با تشکر
mazoolagh
شنبه 09 تیر 1403, 12:55 عصر
سلام و روز خوش
بطور منطقی باید موقع خوندن از اکسل برای رکوردهای خالی چک کنین و این برمیگرده به روش خوندن.
ولی اگر در خود گرید میخواین انجام بدین:
یک حلقه بذارین از row آخر به اول و در اون برای ستون یا ستونهای مشخص خالی بودن رو چک،
و در صورت درست بودن چک اون رو حذف کنین.
اگر گرید به دیتاتیبل bound شده باشه بهتر هست،
چون این کار روی دیتاتیبل خیلی راحتتر انجام میشه.
safari_m4
شنبه 09 تیر 1403, 13:19 عصر
سلام و روز خوش
بطور منطقی باید موقع خوندن از اکسل برای رکوردهای خالی چک کنین و این برمیگرده به روش خوندن.
ولی اگر در خود گرید میخواین انجام بدین:
یک حلقه بذارین از row آخر به اول و در اون برای ستون یا ستونهای مشخص خالی بودن رو چک،
و در صورت درست بودن چک اون رو حذف کنین.
اگر گرید به دیتاتیبل bound شده باشه بهتر هست،
چون این کار روی دیتاتیبل خیلی راحتتر انجام میشه.
تشکر و سپاس
Amirpooyan
چهارشنبه 13 تیر 1403, 14:31 عصر
اگر یک موقع خواستید کلا رکوردهای خالی (Empty Row) را از فایل Excel خودتون حذف کنید:
با استفاده از
Excel Interop:
//
using Excel = Microsoft.Office.Interop.Excel;
// Open the Excel file
Excel.Application excelApp = new Excel.Application();
Excel.Workbook excelWorkbook = excelApp.Workbooks.Open("YourFilePath.xlsx");
Excel.Worksheet excelWorksheet = excelWorkbook.Sheets[1];
// Delete all blank rows
excelWorksheet.Cells.DeleteBlankRows();
// Close and save the workbook
excelWorkbook.Save();
excelWorkbook.Close(false);
excelApp.Quit();
با استفاده از EPPlus
:
using OfficeOpenXml;
// Load your Excel file
using (var package = new ExcelPackage(new FileInfo("YourFilePath.xlsx")))
{
var worksheet = package.Workbook.Worksheets[0]; // Assuming the first worksheet
// Define the range of cells to check (e.g., A1 to C100)
var startCell = worksheet.Cells["A1"];
var endCell = worksheet.Cells["C100"];
var range = worksheet.Cells[startCell.Address + ":" + endCell.Address];
// Remove empty rows
for (int row = range.Start.Row; row <= range.End.Row; row++)
{
var rowIsEmpty = true;
for (int col = range.Start.Column; col <= range.End.Column; col++)
{
if (!string.IsNullOrEmpty(worksheet.Cells[row, col].Text))
{
rowIsEmpty = false;
break;
}
}
if (rowIsEmpty)
{
worksheet.DeleteRow(row);
}
}
// Save changes
package.Save();
}
safari_m4
جمعه 15 تیر 1403, 11:11 صبح
سلام و خسته نباشید و تشکر ببخشید این تابع DeleteBlankRows خطا می دهد آیا کتابخانه ای خاصی باید نصب بشود با تشکر
Amirpooyan
یک شنبه 17 تیر 1403, 02:10 صبح
سلام و خسته نباشید و تشکر ببخشید این تابع DeleteBlankRows خطا می دهد آیا کتابخانه ای خاصی باید نصب بشود با تشکر
بله، نیاز به نصب nuget package مربوط به خودش را دارد که بالای هر تکه کد نوشته ام.
اما الان که یکبار دیگر بررسی کردم متوجه شدم، تکه کد اول به اشتباه متد DeleteBlankRows (https://docs.aspose.com/cells/net/delete-blank-rows-and-columns-in-a-worksheet/) را از Aspose.Cells (https://products.aspose.com/cells/net/) بکار گرفتم که nuget package آن برای استفاده رایگان نیست و بابت این اشتباه از شما پوزش می خوام.
البته می شود، بجای DeleteBlankRows (https://docs.aspose.com/cells/net/delete-blank-rows-and-columns-in-a-worksheet/) منطق آن را از کد دوم دوباره نوشت اما از آنجایی که استفاده از Microsoft.Office.Interop.Excel بخاطر اینکه کار کند، حتما نسخه ای از نرم افزار MS Office روی سیستمی که کد اجرا می شود، نصب باشد شاید خیلی روش کارآمدی نباشد، همچنین چون مبتنی بر تکنولوژی COM کار می کند فقط در ویندوز قابل اجرا هست، من دیگر کد مبتنی بر Microsoft.Office.Interop.Excel را تغییر ندادم.
اما تکه کد دوم که با استفاده از پکیج EPPlus (https://github.com/EPPlusSoftware/EPPlus) نوشته شده است، وابستگی به نرم افزار MS Office ندارد و بطور مستقل کد شما قابل اجرا روی همه پلت فرم های دات نت کور از جمله ویندوز، لینوکس و مک و ... هست.
اگر تجربه کار با EPPlus (https://github.com/EPPlusSoftware/EPPlus) هم نداشته باشید به اینکه دقت کنید که استفاده از این پکیج برای برنامه های غیر تجاری رایگان هست از این رو که مشخص کنید برنامه شما تجاری نیست، کد زیر را در جایی که برنامه شما شروع می شود قرار دهید:
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
برای اطمینان از کد خودم و راحتی شما، کد خودم را در یک پروژه Console در دات نت 8 با یک فایل Excel نمونه، تست کردم، بدون مشکل اجرا شد؛ محتوی فایل program.cs : (فراموش نکنید NuGet Package: EPPlus (https://github.com/EPPlusSoftware/EPPlus) را نصب کنید):
using OfficeOpenXml;
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
// Load your Excel file
using (var package = new ExcelPackage(new FileInfo(@"E:\Sample\YourFilePath.xlsx")))
{
var worksheet = package.Workbook.Worksheets[0]; // Assuming the first worksheet
// Define the range of cells to check (e.g., A1 to C100)
var startCell = worksheet.Cells["A1"];
var endCell = worksheet.Cells["C100"];
var range = worksheet.Cells[startCell.Address + ":" + endCell.Address];
// Remove empty rows
for (int row = range.Start.Row; row <= range.End.Row; row++)
{
var rowIsEmpty = true;
for (int col = range.Start.Column; col <= range.End.Column; col++)
{
if (!string.IsNullOrEmpty(worksheet.Cells[row, col].Text))
{
rowIsEmpty = false;
break;
}
}
if (rowIsEmpty)
{
worksheet.DeleteRow(row);
}
}
// Save changes
package.Save();
}
mazoolagh
یک شنبه 17 تیر 1403, 11:57 صبح
بله، نیاز به نصب nuget package مربوط به خودش را دارد که بالای هر تکه کد نوشته ام.
اما الان که یکبار دیگر بررسی کردم متوجه شدم، تکه کد اول به اشتباه متد DeleteBlankRows (https://docs.aspose.com/cells/net/delete-blank-rows-and-columns-in-a-worksheet/) را از Aspose.Cells (https://products.aspose.com/cells/net/) بکار گرفتم که nuget package آن برای استفاده رایگان نیست
در کدهایی که هوش ساختگی پیشنهاد میده از این چیزها زیاد دیده میشه،
حتما باید تست کنین.
Amirpooyan
دوشنبه 18 تیر 1403, 00:08 صبح
از آنجایی که خودم مدتی هست که برای Export کردن یک سری داده در فایل Excel دارم از EPPlus استفاده می کنم، امروز یک نکته جدید بر خوردم که در کد روز گذشته خودم هم قابل استفاده است و گفتم به اشتراک بذارم، تا شاید به کار دیگران هم بیاد.
در VBA و یا Excel Interop برای بدست آوردن رنج استفاده شده در یک Worksheet از Worksheet.UsedRange استفاده می کردیم که Range استفاده شده در آن Worksheet بازگشت داده می شد. اینکار در EPPlus به این صورتیکه در این لینک توضیح داده شده (https://github.com/EPPlusSoftware/EPPlus/wiki/Dimension-(used-range))، انجام میشه.
خب با این تفاصیر من در مثال یا تکه کد قبلی به صورت Hard Code مقدار Used Range یا Range Of Cells رو در کد نوشته بودم، اما میشه این مثال کوچک را بهینه کرد و آن را اینگونه نوشت:
using OfficeOpenXml;
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
// Load your Excel file
using (var package = new ExcelPackage(new FileInfo(@"E:\Sample\YourFilePath.xlsx")))
{
var worksheet = package.Workbook.Worksheets[0]; // Assuming the first worksheet
// Get the used range
int startRow = worksheet.Dimension.Start.Row;
int endRow = worksheet.Dimension.End.Row;
int startColumn = worksheet.Dimension.Start.Column;
int endColumn = worksheet.Dimension.End.Column;
// Remove empty rows
for (int row = endRow; row >= startRow; row--)
{
bool rowIsEmpty = true;
for (int col = startColumn; col <= endColumn; col++)
{
var cellValue = worksheet.Cells[row, col].Text;
if (!string.IsNullOrWhiteSpace(cellValue))
{
rowIsEmpty = false;
break;
}
}
if (rowIsEmpty)
{
worksheet.DeleteRow(row);
}
}
// Save changes
package.Save();
}
safari_m4
چهارشنبه 20 تیر 1403, 20:30 عصر
با تشکر و سپاس
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.