将TableStyle应用于QueryTable

时间:2014-05-21 12:06:08

标签: c# excel excel-2010 netoffice

我可以使用查询表:

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应用于它。

有人可以帮忙吗?

1 个答案:

答案 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();
        }