【发布时间】: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