none
使用 Microsoft.Office.Interop.Excel 读写Excel 时能不能直接根据标题列名称来定位选取?

    问题

  • 比如说,标题列里面有 directory 列,我不知道它在第几行,但是我知道它名称,能不能利用这个名称直接选取这一列...我好像就查到利用 A1 B1 或者数字来选取列的...

    我现在的办法可能是遍历所有标题列...

    PS:还有相关这些资料好难找,不知道有什么全的地方吗?官网上的示例也太少了...

    2016年5月9日 8:17

答案

  • 以我的了解,用A1,B1是可以的,但用directory列名,如果有多个相同的列名,则会找到多列,不允许这样操作。

    读值,

    excelWorksheet.Cells[rowindex, columnindex].Value = "test";

    取值

    string result = excelWorksheet.Cells[rowindex, columnindex].Value ;

    可以换一种思路,考虑第一次启动时,建立一个列名称(directory)与列标识(A1,B1)的字典,这样后面可根据这个字典,由列名获取列的位置

    参考下面的代码

    Excel.Application xlApp = new Excel.Application();
         Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("workbookname");
         Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1]; // assume it is the first sheet
         int columnCount = xlWorksheet.UsedRange.Columns.Count;
         List<string> columnNames = new List<string>();  
         for (int c = 1; c < columnCount; c++)
         {
             if (xlWorksheet.Cells[1, c].Value2 != null)
             {
                 string columnName = xlWorksheet.Columns[c].Address;
                 Regex reg = new Regex(@"(\$)(\w*):");
                 if (reg.IsMatch(columnName))
                 {
                     Match match = reg.Match(columnName);            
                     columnNames.Add(match.Groups[2].Value);
                 }                     
            }
         }

    还有一种方法,根据值来获取列位置,参考下面的代码

    object misValue = System.Reflection.Missing.Value;

    Microsoft.Office.Interop.Excel.Range xlRange = xlWorkSheet.get_Range("A2", "A2");

    Microsoft.Office.Interop.Excel.Range xlFound = xlRange.EntireRow.Find("ID Number",
    misValue, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
    Excel.XlSearchOrder.xlByColumns, Excel.XlSearchDirection.xlNext,
    true, misValue, misValue);

    //~~> Check if a range was returned
    if (!(xlFound == null))
    {
        int ID_Number = xlFound.Column;
        MessageBox.Show(ID_Number.ToString());
    }


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms


    2016年5月9日 8:50

全部回复

  • 以我的了解,用A1,B1是可以的,但用directory列名,如果有多个相同的列名,则会找到多列,不允许这样操作。

    读值,

    excelWorksheet.Cells[rowindex, columnindex].Value = "test";

    取值

    string result = excelWorksheet.Cells[rowindex, columnindex].Value ;

    可以换一种思路,考虑第一次启动时,建立一个列名称(directory)与列标识(A1,B1)的字典,这样后面可根据这个字典,由列名获取列的位置

    参考下面的代码

    Excel.Application xlApp = new Excel.Application();
         Excel.Workbook xlWorkbook = xlApp.Workbooks.Open("workbookname");
         Excel.Worksheet xlWorksheet = xlWorkbook.Sheets[1]; // assume it is the first sheet
         int columnCount = xlWorksheet.UsedRange.Columns.Count;
         List<string> columnNames = new List<string>();  
         for (int c = 1; c < columnCount; c++)
         {
             if (xlWorksheet.Cells[1, c].Value2 != null)
             {
                 string columnName = xlWorksheet.Columns[c].Address;
                 Regex reg = new Regex(@"(\$)(\w*):");
                 if (reg.IsMatch(columnName))
                 {
                     Match match = reg.Match(columnName);            
                     columnNames.Add(match.Groups[2].Value);
                 }                     
            }
         }

    还有一种方法,根据值来获取列位置,参考下面的代码

    object misValue = System.Reflection.Missing.Value;

    Microsoft.Office.Interop.Excel.Range xlRange = xlWorkSheet.get_Range("A2", "A2");

    Microsoft.Office.Interop.Excel.Range xlFound = xlRange.EntireRow.Find("ID Number",
    misValue, Excel.XlFindLookIn.xlValues, Excel.XlLookAt.xlPart,
    Excel.XlSearchOrder.xlByColumns, Excel.XlSearchDirection.xlNext,
    true, misValue, misValue);

    //~~> Check if a range was returned
    if (!(xlFound == null))
    {
        int ID_Number = xlFound.Column;
        MessageBox.Show(ID_Number.ToString());
    }


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms


    2016年5月9日 8:50
  • 你好,谢谢你热忱的帮助。

    最近在搬家,没能及时的回复。

    另外,像这类的资料怎么查?一开始代码里的value2属性我都不熟悉,还是查了才知道,,感觉微软官网这块没有示例,光给些说明还是有些困难。

    我想问问有没有电子书或者手册资料系统全面地介绍这一块?

    就目前来说,,

    Excel.Worksheet ws = (Excel.Worksheet)wb.Worksheets.get_Item(1);
    
    

    ws.Cells.get_Range("A1""C5")

    ws.Rang("A1""C5").Cells

    是否是等同的?

    • 已编辑 张天晴 2016年5月16日 6:34 补充
    2016年5月16日 6:28
  • VSTO开发指南

    Visual Studio Tools for Office Using C# with Excel, Word, Outlook, and InfoPath.chm 等资料可以参考一下


    专注于.NET MIS开发框架,C/S架构,SQL Server + ORM(LLBL Gen Pro) + Infragistics WinForms

    2016年5月16日 6:38
  • 十分感谢你的帮助。

    现在excel怎么没有abc列了,都是数字来表示了。。


    2016年5月18日 8:14