更新2
string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", EXCELFILENAME);
string testCaseName = "test_case_2";
string query = String.Format("SELECT * from [{0}$] WHERE columns={1}", workbookName, testCaseName);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet); //<<ERROR
DataTable myTable = dataSet.Tables[0];
错误: 没有给出一个或多个必需参数的值。
更新结束
更新
string connectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=""Excel 8.0;HDR=YES;IMEX=1;""", EXCELFILENAME);
string query = String.Format("select * from [{0}$]", workbookName);
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(query, connectionString);
DataSet dataSet = new DataSet();
dataAdapter.Fill(dataSet);
DataTable myTable = dataSet.Tables[0];
如何从单元格中读取数据并将其存储在数组/字符串中。我已经完成了阅读工作表,但找不到更好的做法
所以这里的excel表格如下:
我应该能够在我的案例test_case_1或test_case_2等中传递列...并读取该特定行的列....
答案 0 :(得分:2)
我建议你看看LinqToExcel。它使得在.NET中查询Excel非常容易。
var book = new LinqToExcel.ExcelQueryFactory(@"E:\Temporary\Workbook.xlsx");
var current_test_case = "Test_case_1";
var query =
from row in book.Worksheet("Sheet1")
let columns = row["columns"].Cast<string>()
where columns == current_test_case
select new
{
id = row["id"].Cast<int>(),
name = row["name"].Cast<string>(),
caption = row["caption"].Cast<string>(),
date = row["date"].Cast<DateTime>(),
success = row["success"].Cast<bool>(),
};
答案 1 :(得分:0)
嗨Abu Hamzah,因为您的要求只读取了代码所在的列,这是一个用于读取Excel数据的consol应用程序
class Program
{
internal static ILog logger = LogManager.GetLogger(typeof(Program));
static void Main(string[] args)
{
log4net.Config.XmlConfigurator.Configure();
string firstName, lastName, dob, lexisNexisID;
string filePath = @"yor directory path\your file name";
ExcelProvider provider = ExcelProvider.Create(filePath, "Sheet1");
foreach (ExcelRow row in (from x in provider select x))
{
Console.WriteLine("{0}", row.GetString(1));
/* the row.Getstring(index) the index is for your column you mey select morcolume as Console.WriteLine("{0}/t{1}", row.GetString(0),row.Getstring(1)); */
}
}
}
public class ExcelRow
{
List<object> columns;
public ExcelRow()
{
columns = new List<object>();
}
internal void AddColumn(object value)
{
columns.Add(value);
}
public object this[int index]
{
get { return columns[index]; }
}
public string GetString(int index)
{
if (columns[index] is DBNull)
{
return null;
}
return columns[index].ToString();
}
public int Count
{
get { return this.columns.Count; }
}
}
public class ExcelProvider : IEnumerable<ExcelRow>
{
private string sheet;
private string filePath;
private List<ExcelRow> rows;
public ExcelProvider()
{
rows = new List<ExcelRow>();
}
public static ExcelProvider Create(string filePath, string sheet)
{
ExcelProvider provider = new ExcelProvider();
provider.sheet = sheet;
provider.filePath = filePath;
return provider;
}
private void Load()
{
string connectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties= ""Excel 12.0;HDR=YES;""";
connectionString = string.Format(connectionString, filePath);
rows.Clear();
using (OleDbConnection conn = new OleDbConnection(connectionString))
{
try
{
conn.Open();
}
catch (Exception ex)
{
}
using (OleDbCommand cmd = conn.CreateCommand())
{
cmd.CommandText = "select * from [" + sheet + "$]";
using (OleDbDataReader reader = cmd.ExecuteReader())
{
while (reader.Read())
{
ExcelRow newRow = new ExcelRow();
for (int count = 0; count < reader.FieldCount; count++)
{
newRow.AddColumn(reader[count]);
}
rows.Add(newRow);
}
}
}
}
}
public IEnumerator<ExcelRow> GetEnumerator()
{
Load();
return rows.GetEnumerator();
}
System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
{
Load();
return rows.GetEnumerator();
}
}
答案 2 :(得分:0)
关于过滤。
当您使用OleDb进行数据检索时,没有什么能阻止您使用更高级的SQL:
string testCaseName = "Test_case_1
string query = String.Format("SELECT * from [{0}$] WHERE columns=\"{1}\"", workbookName, testCaseName);
您可以使用列的名称进行过滤。在您的情况下,过滤器位于列字段中。 (顺便说一下,这是一个令人困惑的名字)
据我记得,表格的标题必须在第一行,您可能需要将表格向上移动一行。