我可以使用查询表:
var sheet = (_excel.ActiveSheet as Excel.Worksheet);
var rng = sheet.Range("A1");
var qt = sheet.QueryTables.Add("ODBC;...", rng, "SELECT * FROM myTable");
qt.Refresh();
这将正确导入数据(例如日期实际显示为日期等...)。但是当我尝试访问ListObject以应用TableStyle时,我得到了一个异常。
现在,如果我添加一个列表对象,如:
var sheet = (_excel.ActiveSheet as Excel.Worksheet);
var qt = sheet.ListObjects.Add(
Excel.Enums.XlListObjectSourceType.xlSrcQuery,
"ODBC;...",
null,
Excel.Enums.XlYesNoGuess.xlNo,
rng,
"TableStyleMedium9").QueryTable;
qt.CommandType = Excel.Enums.XlCmdType.xlCmdSql;
qt.CommandText = "SELECT * FROM myTable";
qt.Refresh();
查询中的日期显示为十进制数字而不是日期......
我之后可以格式化列,但问题是我不会真正知道正在运行的查询,因为用户在运行时键入了这个,所以我更愿意让Excel执行此操作。
基本上,我想要的是使用第一段代码并将TableStyle应用于它。
有人可以帮忙吗?
答案 0 :(得分:-1)
这不会着色,但它确实将数据组织到数据表中,当您使用断点进行调试并在数据表填充后将鼠标悬停在数据表上时,您可以看到组织到列中的所有数据。然后,您可以使用数据表将其绑定到win表单元素上的数据网格视图。
我将此DataTable DataTable = new DataTable();
作为顶部的全局字段。
OleDbConnection conn = new OleDbConnection();
//This is making a connection to the excel file, don't worry about this I think you did it differently.
conn.ConnectionString = @"Provider=Microsoft.ACE.OLEDB.12.0;" + "Data Source=" + stringFileName + ";" + "Extended Properties=\"Excel 12.0;HDR=Yes;\""; OleDbCommand cmd = new OleDbCommand
("SELECT * FROM [" + sheetFromTo + "]", conn);
DataSet dataSet1 = new DataSet();
OleDbDataAdapter dataAdapter = new OleDbDataAdapter(cmd);
try
{
conn.Open();//opens connection
dataSet1.Clear();//empties, incase they refill it later
dataAdapter.SelectCommand = cmd;//calls the cmd up above
dataAdapter.Fill(dataSet1);//fills the dataset
dataGridView1.DataSource = dataSet1.Tables[0];//puts the dataset in the dataGridview
//important** creates a datatable from the dataset, most of our work with the server is with this datatable
DataTable dataTable = dataSet1.Tables[0];
DataTable = dataTable;
}
catch (Exception ex)
{
}
finally
{
conn.Close();
}