Apply a TableStyle to a QueryTable

本文关键字:QueryTable to TableStyle Apply | 更新日期: 2023-09-27 18:04:20

我可以使用查询表:

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

有人能帮忙吗?

Apply a TableStyle to a QueryTable

这并没有着色,但它确实将数据组织到一个数据表中,当您使用断点进行调试并在填充完数据表后将鼠标移到数据表上时,您可以看到所有数据都被组织到列中。然后你可以对这个数据表做的就是将它绑定到win forms元素上的一个数据网格视图。

我将这个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();
        }