c# - इंटरऑप का उपयोग करते हुए अंतिम गैर खाली कॉलम और पंक्ति इंडेक्स Excel से प्राप्त करें




vb.net etl (4)

मैं इंटरऑप लाइब्रेरी का उपयोग करते हुए एक्सेल फ़ाइल से सभी अतिरिक्त रिक्त पंक्तियों और स्तंभों को हटाने की कोशिश कर रहा हूं।

मैंने इस प्रश्न का पालन किया है एक्स्ट फाइलों की खाली पंक्तियों और कॉलमों को इंटरॉप का उपयोग करने के लिए सबसे तेज़ तरीका है और मुझे यह उपयोगी लगता है।

लेकिन मेरे पास एक्सेल फाइलें हैं जिनमें डेटा का एक छोटा समूह होता है, लेकिन खाली पंक्तियों और स्तंभों की बहुत सारी चीज़ें हैं (पिछले गैर खाली पंक्ति (या स्तंभ) से वर्कशीट के अंत तक)

मैंने पंक्तियों और स्तंभों पर लूपिंग करने की कोशिश की लेकिन लूप घंटों का समय ले रहा है

मैं पिछले गैर-रिक्त पंक्ति और स्तंभ सूचकांक प्राप्त करने की कोशिश कर रहा हूं ताकि मैं एक खाली रेखा में पूरी खाली सीमा को हटा सकूं

XlWks.Range("...").EntireRow.Delete(xlShiftUp)

नोट: मैं सभी अतिरिक्त रिक्त स्थान (इस पंक्ति, या स्तंभ के बाद) को निकालने के लिए अंतिम पंक्ति वाली डेटा प्राप्त करने की कोशिश कर रहा हूं

कोई सुझाव?


आपको अंतिम गैर खाली पंक्ति और स्तंभ को इसके जैसा कुछ ढूंढने में सक्षम होना चाहिए:

with m_XlWrkSheet
lastRow = .UsedRange.Rows.Count
lastCol = .UsedRange.Columns.Count
end with

यह VB.NET है, लेकिन यह कम या ज्यादा काम करना चाहिए। वह पंक्ति 16 और कॉलम 10 (ऊपर आपकी तस्वीर के आधार पर) वापस आ जाएगी। तब आप उस सीमा का पता लगाने के लिए उपयोग कर सकते हैं जिसे आप एक पंक्ति में सभी हटाना चाहते हैं।


कई साल पहले मैंने एक एमएसडीएन कोड का नमूना बनाया है जो एक डेवलपर को एक कार्यपत्रक से अंतिम उपयोग की गई पंक्ति और स्तंभ प्राप्त करने की अनुमति देता है। मैंने इसे संशोधित किया, एक कक्षा पुस्तकालय में सभी आवश्यक कोड को एक विंडो के साथ रखा, जो ऑपरेशन को डेमो करने के लिए फ्रंट एंड का उपयोग करता है।

अंतर्निहित कोड Microsoft.Office.Interop.Excel का उपयोग करता है

Microsoft एक ड्राइव पर स्थान https://1drv.ms/u/s?AtGAgKKpqdWjiEGdBzWDCSCZAMaM

यहां मुझे एक एक्सेल फाइल में पहली शीट मिलती है, अंतिम उपयोग की गई पंक्ति और चेन प्राप्त करें और एक वैध सेल पता के रूप में पेश करें।

Private Sub cmdAddress1_Click(sender As Object, e As EventArgs) Handles cmdAddress1.Click
    Dim ops As New GetExcelColumnLastRowInformation
    Dim info = New UsedInformation
    ExcelInformationData = info.UsedInformation(FileName, ops.GetSheets(FileName))

    Dim SheetName As String = ExcelInformationData.FirstOrDefault.SheetName

    Dim cellAddress = (
        From item In ExcelInformationData
        Where item.SheetName = ExcelInformationData.FirstOrDefault.SheetName
        Select item.LastCell).FirstOrDefault

    MessageBox.Show($"{SheetName} - {cellAddress}")

End Sub

डेमो प्रोजेक्ट के भीतर मैं एक एक्सेल फ़ाइल के लिए सभी शीट भी प्राप्त करता हूं, उन्हें एक सूचीबॉक में प्रस्तुत करें। सूची बॉक्स से एक शीट का नाम चुनें और उस शीट की अंतिम पंक्ति और स्तंभ को एक वैध सेल पते में प्राप्त करें।

Private Sub cmdAddress_Click(sender As Object, e As EventArgs) Handles cmdAddress.Click
    Dim cellAddress =
        (
            From item In ExcelInformationData
            Where item.SheetName = ListBox1.Text
            Select item.LastCell).FirstOrDefault

    If cellAddress IsNot Nothing Then
        MessageBox.Show($"{ListBox1.Text} {cellAddress}")
    End If

End Sub

ऊपर दिए गए लिंक से समाधान खोलते समय पहली नज़र में देखेंगे कि बहुत सारे कोड हैं कोड इष्टतम है और सभी वस्तुओं को तुरंत जारी करेगा।


मान लें कि डेटा के साथ अंतिम कोने सेल है जे 16 - तो कॉलम के बाद में कोई डेटा नहीं, या पंक्तियों में 17 नीचे की ओर है आप वास्तव में उन्हें क्यों हटा रहे हैं? परिदृश्य क्या है और आप क्या हासिल करने की कोशिश कर रहे हैं? क्या यह हमारे स्वरूपण को साफ कर रहा है? क्या हमारे सूत्रों को साफ़ कर रहा है जो एक खाली स्ट्रिंग दिखाता है?

किसी भी मामले में, looping रास्ता नहीं है

नीचे दिए गए कोड एक रेंज से सभी सामग्री और सूत्रों और स्वरूपण को साफ़ करने के लिए रेंज ऑब्जेक्ट की साफ़ () विधि का उपयोग करने का एक तरीका दिखाता है। वैकल्पिक रूप से यदि आप वास्तव में उन्हें हटाना चाहते हैं, तो आप एक हिट में संपूर्ण आयताकार रेंज को हटाने के लिए Delete () विधि का उपयोग कर सकते हैं। लूपिंग से ज्यादा तेज़ हो जाएगा ...

//code uses variables declared appropriately as Excel.Range & Excel.Worksheet Using Interop library
int x;
int y;
// get the row of the last value content row-wise
oRange = oSheet.Cells.Find(What: "*", 
                           After: oSheet.get_Range("A1"),
                           LookIn: XlFindLookIn.xlValues,
                           LookAt: XlLookAt.xlPart, 
                           SearchDirection: XlSearchDirection.xlPrevious,
                           SearchOrder: XlSearchOrder.xlByRows);

if (oRange == null)
{
    return;
}
x = oRange.Row;

// get the column of the last value content column-wise
oRange = oSheet.Cells.Find(What: "*",
                           After: oSheet.get_Range("A1"),
                           LookIn: XlFindLookIn.xlValues, LookAt: XlLookAt.xlPart,
                           SearchDirection: XlSearchDirection.xlPrevious,
                           SearchOrder: XlSearchOrder.xlByColumns);
y = oRange.Column;

// now we have the corner (x, y), we can delete or clear all content to the right and below
// say J16 is the cell, so x = 16, and j=10

Excel.Range clearRange;

//set clearRange to ("K1:XFD1048576")
clearRange = oSheet.Range[oSheet.Cells[1, y + 1], oSheet.Cells[oSheet.Rows.Count, oSheet.Columns.Count]];
clearRange.Clear(); //clears all content, formulas and formatting
//clearRange.Delete(); if you REALLY want to hard delete the rows

//set clearRange to ("A17:J1048576")            
clearRange = oSheet.Range[oSheet.Cells[x + 1, 1], oSheet.Cells[oSheet.Rows.Count, y]];
clearRange.Clear(); //clears all content, formulas and formatting
//clearRange.Delete();  if you REALLY want to hard delete the columns

जैसा आपने कहा था कि आपने निम्न प्रश्न से शुरुआत की:

और आप "सभी अतिरिक्त रिक्त स्थान (इस पंक्ति, या स्तंभ के बाद) को हटाने के लिए अंतिम पंक्ति वाली डेटा प्राप्त करने की कोशिश कर रहे हैं "

तो मान लें कि आप स्वीकार किए गए उत्तर ( @ जॉन द्वारा दिए गए ) के साथ काम कर रहे हैं, ताकि आप अंतिम उपयोग की गई पंक्ति और स्तंभ प्राप्त करने के लिए कोड की कुछ पंक्ति जोड़ सकते हैं

रिक्त पंक्तियों को पूर्णांक rowsToDelete की सूची में संग्रहित किया जाता है

पिछली खाली पंक्ति से छोटी इंडेक्स के साथ पिछले गैर खाली पंक्तियों को प्राप्त करने के लिए आप निम्न कोड का उपयोग कर सकते हैं

List<int> NonEmptyRows = Enumerable.Range(1, rowsToDelete.Max()).ToList().Except(rowsToDelete).ToList();

और यदि NonEmptyRows.Max() < rowsToDelete.Max() अंतिम गैर खाली पंक्ति NonEmptyRows.Max() है। NonEmptyRows.Max() अन्यथा यह worksheet.Rows.Count है। NonEmptyRows.Max() और अंतिम उपयोग किए जाने के बाद कोई खाली पंक्तियां नहीं हैं

आखिरी गैर खाली कॉलम प्राप्त करने के लिए भी यही काम किया जा सकता है

कोड DeleteCols और DeleteRows फ़ंक्शंस में संपादित किया गया है:

    private static void DeleteRows(List<int> rowsToDelete, Microsoft.Office.Interop.Excel.Worksheet worksheet)
    {
        // the rows are sorted high to low - so index's wont shift

        List<int> NonEmptyRows = Enumerable.Range(1, rowsToDelete.Max()).ToList().Except(rowsToDelete).ToList();

        if (NonEmptyRows.Max() < rowsToDelete.Max())
        {

            // there are empty rows after the last non empty row

            Microsoft.Office.Interop.Excel.Range cell1 = worksheet.Cells[NonEmptyRows.Max() + 1,1];
            Microsoft.Office.Interop.Excel.Range cell2 = worksheet.Cells[rowsToDelete.Max(), 1];

            //Delete all empty rows after the last used row
            worksheet.Range[cell1, cell2].EntireRow.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftUp);


        }    //else last non empty row = worksheet.Rows.Count



        foreach (int rowIndex in rowsToDelete.Where(x => x < NonEmptyRows.Max()))
        {
            worksheet.Rows[rowIndex].Delete();
        }
    }

    private static void DeleteCols(List<int> colsToDelete, Microsoft.Office.Interop.Excel.Worksheet worksheet)
    {
        // the cols are sorted high to low - so index's wont shift

        //Get non Empty Cols
        List<int> NonEmptyCols = Enumerable.Range(1, colsToDelete.Max()).ToList().Except(colsToDelete).ToList();

        if (NonEmptyCols.Max() < colsToDelete.Max())
        {

            // there are empty rows after the last non empty row

            Microsoft.Office.Interop.Excel.Range cell1 = worksheet.Cells[1,NonEmptyCols.Max() + 1];
            Microsoft.Office.Interop.Excel.Range cell2 = worksheet.Cells[1,NonEmptyCols.Max()];

            //Delete all empty rows after the last used row
            worksheet.Range[cell1, cell2].EntireColumn.Delete(Microsoft.Office.Interop.Excel.XlDeleteShiftDirection.xlShiftToLeft);


        }            //else last non empty column = worksheet.Columns.Count

        foreach (int colIndex in colsToDelete.Where(x => x < NonEmptyCols.Max()))
        {
            worksheet.Columns[colIndex].Delete();
        }
    }




excel-interop