【问题标题】:C# Create Excell Cell address from row and column number without Interop dllC# 从行号和列号创建 Excel 单元格地址,无需 Interop dll
【发布时间】:2017-06-07 09:34:42
【问题描述】:

我正在将 Excel 文件读入没有 Excel 互操作库的 DataTable。 我需要从 DataTable 中找出一些值及其相对于 excel 的地址。

示例我在dt.Rows[7].ItemArray[1].ToString()中找到了我的值,所以它的excel地址应该是“B8”。

就像我需要将 DataTable 单元格地址转换为 Excel 单元格地址。

这是我用来读取 Excel 文件的代码。

public DataTable getExcelSheet(string filePath, string sheetName)
    {
        var ds = new DataSet();
        var connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + filePath + ";Extended Properties=\"Excel 12.0;IMEX=1;HDR=NO;TypeGuessRows=0;ImportMixedTypes=Text\""; ;
        using (var conn = new OleDbConnection(connectionString))
        {
            conn.Open();

            var sheets = conn.GetOleDbSchemaTable(System.Data.OleDb.OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
            using (var cmd = conn.CreateCommand())
            {
                cmd.CommandText = "SELECT * FROM [" + sheetName + "] ";

                var adapter = new OleDbDataAdapter(cmd);
                ds = new DataSet();
                adapter.Fill(ds);
            }
            conn.Close();
        }
        return ds.Tables[0];
    }

这个功能是从数据表中找出值

public String getTablePosition(DataTable dataTable, String value)
        {
            string cell = "";
            for (int rows = 0; rows < (dataTable.Rows.Count < 100 ? dataTable.Rows.Count : 100); rows++)
            {
                for (int cols = 1; cols < (dataTable.Columns.Count < 100 ? dataTable.Columns.Count : 100); cols++)
                {
                    if (dataTable.Rows[rows].ItemArray[cols].ToString() == value)
                    {
                        return ""  //here cell I need cell address like B8 or CQ15
                    }
                }
            }
            return "";
        }

任何人都可以帮助我吗?我需要在不使用 Excel 互操作库的情况下执行此操作。

【问题讨论】:

  • 你想做什么?遍历一列?还是根据值选择一个单元格?
  • 查看函数 getTablePosition(),它将从数据表中找出值,当单元格匹配时,我希望它的地址以 Excel 的形式出现。示例我在 dt.Rows[7].ItemArray[1].ToString() 找到了值,而不是应该将其地址返回为 B8。
  • 更新您的查询SELECT * FROM [MySheet$A1:C20]。现在您知道了范围,因此您可以根据标题是启用还是禁用来计算列和行索引
  • 不可以,行列范围可以扩展。我需要根据列号和行号找出单元格地址
  • 你无法用你正在采取的方法实现你想要的。如果您不想使用 Interop,还有其他替代方案,例如 OpenXML、EEPlus

标签: c# excel datatable


【解决方案1】:

我创建了根据列号和行号创建单元格地址的函数。

     string[] Columns = new[] { "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z" };

 public String getExcelAddress(int row, int column)
        {
            string cellAddress = "";
            cellAddress = ((column / 26) - 1 >= 1 ? Columns[(column / 26) - 1] : "") + Columns[column % 26] + (row + 1);
            return cellAddress;
        }

        public String getTablePosition(DataTable dataTable, String value)
        {
            for (int rows = 0; rows < (dataTable.Rows.Count < 100 ? dataTable.Rows.Count : 100); rows++)
            {
                for (int cols = 1; cols < (dataTable.Columns.Count < 100 ? dataTable.Columns.Count : 100); cols++)
                {
                    if (dataTable.Rows[rows].ItemArray[cols].ToString().Trim() == value.Trim())
                    {
                        return getExcelAddress(rows, cols);
                    }
                }
            }
            return "";
        }

【讨论】:

  • 如果 A 列或任何前面的列为空,将给出错误的引用。如果HDR=Yes 和/或前几行为空白,也会给出错误的引用。
  • 什么是 HDR=Yes ?
  • 你可以阅读Excel connection strings
猜你喜欢
  • 2021-10-10
  • 1970-01-01
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 2017-05-19
  • 1970-01-01
  • 2016-09-11
  • 1970-01-01
相关资源
最近更新 更多