Jump to content
Xtreme .Net Talk

Recommended Posts

Posted

Hi all,

 

I'm writing a small tool in c# that need to read data from a given Excel table. Each column header is assigned with a name as a Named Range. And I need to read thru these names to know which information are stored in each columns.

 

For example in $AR$132, I have a range namely "Txn\10_1\TxnDT", RefersTo: Transaction!$AR$132:$AR$132 which refer to transaction date; In $AS$132, named "Txn\10_1\Txntype", RefersTo: Transaction!$AS$132 which refer to transaction type. And there is another named range which tells the range of all columns. eg. "Txn\10_1\headers" ReferTo $AR$132:$AY$132.

 

I wrote the following code to loop thru the headers and read the columns

 

Excel.Application excel;
           Excel.Workbook wb;
           Excel.Worksheet ws;
           object missing = System.Reflection.Missing.Value;

           excel = new Excel.Application();
           wb = excel.Workbooks.Open(args[0], Type.Missing, Type.Missing,      Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing);

           try
           {
               ws = (Excel.Worksheet)wb.Worksheets.get_Item("Sheet1");
               Excel.Range headerRange;
               headerRange = wb.Names.Item("Txn\\10_1\\headers").RefersToRange;
               foreach (Excel.Range col in headerRange.Columns)
               {
                   int i = 1;
                   Console.WriteLine("[" + i.ToString() + "] " + col.Cells[1, i].Value.ToString() + " = " + GetName(col.Cells[1, i]));
                   i++;
               }
           }
           catch (System.Runtime.InteropServices.COMException e)
           {
               Console.WriteLine(e.Message);
           }
           finally
           {                
               ws = null;
               wb.Close(false, Type.Missing, Type.Missing);
               excel.Quit();
               excel = null;
               GC.Collect();
               GC.WaitForPendingFinalizers();
               Console.WriteLine("Press any key to terminate...");
               Console.ReadLine();
           }

       public static string GetName(Excel.Range range)
       {
           try
           {
               if (range.Name != null)
               {
                   Excel.Name name = range.Name as Excel.Name;

                   if (name.Name != null || name.Name.Length != 0)
                   {
                       return name.Name;
                   }
                   return string.Empty;
               }
               return string.Empty;
           }
           catch (Exception e)
           {
               return string.Empty;
           }
       }

 

The code works fine if the range.ReferTo only specified with a single cell, eg. $AS$132 but fails if range.ReferTo is $AR$132:$AR$132. Even though they both are refer to a single cell.

 

How can I get the range name of $AR$132:$AR$132?

 

Thank you in advance.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...