दिलचस्प पोस्ट
Jquery फ़ॉर्म पर पेज लोड को रोकें कोई भी डिस्प्ले बटन के साथ सबमिट करें सीएसएस का उपयोग करके प्रिंट करने के लिए पृष्ठभूमि छवि कैसे प्राप्त करें? EntityManager को उचित उपयोग समझने में संघर्ष पायथन 3 में बाइट को कन्वर्ट करने का सबसे अच्छा तरीका? कैसे "ठीक" जावास्क्रिप्ट में एक कस्टम ऑब्जेक्ट बनाएँ? रेल और रूबी 1.9 के साथ अमान्य multibyte char (US-ASCII) .NET इंटिजर बनाम Int16? जावा में SIGINT कैप्चर करें वर्ग mysqli_result का ऑब्जेक्ट को स्ट्रिंग में परिवर्तित नहीं किया जा सकता क्या मैं एक जेएमबुबार के साथ जेटबबेडपैन कर सकता हूं? टंकिनर पाठ बॉक्स विजेट से इनपुट कैसे प्राप्त करें? उद्देश्य सी में निजी तरीके, Xcode 4.3 में मुझे अब उन्हें अपने कार्यान्वयन फ़ाइल में घोषित करने की आवश्यकता नहीं है? पीडीओ को प्लेसहोल्डर के रूप में एक प्रश्न चिह्न की व्याख्या करने से कैसे रोकें? फायरबेज क्वेरी अगर बच्चे के बच्चे में मूल्य शामिल है ब्राउज़र, बेबल 6, गैपल – फैल ऑपरेटर पर अनपेक्षित टोकन

इंटरओप का उपयोग करते हुए एक्सेल फाइलों से रिक्त पंक्तियों और स्तंभों को हटाने के लिए सबसे तेज़ तरीका

मेरे पास बहुत सारी एक्सेल फाइलें हैं जिनमें डेटा शामिल है और इसमें खाली पंक्तियाँ और खाली कॉलम हैं I जैसे दिखाया bellow

एक्सेल पूर्वावलोकन

इंटरप का उपयोग करते हुए मैं Excel से पंक्तियों और स्तंभों को निकालने का प्रयास कर रहा हूं। मैं एक सरल winform आवेदन बनाने के लिए और निम्नलिखित कोड का इस्तेमाल किया है और यह ठीक काम करता है

Dim lstFiles As New List(Of String) lstFiles.AddRange(IO.Directory.GetFiles(m_strFolderPath, "*.xls", IO.SearchOption.AllDirectories)) Dim m_XlApp = New Excel.Application Dim m_xlWrkbs As Excel.Workbooks = m_XlApp.Workbooks Dim m_xlWrkb As Excel.Workbook For Each strFile As String In lstFiles m_xlWrkb = m_xlWrkbs.Open(strFile) Dim m_XlWrkSheet As Excel.Worksheet = m_xlWrkb.Worksheets(1) Dim intRow As Integer = 1 While intRow <= m_XlWrkSheet.UsedRange.Rows.Count If m_XlApp.WorksheetFunction.CountA(m_XlWrkSheet.Cells(intRow, 1).EntireRow) = 0 Then m_XlWrkSheet.Cells(intRow, 1).EntireRow.Delete(Excel.XlDeleteShiftDirection.xlShiftUp) Else intRow += 1 End If End While Dim intCol As Integer = 1 While intCol <= m_XlWrkSheet.UsedRange.Columns.Count If m_XlApp.WorksheetFunction.CountA(m_XlWrkSheet.Cells(1, intCol).EntireColumn) = 0 Then m_XlWrkSheet.Cells(1, intCol).EntireColumn.Delete(Excel.XlDeleteShiftDirection.xlShiftToLeft) Else intCol += 1 End If End While Next m_xlWrkb.Save() m_xlWrkb.Close(SaveChanges:=True) Marshal.ReleaseComObject(m_xlWrkb) Marshal.ReleaseComObject(m_xlWrkbs) m_XlApp.Quit() Marshal.ReleaseComObject(m_XlApp) 

लेकिन जब बड़ी एक्सेल फाइलों को साफ करते हैं, तो उसे बहुत समय लगता है। इस कोड को अनुकूलित करने के लिए कोई सुझाव? या इस एक्सेल फ़ाइलों को साफ करने के लिए एक और तरीका तेजी से? क्या एक ऐसा फ़ंक्शन है जो एक क्लिक में खाली पंक्तियों को हटा सकता है?

मुझे कोई समस्या नहीं है अगर उत्तर सी # का उपयोग कर रहे हैं

संपादित करें:

मैंने एक नमूना फ़ाइल नमूना फाइल अपलोड की है लेकिन सभी फाइलों की समान संरचना नहीं है

वेब के समाधान से एकत्रित समाधान "इंटरओप का उपयोग करते हुए एक्सेल फाइलों से रिक्त पंक्तियों और स्तंभों को हटाने के लिए सबसे तेज़ तरीका"

मुझे पता चला कि वर्कशीट बड़ा होने पर Excel कार्यपत्रक के माध्यम से पाशन करने में कुछ समय लग सकता है तो मेरे समाधान ने वर्कशीट में किसी भी पाशन से बचने की कोशिश की वर्कशीट के माध्यम से पाशन से बचने के लिए, मैंने इस्तेमाल की गई श्रेणी से लौटे हुए कोशिकाओं से एक 2 आयामी ऑब्जेक्ट सरणी usedRange :

 Excel.Range targetCells = worksheet.UsedRange; object[,] allValues = (object[,])targetCells.Cells.Value; 

रिक्त पंक्तियों और स्तंभों के अनुक्रमित पाने के लिए यह सरणी I लूप है। मैं 2 इंट लिस्ट करता हूं, एक को पंक्ति इंडेक्स को हटाने के लिए दूसरे को कॉलम इंडेक्स को हटाने के लिए रखता है।

 List<int> emptyRows = GetEmptyRows(allValues, totalRows, totalCols); List<int> emptyCols = GetEmptyCols(allValues, totalRows, totalCols); 

इन सूचियों को ऊपरी से निम्न तक क्रमबद्ध करने के लिए नीचे से नीचे पंक्तियों को हटाने और दाएं से बाएं स्तंभों को हटाने के लिए सॉर्ट किया जाएगा फिर प्रत्येक सूची के माध्यम से बस पाश करें और उचित पंक्ति / कोले हटाएं

 DeleteRows(emptyRows, worksheet); DeleteCols(emptyCols, worksheet); 

आखिरकार सभी खाली पंक्तियों और स्तंभों को हटा दिए जाने के बाद, मैं फ़ाइल को एक नया फ़ाइल नाम में सहेजें।

उम्मीद है की यह मदद करेगा।

संपादित करें:

UsedRange समस्या को संबोधित किया जैसे वर्कशीट के शीर्ष पर रिक्त पंक्तियाँ हैं, तो उन पंक्तियों को अब हटा दिया जाएगा इसके साथ ही यह शुरुआती डेटा के बाईं ओर के किसी भी खाली कॉलम को निकाल देगा। यह अनुक्रमण को ठीक से काम करने के लिए अनुमति देता है, भले ही डेटा प्रारंभ होने से पहले रिक्त पंक्तियाँ या कॉलम हो। यह प्रयुक्त रेंज में पहला सेल का पता लेकर पूरा हुआ, यह "$ A $ 1: $ D $ 4" के एक पते का होगा। यह ऑफसेट का उपयोग करने की अनुमति देगा यदि बाईं ओर शीर्ष और खाली कॉलम पर रिक्त पंक्तियां रहती हैं और हटाई नहीं जा रही हैं। इस मामले में मैं बस उन्हें हटा रहा हूं। शीर्ष से हटने के लिए पंक्तियों की संख्या प्राप्त करने के लिए पहले "$ A $ 4" पते पर गणना की जा सकती है जहां "4" पंक्ति पहले डेटा दिखाई देती है। इसलिए हमें शीर्ष 3 पंक्तियों को हटाना होगा। स्तंभ का पता "ए", "एबी" या "एएडी" के रूप में होता है, इसके लिए कुछ अनुवाद और एक कॉलम संख्या (जैसे 127) को एक एक्सेल कॉलम (जैसे एए) में परिवर्तित करने के लिए धन्यवाद था । निर्धारित करें कि बाईं ओर कितने स्तंभ हटाए जाने की आवश्यकता है।

 class Program { static void Main(string[] args) { Excel.Application excel = new Excel.Application(); string originalPath = @"H:\ExcelTestFolder\Book1_Test.xls"; Excel.Workbook workbook = excel.Workbooks.Open(originalPath); Excel.Worksheet worksheet = workbook.Worksheets["Sheet1"]; Excel.Range usedRange = worksheet.UsedRange; RemoveEmptyTopRowsAndLeftCols(worksheet, usedRange); DeleteEmptyRowsCols(worksheet); string newPath = @"H:\ExcelTestFolder\Book1_Test_Removed.xls"; workbook.SaveAs(newPath, Excel.XlSaveAsAccessMode.xlNoChange); workbook.Close(); excel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); Console.WriteLine("Finished removing empty rows and columns - Press any key to exit"); Console.ReadKey(); } private static void DeleteEmptyRowsCols(Excel.Worksheet worksheet) { Excel.Range targetCells = worksheet.UsedRange; object[,] allValues = (object[,])targetCells.Cells.Value; int totalRows = targetCells.Rows.Count; int totalCols = targetCells.Columns.Count; List<int> emptyRows = GetEmptyRows(allValues, totalRows, totalCols); List<int> emptyCols = GetEmptyCols(allValues, totalRows, totalCols); // now we have a list of the empty rows and columns we need to delete DeleteRows(emptyRows, worksheet); DeleteCols(emptyCols, worksheet); } private static void DeleteRows(List<int> rowsToDelete, Excel.Worksheet worksheet) { // the rows are sorted high to low - so index's wont shift foreach (int rowIndex in rowsToDelete) { worksheet.Rows[rowIndex].Delete(); } } private static void DeleteCols(List<int> colsToDelete, Excel.Worksheet worksheet) { // the cols are sorted high to low - so index's wont shift foreach (int colIndex in colsToDelete) { worksheet.Columns[colIndex].Delete(); } } private static List<int> GetEmptyRows(object[,] allValues, int totalRows, int totalCols) { List<int> emptyRows = new List<int>(); for (int i = 1; i < totalRows; i++) { if (IsRowEmpty(allValues, i, totalCols)) { emptyRows.Add(i); } } // sort the list from high to low return emptyRows.OrderByDescending(x => x).ToList(); } private static List<int> GetEmptyCols(object[,] allValues, int totalRows, int totalCols) { List<int> emptyCols = new List<int>(); for (int i = 1; i < totalCols; i++) { if (IsColumnEmpty(allValues, i, totalRows)) { emptyCols.Add(i); } } // sort the list from high to low return emptyCols.OrderByDescending(x => x).ToList(); } private static bool IsColumnEmpty(object[,] allValues, int colIndex, int totalRows) { for (int i = 1; i < totalRows; i++) { if (allValues[i, colIndex] != null) { return false; } } return true; } private static bool IsRowEmpty(object[,] allValues, int rowIndex, int totalCols) { for (int i = 1; i < totalCols; i++) { if (allValues[rowIndex, i] != null) { return false; } } return true; } private static void RemoveEmptyTopRowsAndLeftCols(Excel.Worksheet worksheet, Excel.Range usedRange) { string addressString = usedRange.Address.ToString(); int rowsToDelete = GetNumberOfTopRowsToDelete(addressString); DeleteTopEmptyRows(worksheet, rowsToDelete); int colsToDelete = GetNumberOfLeftColsToDelte(addressString); DeleteLeftEmptyColumns(worksheet, colsToDelete); } private static void DeleteTopEmptyRows(Excel.Worksheet worksheet, int startRow) { for (int i = 0; i < startRow - 1; i++) { worksheet.Rows[1].Delete(); } } private static void DeleteLeftEmptyColumns(Excel.Worksheet worksheet, int colCount) { for (int i = 0; i < colCount - 1; i++) { worksheet.Columns[1].Delete(); } } private static int GetNumberOfTopRowsToDelete(string address) { string[] splitArray = address.Split(':'); string firstIndex = splitArray[0]; splitArray = firstIndex.Split('$'); string value = splitArray[2]; int returnValue = -1; if ((int.TryParse(value, out returnValue)) && (returnValue >= 0)) return returnValue; return returnValue; } private static int GetNumberOfLeftColsToDelte(string address) { string[] splitArray = address.Split(':'); string firstindex = splitArray[0]; splitArray = firstindex.Split('$'); string value = splitArray[1]; return ParseColHeaderToIndex(value); } private static int ParseColHeaderToIndex(string colAdress) { int[] digits = new int[colAdress.Length]; for (int i = 0; i < colAdress.Length; ++i) { digits[i] = Convert.ToInt32(colAdress[i]) - 64; } int mul = 1; int res = 0; for (int pos = digits.Length - 1; pos >= 0; --pos) { res += digits[pos] * mul; mul *= 26; } return res; } } 

2 संपादित करें: परीक्षण के लिए मैंने एक ऐसा तरीका बनाया जो कार्यपत्रक के माध्यम से छोरता है और मेरे कोड के साथ तुलना करता है जो ऑब्जेक्ट सरणी के माध्यम से छोर देता है। यह एक महत्वपूर्ण अंतर दिखाता है

यहां छवि विवरण दर्ज करें

कार्यपत्रक के माध्यम से लूप की विधि और खाली पंक्तियों और स्तंभों को हटा दें।

 enum RowOrCol { Row, Column }; private static void ConventionalRemoveEmptyRowsCols(Excel.Worksheet worksheet) { Excel.Range usedRange = worksheet.UsedRange; int totalRows = usedRange.Rows.Count; int totalCols = usedRange.Columns.Count; RemoveEmpty(usedRange, RowOrCol.Row); RemoveEmpty(usedRange, RowOrCol.Column); } private static void RemoveEmpty(Excel.Range usedRange, RowOrCol rowOrCol) { int count; Excel.Range curRange; if (rowOrCol == RowOrCol.Column) count = usedRange.Columns.Count; else count = usedRange.Rows.Count; for (int i = count; i > 0; i--) { bool isEmpty = true; if (rowOrCol == RowOrCol.Column) curRange = usedRange.Columns[i]; else curRange = usedRange.Rows[i]; foreach (Excel.Range cell in curRange.Cells) { if (cell.Value != null) { isEmpty = false; break; // we can exit this loop since the range is not empty } else { // Cell value is null contiue checking } } // end loop thru each cell in this range (row or column) if (isEmpty) { curRange.Delete(); } } } 

फिर दो तरीकों के परीक्षण / समय के लिए एक मुख्य

 enum RowOrCol { Row, Column }; static void Main(string[] args) { Excel.Application excel = new Excel.Application(); string originalPath = @"H:\ExcelTestFolder\Book1_Test.xls"; Excel.Workbook workbook = excel.Workbooks.Open(originalPath); Excel.Worksheet worksheet = workbook.Worksheets["Sheet1"]; Excel.Range usedRange = worksheet.UsedRange; // Start test for looping thru each excel worksheet Stopwatch sw = new Stopwatch(); Console.WriteLine("Start stopwatch to loop thru WORKSHEET..."); sw.Start(); ConventionalRemoveEmptyRowsCols(worksheet); sw.Stop(); Console.WriteLine("It took a total of: " + sw.Elapsed.Milliseconds + " Miliseconds to remove empty rows and columns..."); string newPath = @"H:\ExcelTestFolder\Book1_Test_RemovedLoopThruWorksheet.xls"; workbook.SaveAs(newPath, Excel.XlSaveAsAccessMode.xlNoChange); workbook.Close(); Console.WriteLine(""); // Start test for looping thru object array workbook = excel.Workbooks.Open(originalPath); worksheet = workbook.Worksheets["Sheet1"]; usedRange = worksheet.UsedRange; Console.WriteLine("Start stopwatch to loop thru object array..."); sw = new Stopwatch(); sw.Start(); DeleteEmptyRowsCols(worksheet); sw.Stop(); // display results from second test Console.WriteLine("It took a total of: " + sw.Elapsed.Milliseconds + " Miliseconds to remove empty rows and columns..."); string newPath2 = @"H:\ExcelTestFolder\Book1_Test_RemovedLoopThruArray.xls"; workbook.SaveAs(newPath2, Excel.XlSaveAsAccessMode.xlNoChange); workbook.Close(); excel.Quit(); System.Runtime.InteropServices.Marshal.ReleaseComObject(workbook); System.Runtime.InteropServices.Marshal.ReleaseComObject(excel); Console.WriteLine(""); Console.WriteLine("Finished testing methods - Press any key to exit"); Console.ReadKey(); } 

ओपी अनुरोध के अनुसार 3 संपादित करें … मैं ओपी कोड से मेल करने के लिए कोड को अपडेट और बदल दिया। इसके साथ मुझे कुछ रोचक परिणाम मिले। निचे देखो।

मैंने आपके द्वारा उपयोग किए जा रहे कार्यों से मिलान करने के लिए कोड बदल दिया है … संपूर्ण रोर और गणनाए नीचे दिए गए कोड में मुझे पता चला कि यह बहुत पहले से बना है कुछ परीक्षण चल रहा है I found below code 800 + मिलीसेकेंड निष्पादन समय में था। हालांकि एक सूक्ष्म परिवर्तन ने एक बड़ा अंतर बना दिया

रेखा पर:

 while (rowIndex <= worksheet.UsedRange.Rows.Count) 

यह बहुत कुछ धीमा कर रहा है यदि आप UsedRang के लिए एक रेंज चर बनाते हैं और regrabbibg नहीं रखते हैं, तो उस समय के प्रत्येक पुनरावृत्ति के साथ एक बड़ा अंतर बना देगा। इसलिए … जब मैं लूप को बदलता हूं …

 Excel.Range usedRange = worksheet.UsedRange; int rowIndex = 1; while (rowIndex <= usedRange.Rows.Count) and while (colIndex <= usedRange.Columns.Count) 

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

 private static void RemoveEmptyRowsCols3(Excel.Worksheet worksheet) { //Excel.Range usedRange = worksheet.UsedRange; // <- using this variable makes the while loop much faster int rowIndex = 1; // delete empty rows //while (rowIndex <= usedRange.Rows.Count) // <- changing this one line makes a huge difference - not grabbibg the UsedRange with each iteration... while (rowIndex <= worksheet.UsedRange.Rows.Count) { if (excel.WorksheetFunction.CountA(worksheet.Cells[rowIndex, 1].EntireRow) == 0) { worksheet.Cells[rowIndex, 1].EntireRow.Delete(Excel.XlDeleteShiftDirection.xlShiftUp); } else { rowIndex++; } } // delete empty columns int colIndex = 1; // while (colIndex <= usedRange.Columns.Count) // <- change here also while (colIndex <= worksheet.UsedRange.Columns.Count) { if (excel.WorksheetFunction.CountA(worksheet.Cells[1, colIndex].EntireColumn) == 0) { worksheet.Cells[1, colIndex].EntireColumn.Delete(Excel.XlDeleteShiftDirection.xlShiftToLeft); } else { colIndex++; } } } 

अद्यतन करें @ हैडी द्वारा

बेहतर प्रदर्शन प्राप्त करने के लिए आप DeleteRows और 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(); } } 

Interop का उपयोग करते हुए एक्सेल से पिछला गैर रिक्त स्तंभ और पंक्ति सूचकांक पर मेरा जवाब जांचें

शायद कुछ विचार करने के लिए:

 Sub usedRangeDeleteRowsCols() Dim LastRow, LastCol, i As Long LastRow = Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByRows).Row LastCol = Cells.Find(What:="*", SearchDirection:=xlPrevious, SearchOrder:=xlByColumns).Column For i = LastRow To 1 Step -1 If WorksheetFunction.CountA(Range(Cells(i, 1), Cells(i, LastCol))) = 0 Then Cells(i, 1).EntireRow.Delete End If Next For i = LastCol To 1 Step -1 If WorksheetFunction.CountA(Range(Cells(1, i), Cells(LastRow, i))) = 0 Then Cells(1, i).EntireColumn.Delete End If Next End Sub 

मुझे लगता है कि मूल कोड में समान कार्य की तुलना में दो दक्षताएं हैं I सबसे पहले, एक्सेल की अविश्वसनीय प्रयुक्त संपत्ति का उपयोग करने के बजाय, हम अंतिम मान पाते हैं और वास्तविक उपयोग की गई श्रेणी में केवल पंक्तियों और स्तंभों को स्कैन करते हैं।

दूसरा, वर्कशीट गिनती कार्य फिर से केवल वास्तविक उपयोग की सीमा के भीतर ही कार्य करता है – उदाहरण के लिए रिक्त पंक्तियों की खोज करते समय हम केवल इस्तेमाल किए गए कॉलम की सीमा में (बजाय। .EntireRow ) देखते हैं।

लूप के लिए पीछे की ओर काम करते हैं क्योंकि, उदाहरण के लिए, हर बार एक पंक्ति हटाई जाती है, डेटा परिवर्तनों का निम्न पंक्ति पता पीछे काम करने का अर्थ है "डेटा पर काम करने के लिए" के पंक्ति पते बदल नहीं सकते हैं।

मेरी राय में सबसे ज्यादा खपत वाला भाग खाली पंक्तियों और स्तंभों की गणना और खोजना जा सकता है।

इसके बारे में: http://www.howtogeek.com/206696/how-to-quickly-and-easily-delete-blank-rows-and-columns-in-excel-2013/

संपादित करें:

व्हाट अबाउट:

 m_XlWrkSheet.Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete m_XlWrkSheet.Rows("1:1").SpecialCells(xlCellTypeBlanks).EntireColumn.Delete 

नमूना डेटा परिणाम पर परीक्षण किया गया ठीक दिखता है, बेहतर प्रदर्शन (VBA से परीक्षण किया गया है, लेकिन अंतर बहुत बड़ा है)।

अद्यतन करें:

14 क पंक्तियों (नमूना डेटा से बने) के साथ नमूना एक्सेल पर परीक्षण किया गया मूल कोड ~ 30 s, यह संस्करण <1s

मुझे पता है कि सबसे आसान तरीका गैर रिक्त कोशिकाओं को छिपाने और दृश्यमानों को हटाना है:

 var range = m_XlWrkSheet.UsedRange; range.SpecialCells(XlCellType.xlCellTypeConstants).EntireRow.Hidden = true; range.SpecialCells(XlCellType.xlCellTypeVisible).Delete(XlDeleteShiftDirection.xlShiftUp); range.EntireRow.Hidden = false; 

तेजी से विधियां किसी भी चीज़ को हटाना नहीं है, लेकिन गैर-रिक्त क्षेत्रों को स्थानांतरित करने के लिए (कट + पेस्ट)

सबसे तेज़ इंटरप रास्ता (फाइल खोलने के बिना तेज और जटिल तरीके हैं) सरणी में सभी मूल्यों को प्राप्त करना, सरणी में मानों को स्थानांतरित करना, और मूल्यों को वापस करना है:

 object[,] values = m_XlWrkSheet.UsedRange.Value2 as object[,]; // some code here (the values start from values[1, 1] not values[0, 0]) m_XlWrkSheet.UsedRange.Value2 = values; 

आप वर्कशीट में एक एडीओ कनेक्शन खोल सकते हैं, फ़ील्ड की सूची प्राप्त कर सकते हैं, एक एसक्यूएल कथन जारी कर सकते हैं जिसमें केवल ज्ञात फ़ील्ड शामिल हैं, और ज्ञात क्षेत्रों में कोई मान के साथ रिकॉर्ड भी नहीं निकाल सकते हैं।